假设我有一个存储在名为obj的变量中的jQuery对象/集合,该变量应该包含一个名为target的id的DOM元素.
我事先不知道目标将是一个孩子的OBJ,即:
obj = $('<div id="parent"><div id="target"></div></div>');
Run Code Online (Sandbox Code Playgroud)
或者如果obj 等于 目标,即:
obj = $('<div id="target"></div>');
Run Code Online (Sandbox Code Playgroud)
或者如果target是obj中的顶级元素,即:
obj = $('<div id="target"/><span id="other"/>');
Run Code Online (Sandbox Code Playgroud)
我需要一种从obj中选择目标的方法,但我不知道何时使用.find以及何时使用.filter.
从obj中提取目标的最快和/或最简洁的方法是什么?
我想出的是:
var $target = obj.find("#target").add(obj.filter("#target"));
Run Code Online (Sandbox Code Playgroud)
更新 我正在为JSPERF测试页添加解决方案,以查看哪一个是最好的.目前我的解决方案仍然是最快的.这是链接,请运行测试,以便我们有更多数据:
performance jquery cross-browser jquery-selectors jquery-traversing
使用jQuery的"is"函数运行以下比较将返回false,因为DOM元素不完全相同,尽管在视觉上和功能上它们是相同的:
var $a = $('<div id="test" href="http://www.google.com"></div>');
var $b = $('<div href="http://www.google.com" id="test"></div>');
$a.is($b);//FALSE
Run Code Online (Sandbox Code Playgroud)
使用DOM对象的直接比较也将返回false.
请参阅运行示例:http://jsfiddle.net/6zqwn/5/
那么,有没有办法避免在比较时考虑属性的顺序?
(为什么我要问这个问题:我在跨浏览器单元测试中使用这些比较,其中不同的浏览器改变了属性的顺序,同时仍在功能上创建相同的DOM元素.)