使用DOM方法normalize()的效果
The effect of using DOM method normalize()
好像没看懂DOM方法的具体作用normalize()
。
我认为它删除了完全空的文本节点。但是我没有观察到这种效果。
这是一个示例文档。
<!DOCTYPE html />
<html lang = "en">
<head>
<meta charset = "Utf-8" />
<title>Normalize</title>
</head>
<body>
<form accept = "#" method = "post">
<fieldset><legend>Using normalize()</legend>
<p>The form is used only to test the method normalize().</p>
<div>
<label for = "text">Label</label>
<input type = "text" name = "text" id = "text"/>
</div>
</fieldset>
</form>
<script>
window.onload = function () {
var element = document.getElementById("text");
do {
alert(element);
element = element.previousSibling;
} while (element.nodeType != Node.ELEMENT_NODE);
alert(element);
var element = document.getElementById("text");
element.parentNode.normalize();
do {
alert(element);
element = element.previousSibling;
} while (element.nodeType != Node.ELEMENT_NODE);
alert(element);
};
</script>
</body>
</html>
第一个 do-while
在尚未调用方法 normalize()
时输出节点。
它在IE-11
中的输出如下
[object HTMLInputElement]
[object Text]
[object HTMLLabelElement]
但是在调用方法 normalize()
之后,下一个 do-while
循环产生相同的输出序列:
[object HTMLInputElement]
[object Text]
[object HTMLLabelElement]
我认为输出
[object Text]
第二个循环中应该没有。
我对方法的理解有什么问题normalize()
?
或者 DOM 规范中空 Text 节点的确切定义是什么?
根据normalize-page on MDN,它将删除空文本节点并合并相邻的文本节点。在您的情况下,您的文本节点周围有两个 html 元素,其中将包含一些空格,因此不会被触及。
'normalize' 方法定义说' sub-tree 中没有文本节点是空的并且没有相邻的文本节点' 在你的情况下没有文本节点为空,文本节点上有“↵”和一些空格。如果您将 html 更改为:
<label for = "text">Label</label><input type = "text" name = "text" id = "text"/>
'label' 和 'input' 元素一起没有空格,您将不会收到任何关于“#text”节点的警报。现在,如果您真的想看看 normalize 是如何工作的,您应该创建两个具有空值的文本节点:
document.createTextNode('');
将它们放在 'label' 和 'input' 元素之间。然后 运行 你的代码。您将收到两个针对#text 节点的警报。标准化后,您不应该收到任何关于#text 节点的警报。
好像没看懂DOM方法的具体作用normalize()
。
我认为它删除了完全空的文本节点。但是我没有观察到这种效果。
这是一个示例文档。
<!DOCTYPE html />
<html lang = "en">
<head>
<meta charset = "Utf-8" />
<title>Normalize</title>
</head>
<body>
<form accept = "#" method = "post">
<fieldset><legend>Using normalize()</legend>
<p>The form is used only to test the method normalize().</p>
<div>
<label for = "text">Label</label>
<input type = "text" name = "text" id = "text"/>
</div>
</fieldset>
</form>
<script>
window.onload = function () {
var element = document.getElementById("text");
do {
alert(element);
element = element.previousSibling;
} while (element.nodeType != Node.ELEMENT_NODE);
alert(element);
var element = document.getElementById("text");
element.parentNode.normalize();
do {
alert(element);
element = element.previousSibling;
} while (element.nodeType != Node.ELEMENT_NODE);
alert(element);
};
</script>
</body>
</html>
第一个 do-while
在尚未调用方法 normalize()
时输出节点。
它在IE-11
中的输出如下
[object HTMLInputElement]
[object Text]
[object HTMLLabelElement]
但是在调用方法 normalize()
之后,下一个 do-while
循环产生相同的输出序列:
[object HTMLInputElement]
[object Text]
[object HTMLLabelElement]
我认为输出
[object Text]
第二个循环中应该没有。
我对方法的理解有什么问题normalize()
?
或者 DOM 规范中空 Text 节点的确切定义是什么?
根据normalize-page on MDN,它将删除空文本节点并合并相邻的文本节点。在您的情况下,您的文本节点周围有两个 html 元素,其中将包含一些空格,因此不会被触及。
'normalize' 方法定义说' sub-tree 中没有文本节点是空的并且没有相邻的文本节点' 在你的情况下没有文本节点为空,文本节点上有“↵”和一些空格。如果您将 html 更改为:
<label for = "text">Label</label><input type = "text" name = "text" id = "text"/>
'label' 和 'input' 元素一起没有空格,您将不会收到任何关于“#text”节点的警报。现在,如果您真的想看看 normalize 是如何工作的,您应该创建两个具有空值的文本节点:
document.createTextNode('');
将它们放在 'label' 和 'input' 元素之间。然后 运行 你的代码。您将收到两个针对#text 节点的警报。标准化后,您不应该收到任何关于#text 节点的警报。