Javascript 如果a<;td>;包括「;a「;然后制作<;tr>;背景为红色,但each()将变慢

Javascript 如果a<;td>;包括「;a「;然后制作<;tr>;背景为红色,但each()将变慢,javascript,jquery,Javascript,Jquery,您如何编写此代码,使其运行更快。它看起来像是因为我使用了each(),所以它会减慢速度 我可以使用filter()吗 $(“#X tr”)。每个(函数(){ if($(this).find(“表td:eq(1)”).text(){ $(this.css(“背景”:“红色”); } }); A. B C ... A. B C 感谢使用和parent(返回到我们要着色的tr): 或使用: 如果不需要eq条件,请使用 $(this).find('td:contains("a")').paren

您如何编写此代码,使其运行更快。它看起来像是因为我使用了each(),所以它会减慢速度

我可以使用filter()吗

$(“#X tr”)。每个(函数(){
if($(this).find(“表td:eq(1)”).text(){
$(this.css(“背景”:“红色”);
}
});   
A.
B
C
...
A.
B
C
感谢使用和
parent
(返回到我们要着色的
tr
):

或使用:

如果不需要
eq
条件,请使用

$(this).find('td:contains("a")').parent().css("background","red");
请记住,这是基于0的(因为您的测试用例没有涉及匹配元素1而不是0)

演示:

我建议:

$('td:contains("a")').closest('tr').css('background-color','red');

或者,在中影响所有祖先
tr
元素:

$('td:contains("a")').parents('tr').css('background-color','red');

或影响所有具有子代的
tr
元素(无论嵌套深度如何):

添加了一个函数,
lookAt()
,该函数可能会被替代使用:

function lookAt(haystack, needle) {
    if (!haystack) {
        return false;
    }
    else {
        needle = needle ? needle : 'a';
        for (var i = 0, len = haystack.childNodes.length; i < len; i++) {
            var cur = haystack.childNodes[i];
            if (cur.nodeType == 3 && cur.nodeValue.indexOf(needle) > -1){
                return true;
            }
            else if (i == (len-1)) {
                return false;
            }
        }
    }
}

$('#table td').filter(
    function() {
        return lookAt(this);
    }).css('background-color', 'red');​

.

您可以使用
:contains
选择器:


如果您关心性能,以下内容可能会有所帮助

var getText = (function() {
  var div = document.createElement('div');

  if (typeof div.textContent == 'string') {
    return function (el) {
      return el.textContent;
    };

  } else if (typeof div.innerText == 'string') {
    return function (el) {
      return el.innerText;
    };
  }
}());

function foo(table) {
  var row, rows = table.rows;
  var i = rows.length;
  var re = /a/;

  while (i--) {
    row = rows[i];

    if (re.test(getText(row))) {
      row.style.backgroundColor = 'red';
    }
  }
}

您甚至可以省略
,因为
td
不太可能在表之外;)非常感谢-如果我只想检查行的第一个单元格怎么办?请注意,
包含(“a”)
也会在其文本中的任何位置将元素与
a
匹配,例如,
cat
请注意第一个单元格是
eq(0)
,而不是
eq(1)
@arnaud576875 yes。请记住,如果
a
不是
td
的直接子项,例如
a
位于
span
中的
td
中,这将不起作用。我认为OP希望匹配包含文本
a
的单元格,而不是
标记。这将设置
标记的样式;OP被要求设计
标签……看在上帝的份上。我相信我能记得曾经学过阅读,而不是我认为我会轻易忘记怎么做的事情。或者突然。Sigh@DavidThomas:在子选择器文档中,jQuery建议不要使用以
开头的选择器。此外,如果目标是速度,最好避免使用自定义的嘶嘶声选择器,如
:contains
:contains
检查文本,它不以选择器作为参数。@jackwalders:OP的示例是关于文本
a
,而不是
元素,如果我理解正确的话。我有点像是标题,非常递增,朝这个方向。请允许我推荐您和+1
$('td:contains("a")').parents('tr').css('background-color','red');
$('tr').filter(
    function(){
        return $(this).find('td:contains("a")').length;
    }).css('background-color','red');
function lookAt(haystack, needle) {
    if (!haystack) {
        return false;
    }
    else {
        needle = needle ? needle : 'a';
        for (var i = 0, len = haystack.childNodes.length; i < len; i++) {
            var cur = haystack.childNodes[i];
            if (cur.nodeType == 3 && cur.nodeValue.indexOf(needle) > -1){
                return true;
            }
            else if (i == (len-1)) {
                return false;
            }
        }
    }
}

$('#table td').filter(
    function() {
        return lookAt(this);
    }).css('background-color', 'red');​
$('#table td').filter(
    function() {
        return $(this).is(':contains("a")')
    }).css('background-color', 'red');​
​$("#X tr:contains('a')").css("background-color", "red");​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
var getText = (function() {
  var div = document.createElement('div');

  if (typeof div.textContent == 'string') {
    return function (el) {
      return el.textContent;
    };

  } else if (typeof div.innerText == 'string') {
    return function (el) {
      return el.innerText;
    };
  }
}());

function foo(table) {
  var row, rows = table.rows;
  var i = rows.length;
  var re = /a/;

  while (i--) {
    row = rows[i];

    if (re.test(getText(row))) {
      row.style.backgroundColor = 'red';
    }
  }
}