我对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元素中?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
)。
答案 0 :(得分:2)
修改强>
在阅读了您的更新和评论之后,这个非常的小单行很可能就是答案:
elements.each($.fn.show);
使用jQ将每个方法应用(好,内部:call
)show
方法应用于所有元素。
从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