В следующем коде 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
, но почему PHP находит узлы с name
атрибут, когда я ищу идентификатор.
Начиная с HTML5, name
атрибут не поддерживается в a
теги, так что похоже, что он изменился на id
приписывать.
Скорее всего, это задержка от PHP, эмулирующего старое поведение IE. В IE 7 и более ранних версиях document.getElementById () действительно обрабатывает атрибуты имени в <a>
элементы, как если бы они были атрибутами id и поэтому будут соответствовать <a>
элемент, а не <div>
элемент. IE давно продвинулся вперед, но, похоже, в этом отношении PHP не имеет.
Как ты можешь читать Вот
Для документов HTML (и типа MIME text / html) необходимо придерживаться следующей модели обработки, чтобы определить, что представляет собой указанная часть документа.
Разберите URL, и пусть fragid будет компонентом URL.
Если fragid — пустая строка, указанная часть документа является верхней частью документа.
Если в DOM есть элемент с идентификатором, точно равным fragid, то первым таким элементом в древовидном порядке является указанная часть документа; остановите алгоритм здесь.
Если в DOM есть элемент, имеющий атрибут name, значение которого точно равно fragid, то первым таким элементом в древовидном порядке является указанная часть документа; остановите алгоритм здесь.
В противном случае указанная часть документа отсутствует.
Когда я вставил ваш код в песочницу PHP, я заметил интересное предупреждение: