我使用以下代码根据文本框中的输入过滤表格。在其他每个浏览器上我都没有收到这样的错误,但是在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代替它,它全部设置
答案 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();