2014-01-23 86 views
0

我正在使用下面的代碼來過濾基於文本框輸入的表。在其他瀏覽器我沒有收到這樣的錯誤,但在IE 8(沒有較低測試)我收到錯誤:IE 8,Jquery操作堆棧溢出

Out of stack space Line 4 character 26207 jquery.min.js 

下面是我當前的代碼導致了問題:

var timeout; 

function sort(){ 

    clearTimeout(timeout); 
    var value = document.getElementById('searchBarText').value; 

    timeout = setTimeout(
    function(){$("#searchTable tr").each(function() { 
     var id = " " 
      $row = $(this); 
      $row.each(function(i) { 
        $("td", this).each(function(j) { 
        id+="".concat($(this).text()); 
        }); 
       }); 
      id = id.replace(/\s+/g, ' '); 
      id = id.replace(/(\d+)/g, ''); 
      if (id.toLowerCase().indexOf(value.toLowerCase()) == -1) { 
       $row.hide(); 
       if(value.length < 3){ 
        $("#searchBarText").css('border', '2px red solid') 
       }else{ 
        $("#searchBarText").removeAttr('style') 
       } 
      } 
      else if(value!="" &&value.length >= 3) { 
       $("#searchBarText").removeAttr('style') 
       $("#topTable").css('margin-top', '0px') 
       $("#searchIcon").css('color', '#26466D') 
       $("#searching").fadeIn(); 
       $row.show(); 
      }else{ 
       if(value.length > 0){ 
        $("#searchBarText").css('border', '2px red solid') 

       }else{ 
        $("#searchBarText").removeAttr('style') 
       } 
       $("#searchIcon").removeAttr('style') 
       $("#searching").slideUp(); 
       $("#topTable").css('margin-top', '-5px') 
       $row.hide(); 
      } 
    })},400); 
} 

現在它發生的主要時間是當搜索查詢被清除時,這意味着所有的行都被放回表中。

我有一種感覺的低效是在這裏的某個地方:

$row = $(this); 
$row.each(function(i) { 
    $("td", this).each(function(j) { 
     id+="".concat($(this).text()); 
    }); 
}); 

我絕不是一個JavaScript的專家,所以所有的幫助表示讚賞!

更新:原來這就是向上滾動jQuery的方法,與展會替換它,這是所有設置

回答

1

有沒有需要遍歷每個行,當你只有一個,只需直接選擇單元格,迭代它們。

$row = $(this); 
$row.find("td").each(function(i) { 
    id+=$(this).text(); 
}); 

$row = $(this); 
id += $row.find("td").map(function(i) { 
    return $(this).text(); 
}).get().join(""); 

甚至

$row = $(this); 
id += $row.text(); 
3

首先我建議你不要選擇同一元素超過一次在同一操作多,每次你選擇的東西通過jQuery,必須遍歷DOM才能找到它。 因此,例如,尋找#searchBarText一次,並重新使用它,像這樣:

var $searchBarText = $('#searchBarText'); 

至於你提到的代碼塊,我是這樣做的:

$row = $(this); 
$row.children('td').each(function() { 
    id += $(this).text(); 
}); 

Children()只是查看元素內容的第一個級別,所以它是最快的方法。

+0

我添加了你的兩個修改,並且我確定他們確實幫助了效率,所以非常感謝。但是,似乎仍然發生錯誤。稍微調試發現,這種情況只發生在我一次刪除整個文本(即選擇全部退格)的情況下。但是,當我在每個字符後緩慢地按退格鍵時,錯誤不會發生。我在文本字段中使用onkeyup調用這個函數 –