views:

412

answers:

2

I'm using Dojo Drag and Drop. When a user adds an item to a container (div dojoType='dojo.dnd.Source') then I need to get that data into a form so I can later process it on a server when the user submits the whole page. That part is working. Then to remove an item, I allow them to drag/drop an item to a "trash" container. I'm having difficult conceptualizing how to remove the item from the hidden fields. I already have subscribe/event code to call the following two functions.

Can you let me know if there is better way to do the removeGoalFromHiddenFields function? There can be many "subgoal" items.

I'm about to begin testing with what I have below, but I have some doubts about it.

Thanks,

Neal Walters

   function addGoalToHiddenFields( goalText){
      var field = document.createElement("input");
      field.setAttribute("type","hidden");
      field.setAttribute("value",goalText);
      field.setAttribute("name","subgoal");

      //add new hidden-element to the existing form
      document.getElementById("form1").appendChild(field);
   }

   function removeGoalFromHiddenFields( goalText){

      //remove hidden field 
      nodes = document.getElementById("form1")
      for (i=0;i<nodes.length ;i++ )
        {
          var pos = nodes[i].innerHTML.IndexOf(goalText)
          if (pos > 0)
          {
              nodes.removeChild(node[i]);

          }
        }

}

Also, can I do this instead: nodes = document.getElementById("subgoal")

+2  A: 

I'm guessing what you want here is the functionality of dojo.query.

Try something like:

dojo.query("#form1 input[value=\"" + goalText + "\"]").forEach(function(field) {
    field.parentNode.removeChild(field)
});
Rakesh Pai
Thanks - that was a very elegant solution. I've been learning more about Dojo as-needed, and I had not yet opened the chapter on dojo.query. Also - your answer needs one more double quote like this: "\"]")
NealWalters
Oh. Thanks for pointing out the missing quote. Fixed my answer.
Rakesh Pai
+1  A: 

field.setAttribute("type","hidden");

Don't use setAttribute on HTML documents. There are many bugs in it on IE. Use the normal DOM-HTML properties, which are also easier to read:

field.type= 'hidden';

var pos = node[i].innerHTML.IndexOf(goalText)

Searching through HTML markup for a value is silly, and won't work when goalText contains a character like ‘<’ or ‘&’ that HTML will escape.

For the code above, it looks like nodes[i] should be one of the <input> elements you appended there, in which case innerHTML is no good as it will only search the contents of the input, which is nothing as input is an empty element. Instead, look at the value property you put there:

var input= nodes[i];
if (input.name=='subgoal' && input.value==goalText)
    input.parentNode.removeChild(input);

Also, can I do this instead: nodes = document.getElementById("subgoal")

No, as your subgoal elements have no IDs. Either get by name:

var subgoals= form.getElementsByName('subgoal');

(which is the same as DOM-0:)

var subgoals= form.elements.subgoal;

or, add an ID to each subgoal to help you retrieve it later:

field.id= 'id-'+goalText;

the above won't work, again, if you can have special characters in goalText.

Alternatively, retain your own lookup in JavaScript rather than putting everything in the DOM:

var subgoalfields= {};
...
// on add
subgoalfields[goalText]= field;
...
// on remove
subgoalfields[goalText].parentNode.removeChild(subgoalfields[goalText]);
delete subgoalfields[goalText];
bobince
Thanks for the warning about setAttribute in IE, I have changed that. I know I didn't limit my question to Dojo - but Rakesh answer using dojo.query worked great.
NealWalters