2013-08-19 50 views
2

我有jQuery代码:此页上的脚本导致Internet Explorer运行缓慢

... 
var poleVstupu= {id:['31'],platny:['1'],datum:['2013-08-05 20:23:38'], ... }; 

for(var poleName in poleVstupu) 
{ 
    $('[name='+poleName+']').val(poleVstupu[poleName]).change(); 
} 
... 

在Firefox这个代码工作正常,但在IE8它抛出...run slowly消息。如果我运行IE内置调试器,在...run slowly消息之后它会抛出object doesn't support this property or method,但是如果我在$('[name='+poleName ...行设置了断点,它不会显示object doesn't ...消息。

怎样才能更快处理代码并防止显示...run slowly消息?

+1

按名称选择并不是非常理想。这可能有助于将搜索限制在诸如表单等周围元素。或者使用ID代替。你使用的是当前版本的jQuery?你的对象/表单有多少项? – RoToRa

+0

什么几乎可以帮助,将不会使用jQuery。 – RoToRa

+0

最后:你有一个改变事件处理程序,它有什么作用? – RoToRa

回答

2

我对这个答案中的评论作出了回应,因为它会更长并包含代码,但它很可能不会成为答案。


有一个很好的机会,浏览器不会索引name属性,因此它必须通过文档中的每个时间找到匹配的名称每一个元素循环。如果您将搜索范围限制在表单中,您可能会获得更好的性能。例如:

var form = $("#form_id"); 

for(var poleName in poleVstupu) 
{ 
    form.find('[name='+poleName+']').val(poleVstupu[poleName]).change(); 
} 

A(局部的)非jQuery的解决方案可以是直接从DOM访问形式的元件。例如:

var form = $("#form_id")[0]; // Get the DOM reference of the form 

for(var poleName in poleVstupu) 
{ 
    jQuery(form.elements[poleName]).val(poleVstupu[poleName]).change(); 
} 

它也可以帮助你遍历所有的表单元素,而不是对象。例如:

var form = $("#form_id")[0]; // Get the DOM reference of the form 

for (var i = 0, len = form.elements.length; i < len; i++) 
{ 
    var element = form.elements[i]; 
    if (typeof poleVstupu[element.name] !== "undefined") 
     jQuery(element).val(poleVstupu[element.name]).change(); 
} 

与每一个版本的jQuery增加性能。你不能使用1.10.x甚至2.x?


如果您遗漏了.change(),性能如何?


编辑:

在非表单元素name是无效的,所以你不应该使用。我使用的ID和设置一个类上,你需要做的所有元素:

$(".change-html").each(function() { 
    if (typeof poleVstupu[this.id] !== "undefined") { 
    $(this).html(poleVstupu[element.name]); 
    } 
}); 

或者,如果你不能使用id,为eaxmple,因为你有重复,使用data- attribute

<p data-change-html="your_name"></p> 

$("[data-change-html]").each(function() { 
    var element = $(this); 
    var name = element.data("change-html"); 
    if (typeof poleVstupu[name] !== "undefined") { 
    element.html(poleVstupu[name]); 
    } 
}); 

(但后者不会非常快速mostlikey)。

+0

我的页面几乎是一个大的形式,所以我尝试了最后一个例子,并有结果:旧代码(改变()) - > 85秒,新代码(没有改变) - > 11秒,新代码(包含更改()) - > 15秒,新代码(包含jQ 1.10和更改()) - > 18秒,新代码(包含jQ 2和更改()) - >错误 - 没有定义JSON,jQuery ...所以你最后的例子非常好。我以前不知道浏览器索引。谢谢 – koubin

+0

如果优化更改事件处理程序,您可以加速更多。 jQuery 2不支持IE8,因为它非常过时。你也应该考虑不支持IE8。 – RoToRa

+0

此外,更快的速度将是不使用'.val()'为jQuery,因为它支持所有不同的表单字段类型(文本,复选框,选择等)。你需要支持什么形式的字段类型? – RoToRa

0

你在虚拟机内运行你的IE吗?如果是这样,请确保为虚拟机提供足够的RAM分配和CPU能力(如果可设置),以便脚本可以使用计算机能力的重要部分运行。

+0

你的意思是像Java虚拟机的东西?没有,我有Windows XP和直接从那里运行IE浏览器 – koubin

相关问题