在以下PHP代码DOMDocument::getElementById
中,返回节点<a name="test">
而不是节点<div id="test">
:
<?php
$doc = new DOMDocument();
$doc->loadHTML('<a name="test"></a><div id="test"></div>'); // triggers duplicate ID warning
echo $doc->getElementById("test")->nodeName; // outputs "a"
?>
这仅适用于<a>
个节点。这是为了吗?
JavaScript按照我的预期处理它:
<script>
window.addEventListener('DOMContentLoaded', function() {
document.body.innerHTML = '<a name="test"></a><div id="test"></div>';
console.log(document.getElementById('test'));
});
</script>
编辑(问题被标记为重复):这个问题不是关于我应该使用name
还是id
,而不是关于同时使用name
和id
,但是当我搜索id时,为什么PHP会找到name
属性的节点。
答案 0 :(得分:1)
从HTML5开始,sys.path.append(os.path.dirname(os.path.realpath(__file__)))
标记中的name
属性isn't supported因此看起来已更改为a
属性。
答案 1 :(得分:1)
这很可能是PHP模仿旧IE行为的延续。在IE 7及更早版本中,document.getElementById()确实将<a>
元素上的名称属性视为id属性,因此匹配<a>
元素而不是<div>
元素。 IE已经很久了,但在这一点上,PHP似乎还没有。
答案 2 :(得分:0)
您可以阅读here
对于HTML文档(以及text / html MIME类型),必须遵循以下处理模型以确定文档的指示部分。
解析URL,并让fragid成为URL的组成部分。 如果fragid是空字符串,则文档的指示部分是文档的顶部。 如果DOM中的元素具有完全等于fragid的ID,则树顺序中的第一个这样的元素是文档的指示部分;在这里停止算法。 如果DOM中有一个元素,其name属性的值与fragid完全相等,那么树顺序中的第一个元素就是文档的指示部分;在这里停止算法。 否则,文档中没有明确的部分。