我正在使用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”)
答案 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];