的JavaScript removeChild之逻辑/问题
-
20-09-2019 - |
题
我使用道场拖放。当用户添加一个项目到容器(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]);
}
}
}
另外,我可以做到这一点,而不是: 节点=的document.getElementById( “次级目标”)
解决方案
我猜你想要的这里是 dojo.query功能。
尝试是这样的:
dojo.query("#form1 input[value=\"" + goalText + "\"]").forEach(function(field) {
field.parentNode.removeChild(field)
});
其他提示
field.setAttribute( “类型”, “隐藏”);
不要在HTML文档中使用的setAttribute。湖中有许多错误的IE浏览器。使用普通的DOM的HTML性质,这也更容易阅读:
field.type= 'hidden';
变种POS =节点[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);
另外,我可以做到这一点,而不是:节点=的document.getElementById( “次级目标”)
没有,因为你的子目标元素没有标识。通过名称获得:
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];