PHP返回带有名称而不是ID的元素

时间:2018-02-22 15:13:14

标签: php dom domdocument getelementbyid

在以下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,而不是关于同时使用nameid,但是当我搜索id时,为什么PHP会找到name属性的节点。

3 个答案:

答案 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完全相等,那么树顺序中的第一个元素就是文档的指示部分;在这里停止算法。   否则,文档中没有明确的部分。

当我将代码粘贴到PHP沙箱时,我注意到一个有趣的警告: enter image description here