无论如何都要为textNode分配一个id,然后通过该id检索该文本节点?我已经尝试了几种不同的方法,并继续得到错误,说不能获得null的属性。
我的代码看起来像这样......
var myDiv = document.createdElement('div');
myDiv.id = "textContainer";
var textNode = document.createdTextNode("some text");
textNode.id = "descriptionText";
myDiv.appendChild(textNode);
到目前为止工作正常;它显示在页面上。后来我尝试修改那个文本节点,这就是我收到错误的地方。
var tempNode = document.getElementById(descriptionText);
descriptionText.value = "new text";
这是不行的。我已尝试变量,如文本节点用tagName,数据等命名,我得到相同的错误。那么,是不是可以命名和检索文本节点?还有下一个创建新文本节点并替换旧文本节点的最佳解决方案吗?
答案 0 :(得分:9)
Text没有id的属性,因此当您将节点写入DOM时,它不再可以以这种方式访问。您在JavaScript中创建的内容(Text
对象)与HTMLElement之类的DOM元素不直接相关。
事实上,它甚至不被视为父母的孩子,而是父母的textContent
。请注意,textContent
来自继承自Node
。
您可以指定一个" id"在创建对象时因为所有对象都只是对象,但是当你把它放到DOM中时,所有非标准的东西都会消失。
如果你测试你父元素的子元素:
myDiv.children.length;
您会看到(如果没有其他孩子)您添加的文字节点是"吸收"作为财产进入父母。
这里有一点jsfiddle示范。
旁注:这是对浏览器中文本处理方式的过度简化。我不知道我是否称之为粗略过度简化,但它是一种方式。
应该注意Text继承自CharacterData,Node继承自The MDN page for Node.normalize
。但是,这些是接口,它限制了可用方法/属性的范围。
此外,文本节点 始终可以在DOM中访问,但不能通过标识符或标记访问。 childNodes
通过nodeList只读{{3}}清楚地演示了这些节点的可用性。
尽管将这些东西放在后面的口袋中很有用,但在日常使用的节点和规范化以及CharacterData的上下文中考虑Text可能并不重要。