【问题标题】:Partial match on JQuery selectorJQuery 选择器上的部分匹配
【发布时间】:2012-04-21 04:46:24
【问题描述】:

要获取所有以“ELEC...”开头的 <td> 元素文本,我正在做 -

$('td.id').each(function(){
    if ($(this).text().indexOf('ELEC') == 0) {}
});

有没有更简单的方法来做到这一点,比如$('td.id:contains("ELEC*")')

【问题讨论】:

  • 您编写的代码不是在寻找文本以“ELEC”开头的元素;它正在寻找文本包含“ELEC”的元素。你想要哪个?
  • 可能重复,见this question

标签: jquery


【解决方案1】:

要仅获取以 ELEC 开头的元素,请使用 .filter 方法。

$("td.id").filter(function(){
    return /^ELEC/.test($(this).text());
});

或者稍微高效一点的

var $collection = $("td.id");
$collection.filter(function(i){
    return /^ELEC/.test($collection.eq(i).text());
});

【讨论】:

  • 为什么这比 OP 使用的 .indexOf("Elec") == 0 更好?在所有情况下 .indexOf 都比使用正则表达式更快。
  • 这更好,因为它实际上创建了一个您可以使用的元素集合,而不是单独在每个元素上运行代码。例如,对于我的示例,您可以使用$collection.addClass("foobar")。使用他的原始代码,他将在 if 语句中执行$(this).addClass('foobar')
【解决方案2】:

看起来你就是这样做的(我删除了通配符星号,因为它不需要。):

$('td.id:contains("ELEC")')

http://api.jquery.com/contains-selector/

【讨论】:

  • 啊,我错过了问题的“开头”约束。
  • 这个问题是模棱两可的——它询问“开始于”,然后显示实现“包含”的示例代码。
【解决方案3】:

似乎如果我们结合几个不同提案中最好的一个,我们会得到更快的结果,因为这里并不真正需要正则表达式:

$("td.id").filter(function() {
    return ($(this).text().substr(0, 4) == "Elec");
}).whateverMethodYouWant();

或者更快一点,使用更少的 jQuery:

$("td.id").filter(function() {
    return ((this.textContent || this.innerText).substr(0, 4) == "Elec");
}).whateverMethodYouWant();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2019-06-10
    • 1970-01-01
    相关资源
    最近更新 更多