当前位置: 首页 > 知识库问答 >
问题:

循环遍历集合中的jQuery对象,而无需为每次迭代初始化新的jQuery对象

孟俊晖
2023-03-14

我发现自己一直在这样做:

$myElements.each( function(index, currentHtmltmlElement) {
  var $currentJqueryElement = $(currentHtmltmlElement);
  // Working with $currentJqueryElement
});

在每次迭代中初始化一个新的jQuery对象是一个巨大的性能损失。

所以我想改做这个(功劳也归于decx@freenode):

for (var index = 0; index < $myElements.length; index++) {
  var $currentJqueryElement = $myElements.eq(i);
  // Working with $currentJqueryElement
}

但是我修复了一个JSPerf测试,这个代码片段的性能与第一个代码片段完全相同!:(

两者都非常慢!对于非常大的集合,您甚至可以注意到页面冻结。

所以我想知道在集合中迭代jQuery对象的快速方法是什么。

方式也应尽量方便使用。这:

$items.each$item( function( $item, index ) { /* Working with $item directly. */ });

会比古代的(var i=0...无能)好得多。

下面是一个示例。假设你有许多jQuery UI滑块:

<div class="my-slider"></div>
<div class="my-slider"></div>
<div class="my-slider"></div>
$sliders = $('.my-slider').slider();

现在您想登录以控制每个滑块的值。您必须这样做:

$sliders.each( function(index, htmlSlider) {
  $current_slider = $(htmlSlider); // This step is a huge performance penalty

  console.log(
    $current_slider.slider('value')
  );
});

因此,任务是摆脱性能损失。

您不能简单地执行$sliders.slider('value'),因为这将仅输出集合中第一个滑块的值。

您不能在循环中恢复到香草JS,因为如果没有jQuery对象,您就无法访问jQuery小部件。

到目前为止,所有这些方法。。。

  • $sliders.each(函数(index, htmlSlider){htmlSlider});
  • $sliders.each(函数{this});
  • for(var i=0; i

...使用< code>$sliders的HTML元素的底层数组,并且需要耗时的< code>$( )初始化来访问jQuery特性。

共有3个答案

梁丘权
2023-03-14

如果您证明我是错的,我会很高兴,但是我得出的结论是,jQuery集合是一个统一的对象,不能被迭代,只有它表示的HTML元素被存储为可以枚举的独立实体。您不能直接将一个jQuery集合分割成多个部分,您只能从单独的HTML元素中创建新的部分。

因此,尽可能恢复循环中的本地JS特性以提高性能。

从焱
2023-03-14

只是用这个关键词?似乎是最快的,更不用说(客观上)最容易理解了。

$myElements.each( function() {
  var $currentJqueryElement = $(this);
});

http://jsperf.com/jquery-for-eq-vs-each/3

如果性能是个问题,为什么不跳过jQuery而使用纯JS呢?

回答更新

如果您想获得滑块值(看起来只是css style“left”的数量),可以执行以下操作:

var elems = document.getElementsByClassName('my-slider');
for (var i = 0; i < elems.length; i++){
    console.log(elems[i].style.left); // logs : xx.xx%
}

会更快吗?也许吧。这种方法适合所有用例吗?很可能不会,但对于那个特定的问题,它应该有效。

江展
2023-03-14

尝试

$.each($p, function(i, v) {
  test = $(v)
})

< code>for eq() : 702

each(): 722

此:718

<代码>$。each():757(“最快”)

http://jsperf.com/jquery-for-eq-vs-each/5

编辑

您不能直接将jQuery集合拆分为多个部分,只能使用单独的超文本标记语言元素创建新集合。-lolmaus-Andrey Mikhaylov

尝试(在控制台,此页面)

$("div"); // jQuery `collection` ? approx. `222` members, changes

// `split` 1st `101` members of jquery `obj`, or `collection` 
var split_jq_obj_1 = $("div").slice(0, 111); 

// `split` 2nd `101` members of jquery `obj`, or `collection` 
var split_jq_obj_2 = $("div").slice(-111); 

// Note `prevObject` and `selector` properties of  `jQuery` `object`
// `split_jq_obj_1` and `split_jq_obj_2` 
// `prevObject: e.fn.e.init[222]` , `selector: "div.slice(0,111)"`, 
// `prevObject: e.fn.e.init[222]`, `selector: "div.slice(-111)"`) 


// check results 
console.log($("div"), split_jq_obj_1, split_jq_obj_2);         
console.log($("div").length, split_jq_obj_1.length, split_jq_obj_2.length);

其他可能的方法

// `jquery` `object`, or `objects` 
var arr = $.makeArray($.map($("div"), function(value, index) {
  return ( index < 111 ? [$(value)] : null )
}), $.map($("div"), function(value, index) {
  return ( index >= 111 ? [$(value)] : null )
}));

console.log(arr); // `collection` of `jQuery` `objects`

// iterate `jquery` object`, or `objects`, 
// find `length` of `class` `item-content`
$.each($(arr), function(index, value) {
  console.log($(value).find(".item-content").length) // `29` (see `iteration` at `console`)
});

// check results
$(".item-content").length; // `29`

编辑 2014-05-28

试试这个(图案)

$(function () {
    var sliders = $('.sliiider').slider({
        min: 0,
        max: 100
    });

    $('html').click(function () {
        $.when(sliders)
            .then(function (data) {
            for (var i = 0; i < data.length; i++) {
                // `$()` jQuery `wrapper` _not_ utilized,
                // not certain about quantifying `cost`, if any,
                // of utilizing jquery's `deferred` `object`s
                // test by sliding several `sliders`,
                // then `click` `document`, or `html`
                console.log(data.eq(i).slider("value"))
            };
        })
    });
});

js小提琴http://jsfiddle.net/guest271314/8gVee/

fwiw,这种模式似乎也有效,同样没有使用jQuery的init包装器$()

$(function () {
    var sliders = $('.sliiider').slider({
        min: 0,
        max: 100
    });

    $('html').click(function () {
        $.when(sliders)
            .then(function (data) {
            // Note, 2nd parameter to `.each()` not utilized, here
            data.each(function (i) {  
                // `$()` jQuery `init` `wrapper` _not_ utilized, 
                // within `.each()` `loop`,
                // same result as utilizing `for` loop,
                // "performance", or "fastest" not tested as yet
                console.log(data.eq(i).slider("value"));
            })
        });
    });
})

js小提琴http://jsfiddle.net/guest271314/G944X/

 类似资料:
  • 本文向大家介绍jquery遍历json对象集合详解,包括了jquery遍历json对象集合详解的使用技巧和注意事项,需要的朋友参考一下 本文实例采用案例分析的方法介绍了jquery遍历json对象的三种情况,供大家参考,具体内容如下 第一个案例:jquery 遍历json对象集合 常用示例 jsp中 jsonText的格式: java中: 第二个案例:jQuery 遍历JSON 对象 不说别的,直

  • 问题内容: 我试图遍历一个json文件的对象数组以访问其变量的键和值,并使用jquery的getjson及其每个将它们附加到列表项。 我认为该解决方案应该与本文中的解决方案类似…但是我似乎无法使其完全发挥作用并显示结果…非常感谢您的帮助! json数据的格式如下: 并且html的格式应如下所示: 问题答案: 您要替换为空白数组,从而在运行时破坏数据。删除此行,它应该工作。 编辑 :您的代码中还有一

  • 本文向大家介绍jQuery遍历对象、数组、集合实例,包括了jQuery遍历对象、数组、集合实例的使用技巧和注意事项,需要的朋友参考一下 1.jquery 遍历对象    2.jQuery遍历数组 3.jQuery 遍历List集合(其实与遍历一个对象没有太大区别,只是格式上的问题) 

  • 问题内容: 我目前有这个: test.json看起来像这样: 我越来越: 如何更改它,以便无论我拥有多少嵌套值,它都将循环遍历所有嵌套项目? 所以对于上面的例子,我会得到 问题答案: 您可以创建一个递归循环函数,但是会遇到一个问题:当属性是对象时,因为没有字符串,所以没有文本可显示。因此,您将得到: 因为while 是为项目#2显示的字符串,所以它是为项目#1显示的对象。 无论如何,这就是我组成的

  • 问题内容: 我在用Java工作。 我通常会这样设置一些对象: 问题是:在此示例中是否等于,按原样我可以假定对未初始化的对象进行空检查将是准确的? 问题答案: 正确,未显式初始化的引用类型的静态成员和实例成员都由Java 设置为。相同的规则适用于数组成员。 根据Java语言规范的第4.12.5节: 变量的初始值 程序中的每个变量在使用值之前都必须具有一个值: 每个类变量,实例变量或数组组件在创建时均

  • 问题内容: 前几天,我以为我在jQuery中看到了一个对象迭代器,该对象迭代器具有可以设置为对子对象进行递归迭代的标志。我以为它是jQuery.each()的一部分,但是现在我在文档中看不到该功能。 jQuery中是否有任何此类迭代器可以自动递归? (我知道如何用JavaScript进行操作。只是想知道我是否确实看到了我以为看到的东西。) 非常感谢! 编辑: 要清楚,我在想像jQuery.each