IE 8,Jquery操作堆栈溢出

时间:2014-01-23 16:50:13

标签: javascript jquery stack

我使用以下代码根据文本框中的输入过滤表格。在其他每个浏览器上我都没有收到这样的错误,但是在IE 8上(未经测试更低)我收到错误:

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方法,用show代替它,它全部设置

2 个答案:

答案 0 :(得分:3)

首先,我建议您不要在同一个操作中多次选择相同的元素,每次通过jQuery选择时,必须遍历DOM才能找到它。  因此,例如,查找#searchBarText一次并重新使用它,如下所示:

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

至于你提到的代码块,我会这样做:

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

Children()只是查看元素内容的第一级,所以这是最快的方式。

答案 1 :(得分: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();