很抱歉打扰您,但是“可信赖的基于 jQuery 的代码”在术语上是矛盾的。FWIW:
jQuery 与其他几个当前流行的脚本框架一样,创建一个类似Array
的对象来保存查询结果,而不是实现W3C DOM Level 2+ Core(简称)NodeList
接口的对象。A是活的;-like 对象,它们是原生 ECMAScript 对象,而不是宿主对象,(通常)不是。NodeList
NodeList
Array
如果您不为此使用此类框架,则不会遇到此问题,因为所有(准)标准 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 实现中)。因此,所有其他Node
s 的parentNode
属性值为, 因此在 ECMAScript 实现null
中类型转换为。false
假设它myNodes
引用了一个Array
元素是Node
s 的实例,并且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。