2009-12-21 86 views
2

我该如何去除个别动态创建的文本节点?如何删除一个div中的单个文本节点而不删除所有这些节点?

我正在动态生成输入,并且正在使用.createTextNode在元素之前放置描述性文本。我需要能够删除正在创建的特定元素,并使用.removeChild来执行此操作。这适用于移除单个输入,因为我可以引用(id/name)。有没有办法为每个文本节点设置某种引用,以便我可以将其与相应的输入控件一起删除?

var box = document.getElementById("myDiv"); 

box.appendChild(document.createTextNode('Status: ')); 
var inp = document.createElement('input'); 
inp.type = 'text'; 
// add attributes, etc... 

box.appendChild(inp); 

回答

3

为什么不把它们包装在一个字段集中呢?

var box = document.getElementById("myDiv"); 

var field = document.createElement('fieldset'); 
field.appendChild(document.createTextNode('Status: ')); 
var inp = document.createElement('input'); 
inp.type = 'text'; 
// add attributes, etc... 

field.appendChild(inp); 
box.appendChild(field); 

这种方式只是删除字段元素将同时删除您的textnode和您的输入。

+0

我其实比我自己更喜欢这个答案。特别是在表单中,没有充分的理由让文本节点不在fieldset/label元素内。 – davidcl 2009-12-21 21:07:09

+0

谢谢你,但我有一个问题。如何将“字段”传递给函数,以便我可以删除字段集?我正在创建一个按钮,调用一个单击时删除该字段的函数。但是这个按钮是在字段本身中创建的,当我将字段传递给它时,字段为空。 – Jaden 2009-12-21 22:35:48

1

如果改变这一行:

box.appendChild(document.createTextNode('Status: ')); 

要:

var textNode = document.createTextNode('Status: '); 
box.appendChild(textNode); 

然后,你可以参考textNode VAR后来将其删除。但要小心 - 一些浏览器会合并相邻的文本节点。

0
var box = document.getElementById("myDiv"); 

var label = document.createTextNode('Status: ') 
box.appendChild(label); 
var inp = document.createElement('input'); 
inp.type = 'text'; 
// add attributes, etc... 

box.appendChild(inp); 

// do other stuff 

//remove the label 
label.nodeValue = ""; 
2

不要删除属于DOM中文本节点列表的文本节点。即使你引用它们(在你将它们附加到DOM之前)。

浏览器可能会合并多个文本节点!我不确定标准是什么状态,但它可能 - 至少有一些经验告诉我...(可能是旧的浏览器,但情况就是如此)。

除此之外,您可以将每个文本节点包装在span或div标记中,也可以使用某种文本替换。我更喜欢前者。

2

保持对它的引用:

var txt = document.createTextNode('Status: '); 
box.appendChild(txt); 

,然后用删除:

txt.parentNode.removeChild(txt); 

如果节点应该在输入之前立即,这也能发挥作用:

inp.parentNode.removeChild(inp.previousSibling); 

它应该工作,如果你不使用innerHTMLnormalize(),其中c应该使节点重新创建或合并,使参考无效。

如果您想从节点中删除任意文本,则有textnode.splitText(offset)