JavaScript RemoveChild逻辑/问题

时间:2009-10-12 16:33:38

标签: javascript dojo removechild

我正在使用Dojo Drag and Drop。当用户将一个项添加到容器(div dojoType ='dojo.dnd.Source')时,我需要将该数据放入一个表单中,以便稍后当用户提交整个页面时我可以在服务器上处理它。那部分是有效的。 然后删除一个项目,我允许他们将项目拖放到“垃圾”容器。 我很难概念化如何从隐藏字段中删除项目。 我已经有订阅/事件代码来调用以下两个函数。

如果有更好的方法来执行removeGoalFromHiddenFields功能,您能告诉我吗? 可以有许多“subgoal”项目。

我即将开始测试下面的内容,但我对它有些怀疑。

谢谢,

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]);

             }
           }

}

另外,我可以这样做:           nodes = document.getElementById(“subgoal”)

2 个答案:

答案 0 :(得分:2)

我猜你想要的是dojo.query的功能。

尝试类似:

dojo.query("#form1 input[value=\"" + goalText + "\"]").forEach(function(field) {
    field.parentNode.removeChild(field)
});

答案 1 :(得分:1)

  

field.setAttribute( “类型”, “隐藏”);

不要在HTML文档上使用setAttribute。 IE上有很多错误。使用普通的DOM-HTML属性,这些属性也更容易阅读:

field.type= 'hidden';
  

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

通过HTML标记搜索值是愚蠢的,并且当goalText包含HTML将逃脱的“&lt;”或“&amp;”等字符时,它将无效。

对于上面的代码,看起来nodes[i]应该是您附加的<input>元素之一,在这种情况下innerHTML不合适,因为它只搜索内容输入,没有什么作为输入是一个空元素。相反,请查看您放置的value属性:

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

此外,我可以这样做:nodes = document.getElementById(“subgoal”)

不,因为您的子目标元素没有ID。要么得名:

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

(与DOM-0相同:)

var subgoals= form.elements.subgoal;

或者,为每个子目标添加一个ID,以帮助您稍后检索它:

field.id= 'id-'+goalText;

如果你可以在goalText中有特殊字符,上面的内容将无效。

或者,在JavaScript中保留自己的查找,而不是将所有内容都放在DOM中:

var subgoalfields= {};
...
// on add
subgoalfields[goalText]= field;
...
// on remove
subgoalfields[goalText].parentNode.removeChild(subgoalfields[goalText]);
delete subgoalfields[goalText];