Javascript DOM导航-意外值

Javascript DOM导航-意外值,javascript,dom,Javascript,Dom,请看我的密码 <!DOCTYPE html> <html> <body> <h1 id="H1">H1 text H1 text H1 text</h1> <p id="P2">P2 P2 P2</p> <script> var Text = document.getElementById("H1").childNodes[-5].nodeValue; document.getElementBy

请看我的密码

<!DOCTYPE html>
<html>
<body>

<h1 id="H1">H1 text H1 text H1 text</h1>

<p id="P2">P2 P2 P2</p>

<script>
var Text = document.getElementById("H1").childNodes[-5].nodeValue;
document.getElementById("P2").innerHTML = Text;
</script>

</body>
</html>

H1文本H1文本H1文本

P2

var Text=document.getElementById(“H1”).childNodes[-5].nodeValue; document.getElementById(“P2”).innerHTML=Text;
当我的页面加载时,我怎么会在P2段中看到相同的文本


为什么我看不到其中写着“未定义”或“null”?

H1元素只有一个子节点,即文本节点。如果将索引更改为0,如下所示:

<!DOCTYPE html>
<html>
<body>

<h1 id="H1">H1 text H1 text H1 text</h1>

<p id="P2">P2 P2 P2</p>

<script>
var Text = document.getElementById("H1").childNodes[0].nodeValue;
document.getElementById("P2").innerHTML = Text;
</script>

</body>
</html>

H1文本H1文本H1文本

P2

var Text=document.getElementById(“H1”).childNodes[0].nodeValue; document.getElementById(“P2”).innerHTML=Text;

您将看到它现在执行,尽管我不清楚您试图执行什么…

,因为第二行从未执行。看看你的控制台。您应该看到(至少在Chrome上,其他浏览器的详细信息可能略有不同)
uncaughttypeerror:无法读取未定义的属性“nodeValue”

脚本遇到第一个错误时将停止执行。这就是它的工作方式:

var Text = document.getElementById("H1").childNodes[-5].nodeValue;  // <-- execution 
                                                                    // stops here
document.getElementById("P2").innerHTML = Text;       // <!-- this line never executes
将返回未定义的
(我怀疑您知道这一点,因此提出了您的问题)。然后尝试访问
未定义
上的属性
.nodeValue
。这会抛出一个错误,就像您直接键入:

undefined.nodeValue
进入您的控制台(继续尝试)。如果忽略错误并继续尝试执行,则结果将是意外的,并可能导致脚本中的进一步(更严重)错误

如果您的想法是能够检查节点是否存在,那么您可以执行以下操作:

var Text=未定义;
if(document.getElementById(“H1”).childNodes[-5]){
//undefined是falsy-所以下一行不会执行,我们不会得到错误
Text=document.getElementById(“H1”).childNodes[-5].nodeValue;
}
//现在.innerHTML将得到“未定义”
document.getElementById(“P2”).innerHTML=Text
H1文本H1文本H1文本

因为第二行从不执行,所以P2

。看看你的控制台。您应该会看到
uncaughttypeerror:无法读取未定义的属性“nodeValue”
。因为在分配
文本的行中出现错误,所以您永远不会执行第二行。Ok。但是,如果我写了一个错误的索引(比如333或-10),为什么我在页面中看不到单词“undefined”或“null”?为什么剧本不理我?因为你的剧本坏了。当它遇到错误时,您希望它做什么?不顾一切地继续?这不是它的工作原理。执行将在第一个错误时停止。您的脚本并没有忽略您,而是在它抛出错误时忽略了它。
undefined.nodeValue