2009-06-02 109 views
6

最近,我一直在努力加速性能这样一个jQuery的问题(​​有时是与可维护性帮助)关于变量和选择

var objectToReference = $('div .complicated #selector ul:last'); 

那么,是什么objectToReference真正持有?有时候事情已经让我感到困扰,所以我已经回到使用完整的选择器,它已经工作。

如此做变量保持一个参考,指针等(我不知道这些术语的确切定义)

感谢

回答

20

许多人在创建像这样的变量时使用的最佳做法是将其命名为$,以表明它是一个jquery对象。所以你可以命名变量$ o,并且可以直接调用其他jQuery链函数,而不必在变量周围放置$()。

$o.hide(); 

这是开始与你操纵的区域周围的元素,以避免搜索整个文档是个好主意。例如,要获取文档的单节内的所有链接(无需搜索整个文档):

var $o = $('#mysection'); 
var $links = $('a', $o); // equiv to $o.find('a') 

最后,它绝不会伤害传递一个jQuery对象背透的jQuery:

$o === $($o) 

这有很好的副作用 - 你可以编写接受任何以下作为参数的功能:一个选择,一个元素,一个jQuery对象:

function myFunc(e) { 
    var $e = $(e); 
} 
// All of the following will work: 
myFunc('#mysection'); 
myFunc(document.getElementById('mysection')); 
myFunc($('#mysection a')); 
+2

OH NOES!现在我的JS看起来像一个Perl或PHP。 好提示tho:P – 2009-06-02 03:55:20

3

返回值jQuery selector是jQuery元素的数组。如果选择器没有找到任何匹配,则它包含一个包含0个元素的数组。

数组中的每个元素基本上都是对HTML文档中匹配的DOM元素的引用。这是允许您根据需要遍历和操作它们的。

+2

从技术上讲,不是一个数组,而是一个给定几个类似数组的属性的对象。 – Nosredna 2009-06-02 14:51:03

1

它包含对返回的jQuery对象的引用。对该对象的任何更改都会将底层DOM元素和所有其他引用更改为相同的元素。

$('div .complicated #selector ul:last') 

你的变量objectToReference将是您可以执行的jQuery操作jQuery对象。另外,即使你不需要,也可以使用objectToReference创建一个新的jQuery对象,它不应该强加任何性能限制,因为它应该只返回一个对自身的引用,而不是对该元素进行重新搜索。

var objectToReference = $('div .complicated #selector ul:last'); 
var copyOfObject = $(objectToReference); 

您可以尝试引用objectToReference的DOM属性遇到了问题。如果你想获得在由jQuery选择返回你的objectToReference的基本DOM元素,你可以这样做:

var objectToReference = $('div .complicated #selector ul:last'); 
var domOfObject = objectToReference.get(0); 

或可选,你能做到这一点,它做同样在1号线:

var domObjectToReference= $('div .complicated #selector ul:last').get(0); 

同样,你可以使用domObjectToReference在jQuery的构造函数来创建另一个引用该对象:

var objectToReference2 = $(domObjectToReference); 

所有这些例子商店裁判的参与DOM元素。如果您修改其中一个参考的值,它们将全部被修改/更新。