很抱歉打扰您,但是“可信赖的基于 jQuery 的代码”在术语上是矛盾的。FWIW:
jQuery 与其他几个当前流行的脚本框架一样,创建一个类似Array的对象来保存查询结果,而不是实现W3C DOM Level 2+ Core(简称)NodeList接口的对象。A是活的;-like 对象,它们是原生 ECMAScript 对象,而不是宿主对象,(通常)不是。NodeListNodeListArray
如果您不为此使用此类框架,则不会遇到此问题,因为所有(准)标准 DOM 方法(如getElementsByClassName())和属性(如document.forms)都返回/产生 a NodeList(有时甚至是 a HTMLCollection)。
DOM 级别 2 事件指定突变事件类型,但从DOM 级别 3 事件(工作草案)开始,它们已被弃用,并且任何挂钩现在都不可靠,甚至可能无法互操作。
因此,您应该为此使用(准)标准方法,而不是 jQuery 结果和突变事件。
但是,如果您仍然想采用 jQuery(-ish) 方式(以及所有其他不明显的缺点),您应该查看 aNode的parentNode属性。 Node不是Document节点但仍在文档树中的 s 具有非null parentNode属性值(而null应理解为 W3C DOM Level 2+ Core Specification 的 language-independent null,因此您应该查找类型转换为的所有值true在 ECMAScript 实现中)。因此,所有其他Nodes 的parentNode属性值为, 因此在 ECMAScript 实现null中类型转换为。false
假设它myNodes引用了一个Array元素是Nodes 的实例,并且myNode引用了一个这样的节点对象,那么以下应该可以工作:
var i = 0;
/* … */
var myNode = myNodes[i];
if (!myNode.parentNode)
{
myNodes.splice(i, 1);
}
然后,您可以偶尔进行迭代myNodes,例如在一个名为 through 的函数中window.setInterval(),并从中删除“陈旧”节点。它当然不如NodeList使用 .
不幸的是,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。
HTH。