【问题标题】:Call show on array of jQuery objects在 jQuery 对象数组上调用 show
【发布时间】:2012-10-17 17:08:44
【问题描述】:

我对@9​​87654321@ 的性能有一点问题。 这个问题出现在 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 元素时,我将它们缓存到一个类似对象的字典中(键是数据 ID,值是节点)。从这个对象中,我生成了我的数组elements。这发生得非常快。 阵列的大小最多可达 4000 个节点。数组中的每个 jQuery Element 只包含一个 DOM-Element (li)。

【问题讨论】:

  • 也许您想将所有这些元素添加到一个 div(或类似的)然后显示该 div?
  • @alexandernst 乍一看,这在我的情况下可能会变得复杂,因为它们是jstree 的一部分。不过我会记住这个建议,也许当我没有其他想法时我会尝试一下。谢谢!
  • 你能告诉我们elements的内容吗?
  • @Chips 您可以将这些元素添加到 DOM 树中。浏览器只显示那里的节点。 Javascriptvariables 只包含几个位。所以我认为来自 alex 的想法是一个好方法。
  • 另请注意,使用.show().hide() 比使用.css('display', '').css('display', 'none') 更昂贵

标签: javascript jquery arrays


【解决方案1】:

编辑

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

elements.each($.fn.show);

使用 jQ each 方法将show 方法应用于所有元素(嗯,内部:使用call)。


从 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')) 的返回值,那么真的,它不是:在这种情况下,您的循环是“中断”

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

【讨论】:

  • 谢谢,你把我引向了正确的方向。 var objFromArr = $(jQarr); 这对我有帮助 - 虽然它看起来很明显......:D
  • @Chips_100:我知道这种感觉,花费数小时和数小时,开发越来越复杂的解决方案,而解决方案一直在盯着你……这是第一次发生在你身上,你哭。第二次,你叹了口气;第三次,你笑了(苦涩地)。最后你耸了耸肩说“该死,我早该知道”“我为什么没想到”:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多