2013-08-19 49 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

相關問題