在jQuery对象数组上调用show

时间:2012-10-17 08:51:21

标签: javascript jquery arrays

我对jQuery.show的表现有一点问题。 IE8中可能会出现此问题(可能还有以下版本,但IE8是我感兴趣的。)

我有一个jQuery对象数组,我们称之为elements。 我想展示他们,所以我做了:

for (var i = elements.length - 1; i >= 0; i--) {
    elements[i].show();
}

瓶颈似乎是对show的呼唤。数组已经生成,因此不需要时间。循环遍历数组也不应该是一个问题。

我想通过创建一个包含所有元素的新jQuery元素来减少对show的一次调用。但我不知道该怎么做。我试过jQuery.add

var $elements = elements[0];
for (var i = elements.length - 1; i >= 1; i--) {
     $elements = $elements.add(elements[i]);
}
$elements.show();

现在,这次似乎是jQuery.add的问题。可能是因为它总是会创建一个新对象。

所以,我想到了三种不同的方法可以解决我的问题。也许你可以帮助我解决其中一个问题:

  • 是否有像add这样的jQuery方法不返回新对象,而是将其添加到当前的jQuery元素中?
  • 是否有一种简单快捷的方法可以通过jQuery元素数组创建jQuery元素?
  • 有没有办法以更快的方式show数组中的所有jQuery对象?

只回答其中一个问题可能会帮到我。我的问题是,jquery总是期望在其方法中使用DOM elements数组而不是jQuery elements数组。

提前多多感谢!

- 编辑elements

的内容

我有一个动态创建节点的jstree(即li个元素)。这些元素具有属性data-id以标识它们。 现在,我总是可以查询类似$('li [data-id = xxx]')的内容,但这会非常慢。因此,当创建li元素时,我将它们缓存到像对象这样的字典中(键是data-id,value是节点)。在这个对象之外,我生成了我的数组elements。这发生得非常快。 该阵列的大小最多可达4000个节点。数组中的每个jQuery元素只包含一个DOM-Element(li)。

1 个答案:

答案 0 :(得分:2)

修改

在阅读了您的更新和评论之后,这个非常的小单行很可能就是答案:

elements.each($.fn.show);

使用jQ将每个方法应用(好,内部:callshow方法应用于所有元素。


从jQuery对象数组创建jQuery对象的最简单,最快捷的方法是:

var objFromArr = $(jQarr);

我刚刚在控制台中对此进行了测试:

objFromArr = jQuery([jQuery('#wmd-input'),jQuery('#wmd-button-bar')]);
objFromArr.each(function()
{
    console.log(this);//logs a jQ object
    console.log(this[0]);//logs the DOMElement
});

但是说过:你 elements是一个jQ对象的数组,但是如果它是选择器的返回值($('.someClass'))那么真的,它不是't:在这种情况下,你的循环是“破碎”

elements = $('.someClass');
for (var i=0;i<elements.length;i++)
{
    console.log(elements[i]);//logs a DOMElement, not a jQuery object
}
//It's the same as doing:
console.log(elements[0]);
//or even:
console.log($('.someClass').get(0));

但最后,如果你有一个jQuery对象数组,并且你想在每个和每一个上调用show方法,我怀疑这是最好的取:

elements.each($.fn.show);//use the show method as callback