Целью здесь является манипулирование некоторыми узлами DOM до их вставки в документ с использованием методов prototypeJs.
Контрольные примеры:
<html>
<head>
<script type="text/javascript" src="prototype.js" ></script>
</head>
<body>
<script type="text/javascript">
var elt = document.createElement("DIV");
elt.id="root";
elt.innerHTML="<div id='stuff'><span id='junk'></span></div>";
console.info(elt);
console.info(Element.down(elt, "#stuff"));
console.info(Element.select(elt, "#stuff"));
console.info(elt.down("#stuff"));
console.info(elt.select("#stuff"));
Element.extend(elt);
console.info(elt.down("#stuff"));
console.info(elt.select("#stuff"));
document.body.appendChild(elt);
console.info($("root").down("#stuff"));
console.info($("root").select("#stuff"));
</script>
</body>
</html>
В Firefox все 8 тестов правильно выводят либо div «stuff», либо коллекцию, содержащую только div «stuff».
В ie (протестировано в 7/8) я ожидаю, что вторые два теста потерпят неудачу, поскольку прототип не расширяет DOM автоматически, как в ff. Однако, что на самом деле происходит, так это то, что все тесты до того момента, когда элемент вставлен, проваливаются, два последующих теста в порядке. Однажды я вызываю Element.extend, если ожидал, что будут доступны методы down / select.
Если это поведение, как и ожидалось, и если да, то почему?
Как бы вы посоветовали мне выполнять обход DOM на узлах, находящихся в памяти, в кросс-браузерной манере?
Так что благодаря Kaze no Koe я сузил проблему. Кажется, что это работает, то есть, но не для селекторов идентификаторов.
<html>
<head>
<script type="text/javascript" src="prototype.js" ></script>
</head>
<body>
<script type="text/javascript">
var elt = document.createElement("DIV");
elt.id="root";
elt.innerHTML="<div id='stuff' class='junk'></div>";
elt = $(elt);
console.info(elt.down("DIV")); //fine
console.info(elt.down(".junk")); //fine
console.info(elt.down("#stuff")); //undefined in ie, fine in ff
</script>
</body>
</html>
Для меня не проблема использовать class вместо id, поэтому я могу решить свою исходную проблему, но для полноты картины кто-нибудь может объяснить, почему селекторы id не будут работать до вставки в ie, то есть? Я думаю, что реализация ie опирается на document.getElementById, а ff - нет. Кто-нибудь подтвердит?