HTML JavaScript通过id、标签名或其他方式获取文本节点?

4

有没有办法为文本节点分配一个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";

但是行不通。我尝试了各种变量,如使用标记名称、数据等来命名文本节点,但仍然出现相同的错误。那么,难道无法为文本节点命名和检索吗?下一个最好的解决方案是创建新的文本节点并替换旧的文本节点吗?


1
文本节点没有标识符,只有元素才有,因此您需要先选择元素,然后再选择文本节点。 - adeneo
你的代码中 myDiv 从未被添加到 DOM 中? - adeneo
descriptionText没有value属性,也许是innerText - Iłya Bursov
是的,myDiv已经添加了...我只是试图将代码保持最小化...descriptionText是文本节点的ID。文本节点的内部文本是“some text”,这是使用var textNode = document.createTextNode(“some text”)设置的。第一个评论有道理。我现在记得阅读过一个文本节点不是元素。所以那很有道理。但是,话虽如此,我能否使用类似于myDive.childNodes [0] .value =“some text”的东西来替换文本节点?还是我必须创建一个新的文本节点然后替换它? - Mike P
1个回答

8

Text 没有 id 属性,因此当您将节点写入 DOM 时,它不再可访问。在 JavaScript 中创建的内容(一个 Text 对象)与 HTMLElement 等 DOM 元素没有直接关联。

事实上,它甚至不被认为是父元素的子元素,而是父元素的 textContent。请注意,textContent 来自继承自 Node 的元素。

您可以在创建对象时为其分配 "id",因为所有对象都只是对象,但是当您将其放入 DOM 中时,所有非标准内容都会消失。

如果要测试父元素是否有子元素:

myDiv.children.length;

你会发现(如果没有其他子元素),你添加的文本节点将作为属性“吸收”到父元素中。
这里有一个小的 jsfiddle 示例。
旁注:这是浏览器处理文本的过度简化。我不知道是否应该称之为极度简化,但无论如何都是一种。 需要注意的是,文本 继承自 CharacterData,后者又继承自 Node。然而,这些都是接口,限制了可用方法/属性的范围。 此外,文本节点始终可以通过DOM访问,但不能通过标识符或标签访问。 Node.normalize的MDN页面清楚地演示了这些节点如何通过只读childNodes nodeList访问。
虽然将这些内容放在您的后袋中很有用,但在日常使用中,不需要考虑节点、规范化和CharacterData的上下文中的文本。

我明白了。正如我所猜测的那样。感谢您详细的解释。 - Mike P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接