是否可以在jQuery中使用多个变量而不是选择器

Gab*_*iel 50 jquery

我知道执行以下操作会更快:

var $header = $("#header");
$header.css({color:"#ff0000"});
$header.find("a").addClass("foo");
Run Code Online (Sandbox Code Playgroud)

代替:

$("#header").css({color:"#ff0000"});
$("#header a").addClass("foo");
Run Code Online (Sandbox Code Playgroud)

因为jQuery不需要在DOM中再次找到元素,因为我们直接引用它们.

让我们说我有这个:

var $header_elements = $("#header li");
var $footer_elements = $("#footer li");
Run Code Online (Sandbox Code Playgroud)

我单独使用它们进行一些jQuery操作.但是,我需要在两者上做点什么.使用选择器,我会这样做:

$("#header li, #footer li").css({color:"#ff0000"});
Run Code Online (Sandbox Code Playgroud)

但是,需要再次解析DOM才能找到匹配的元素.有没有办法使用我以前声明的变量而不是新的选择器?像下面的内容(这是工作的,我知道,这是给什么我正在寻找一个想法):

$($header_elements + $footer_elements).css({color:"#ff0000"});
Run Code Online (Sandbox Code Playgroud)

我认为选择器返回某种数组或对象.我正在寻找的是一种合并它们的方法.任何人都知道这是否可行以及如何做到这一点?

谢谢你的帮助!

djd*_*d87 70

只需使用add方法:

$header_elements.add($footer_elements).css({color:'#ff0000'});
Run Code Online (Sandbox Code Playgroud)

给定一个表示一组DOM元素的jQuery对象,.add()方法从这些元素的并集和传递给方法的元素构造一个新的jQuery对象..add()的参数几乎可以是$()接受的任何内容,包括jQuery选择器表达式,对DOM元素的引用或HTML片段.

  • 或者使用他的源代码示例:`$ header_elements.add($ footer_elements).css({color:'#ff0000'});` (3认同)
  • 对于这种情况,add()是要使用的正确函数.几乎出乎意料的是,add()不会永久修改jQuery集合.因此,即使在$ header_elements中添加$ footer_elements之后,从该点开始对$ header_elements的引用也只会影响原始集合.但是,$ .merge将永久修改参数中的第一个集合,因此在$ .merge($ header_elements,$ footer_elements)之后,对$ header_elements采取的任何操作也将影响$ footer_elements集合. - 示例:http://jsbin.com/osupi3/2/edit (2认同)

Gab*_*iel 17

我发布这个解决方案后几分钟就找到了解决方案.对于那些想知道的人,这里是:

$.merge($header_elements, $footer_elements).css({color:"#ff0000"});
Run Code Online (Sandbox Code Playgroud)

它更快吗?我还不知道,我需要运行一些测试才能找到答案.

编辑:

我与JS小提琴测试在这里:http://jsfiddle.net/bgLfz/1/

我测试每次使用选择器,两个选择器变量,以$ .merge变量(),并使用.新增().每次测试运行1000次.

我身边的结果如下(从快到慢):

  1. 使用$ .merge()(平均7ms)
  2. 一个接一个地使用两个变量(平均10ms,但代码需要重复)
  3. 使用.add()(平均16ms)
  4. 每次使用选择器(平均295ms)

  • 它肯定会变慢,因为jquery必须合并变量然后仍然用`each`来完成它们. (2认同)
  • 有关一些简单的性能测试,请参阅 http://jsperf.com/adding-selectors... 另请注意,函数 `add()` 需要更多时间,但它看起来也更干净,并删除了潜在的重复项 :) (2认同)
  • 性能不是这里的问题 - $ .merge()永久修改第一个参数的事实是一个更大的问题(正如gnarf指出的那样).合并之后,$ header_elements现在将包含$ footer_elements集合,这意味着如果您只想影响标题元素,则不能(不再运行查询).示例如下:http://jsbin.com/osupi3/2/edit (2认同)

Sim*_*old 12

您可以使用addmerge方法:
添加

$header_elements.add($footer_elements).css({color:'#f00'});
Run Code Online (Sandbox Code Playgroud)

合并

$.merge($header_elements, $footer_elements).css({color:"#f00"});
Run Code Online (Sandbox Code Playgroud)

两者都有效,但添加效果更好. 在此输入图像描述 资料来源: http ://jsperf.com/add-vs-merge

信用:我赞成了@GenericTypeTea和@Gabriel的答案,做了两者的总结,比较了它们,这是结果.


Anp*_*her 6

传递引用数组:

$([$header_elements, $footer_elements]).css({color:"#ff0000"});
Run Code Online (Sandbox Code Playgroud)

  • 这是我的方法,但你不能在数组中传递 jQuery 对象。您需要传递 DOM 元素。`$([$header_elements[0], $footer_elements[0]])` (7认同)