2014-01-23 2 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()); 
    }); 
}); 

Я ни в коем случае не яваскрипт эксперта, так что все помощь приветствуется!

UPDATE: Оказывается, это был прокрутки вверх метод 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(); 
}); 

Дети() просто смотрят на первый уровень содержимого элемента, так что это самый быстрый способ.

+0

Я добавил оба ваших изменения, и я уверен, что они действительно помогли эффективности, поэтому спасибо за это. Однако кажется, что ошибка все еще происходит. Небольшая отладка обнаружила, что это происходит только тогда, когда я удаляю весь текст сразу (т. Е. Выбираем все обратное пространство). Однако, когда я медленно нажимаю назад после каждого символа, ошибка не возникает. Я вызываю эту функцию, используя onkeyup в текстовом поле –

Смежные вопросы