0

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

你能告诉我是否有更好的方法来执行 removeGoalFromHiddenFields 函数吗?可以有许多“子目标”项目。

我即将开始使用下面的内容进行测试,但我对此有些怀疑。

谢谢,

尼尔·沃尔特斯

   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")

4

2 回答 2

2

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

尝试类似:

dojo.query("#form1 input[value=\"" + goalText + "\"]").forEach(function(field) {
    field.parentNode.removeChild(field)
});
于 2009-10-12T16:50:44.167 回答
1

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

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

field.type= 'hidden';

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

通过 HTML 标记搜索值是愚蠢的,并且当 goalText 包含像“<”这样的字符时将不起作用 或'&' 该 HTML 将转义。

对于上面的代码,它看起来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];
于 2009-10-12T16:55:21.660 回答