Извините, что сломал это для вас, но «надежный код на основе jQuery» является противоречием в терминах. FWIW:
jQuery, как и несколько других популярных в настоящее время сред сценариев, создает Array
-подобный объект для хранения результата запроса, а не объект, реализующий NodeList
интерфейс из W3C DOM Level 2 + Core (NodeList
для краткости). A NodeList
is live ; Array
-подобные объекты, которые являются собственными объектами ECMAScript, а не хост-объектами, (обычно) не являются.
Если вы не используете такие платформы для этого, у вас не будет этой проблемы, поскольку все (квази) стандартные методы DOM (такие как getElementsByClassName()
) и свойства (такие как document.forms
) возвращают / выдает NodeList
(иногда даже HTMLCollection
).
События уровня 2 DOM указано типы событий мутации , но по состоянию на События уровня 3 DOM ( Рабочий чертеж ) они устарел , и любые хуки, которые сейчас ненадежны и , вероятно, даже не совместимы .
Таким образом, вы должны использовать (квази) стандартные методы для этого, а не результат jQuery и не события мутации.
Однако, если вы все еще хотите пойти по пути jQuery (-ish) (со всеми другими неявными недостатками), вам следует обратиться к свойству Node
parentNode
. Node
s, которые не являются узлом Document
, но все еще находятся в дереве документа, имеют значение свойства не null
parentNode
(тогда как null
следует понимать как язык Базовой спецификации W3C DOM Level 2+) -independent null
, поэтому вы должны искать все значения, которые преобразуются в true
в реализации ECMAScript). Соответственно, все остальные Node
имеют значение свойства parentNode
, равное null
, поэтому в реализации ECMAScript тип преобразуется в false
.
Если предположить, что myNodes
относится к экземпляру Array
, элементами которого являются Node
s, а myNode
относится к одному такому объекту узла, то должно работать следующее:
var i = 0;
/* … */
var myNode = myNodes[i];
if (!myNode.parentNode)
{
myNodes.splice(i, 1);
}
Затем вы можете иногда перебирать myNodes
, скажем, в функции, вызываемой через window.setInterval()
, и удалять из нее «устаревшие» узлы. Это, конечно, не так хорошо, как с NodeList
, но оно работает, даже если узлы удаляются без использования jQuery, и даже если типы событий мутации не поддерживаются средой выполнения.
К сожалению, jQuery()
не возвращает ссылку на экземпляр Array
. Так что сначала вам нужно будет сделать один, например:
var jqObj = jQuery("…");
/* or jQuery.makeArray(jqObj) */
var a = Array.prototype.slice.call(jqObj, 0);
(Мы используем тот факт, что объект, на который ссылается jqObj
, имеет свойство length
.)
Я не могу сказать, что было бы хорошим стилем для плагина jQuery, поскольку по причинам, которые должны быть очевидны к настоящему времени, я стараюсь в первую очередь избегать использования jQuery.
Вы также должны научиться различать язык программирования * s *, как JavaScript , и (обычно не зависящие от языка) API, которые можно использовать с ними, например, DOM.
НТН.