我发现自己一直在这样做:
$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特性。
如果您证明我是错的,我会很高兴,但是我得出的结论是,jQuery集合是一个统一的对象,不能被迭代,只有它表示的HTML元素被存储为可以枚举的独立实体。您不能直接将一个jQuery集合分割成多个部分,您只能从单独的HTML元素中创建新的部分。
因此,尽可能恢复循环中的本地JS特性以提高性能。
只是用这个
关键词?似乎是最快的,更不用说(客观上)最容易理解了。
$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%
}
会更快吗?也许吧。这种方法适合所有用例吗?很可能不会,但对于那个特定的问题,它应该有效。
尝试
$.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