2013-07-04 237 views
1

我有一個耗時太長的腳本,這導致了我ie上的這個錯誤:此頁面上的腳本導致Internet Explorer運行緩慢。Javascript花費太長時間運行

我讀過關於這個錯誤的其他線程,並且已經知道有一種方法可以通過在經過一定次數的迭代之後放一段時間來傳遞它。

你能幫我申請下列功能嗎?

基本上每次我找到隱藏的輸入類型提交或無線電我想刪除,我有很多。請不要質疑爲什麼我有很多隱藏的輸入。我做了BC,我需要它只是幫我把時間請出來,所以我不會有JS錯誤。謝謝

$('input:hidden').each(function(){ 
    var name = $(this).attr('name'); 
    if($("[name='"+name+"']").length >1){ 
     if($(this).attr('type')!=='radio' && $(this).attr('type')!=='submit'){ 
      $(this).remove(); 
     } 
    } 
    }); 

一個我發現exemples的:Bypassing IE's long-running script warning using setTimeout

+2

停止執行'$(this)',而是將其分配給一個變量 –

+1

在評論之前,請務必閱讀代碼,將$ this放入一個變量中,或者將其保持不變。 – Joseph

+0

您有多少輸入可以讓這麼小的腳本「長時間運行」? – Bergi

回答

1

看起來你舉的例子是正是你需要的。我想如果你拿起你的代碼並替換示例中的while循環(保留用於檢查批量大小的if語句),則基本完成。你只需要打破循環的jQuery版本。

+0

雖然長時間運行的循環可能已經在$('input:hidden')'裏面了...... – Bergi

+0

謝謝先生,那也一樣工作:) – Joseph

2

您可能需要將input添加到您的jquery選擇器,以僅過濾輸入標記。

if($("input[name='"+name+"']").length >1){ 
+0

完美:)。儘管我想學習如何超時以繞過錯誤。謝謝 – Joseph

1

試試這個:

$("[type=hidden]").remove(); // at the place of each loop 

這將需要很短的時間刪除所有隱藏的字段。

我希望這會有所幫助。

JSFiddle example

+1

但是OP的代碼不會只刪除'type =「hidden」'字段。 ':hidden'選擇器也返回隱藏CSS的東西。 OP的代碼根據每個元素的「名稱」進行測試... – nnnnnn

+0

它將刪除隱藏類型爲隱藏類型的所有隱藏字段。

1

致危說明明顯;遍歷DOM查找匹配這些CSS選擇器是什麼讓你的代碼變慢。您可以通過幾個簡單的技巧減少工作量:

這些字段是否在特定元素內?如果是這樣,您可以通過在選擇器中包含該元素來縮小搜索範圍。

如:

$('#container input:hidden').each(function(){ 
    ... 

您也可以縮小這種檢查對於name屬性的字段數

如:

if($("#container input[name='"+name+"']").length >1){ 

我也不清楚爲什麼你搜索再次$("[name='"+name+"']").length >1一旦你找到了隱藏的元素。你沒有解釋這個要求。如果你不需要這個,那麼你會通過把它拿出來而大大加快速度。

$('#container input:hidden').each(function(){ 
    var name = $(this).attr('name'); 
    if($(this).attr('type')!=='radio' && $(this).attr('type')!=='submit'){ 
     $(this).remove(); 
    } 
}); 

如果需要它,我會很想知道爲什麼,但最好的辦法可能是重組的代碼,以便它只檢查的給定名稱的輸入數一次,並一次性去除它們。

2

這是同樣的代碼中使用setTimeout()優化有點不(還):

var $hidden = $('input:hidden'), 
    el; 
for (var i = 0; i < $hidden.length; i++) { 
    el = $hidden[i]; 
    if(el.type!=='radio' && el.type!=='submit' 
      && $("[name='" + el.name + "']").length >1) { 

    $(el).remove(); 
    } 
} 

注意,現在有一個最大的三個功能的每次迭代調用,而原來的代碼有多達十個每個函數調用迭代。當你可以說this.type(沒有函數調用)時,不需要例如$(this).attr('type')(兩個函數調用)。

此外,.remove()只發生在三個條件爲真,兩個type測試並檢查其他相同名稱的元素。 type首先測試,因爲它們很快,並且只有在type部分通過時纔打算對其他元素進行慢速檢查。 (JS的&&如果左邊一個是falsy不評估右手操作數)。

或者與setTimeout()

var $hidden = $('input:hidden'), 
    i = 0, 
    el; 
function doNext() { 
    if (i < $hidden.length) { 
     el = $hidden[i]; 
     if(el.type!=='radio' && el.type!=='submit' 
       && $("[name='" + el.name + "']").length >1) { 

     $(el).remove(); 
     } 
     i++; 
     setTimeout(doNext, 0); 
    } 
} 
doNext(); 

您可以通過改變$("[name='" + el.name + "']")指定一個特定的元素提高兩個版本類型,例如,如果你只是在做輸入使用$("input[name='" + el.name + "']")。你也可以限制某個容器,例如,如果這些輸入都是某種形式或某種東西。

+0

我正在尋找的答案和更多。謝謝先生 – Joseph

+0

user2515601,你應該把@nnnnnn's標記爲最好的答案......因爲它是。 :) – David

+0

謝謝user2515601和@David。我只是稍微調整了我的答案,改變了「if」測試條件的順序,以便只有在其他人通過時才評估慢速測試條件。 (請注意,我實際上並沒有測試任何代碼,但它應該足夠清楚,可以給出你的想法......) – nnnnnn