jQuery:contains()选择器大写和小写问题

Ner*_*udo 39 jquery jquery-selectors

我的HTML看起来像这样

<input id="txt" value=""></input>

<div class="link-item">jK</div>
<div class="link-item">JFOO</div>
Run Code Online (Sandbox Code Playgroud)

我的js

$('#txt').keyup(function(){

    var txtsearch = $('#txt').val();
    var filt = $("div.link-item:contains('" + txtsearch +"')");

    $("div.link-item").css("display", "none")
        .filter(filt)
        .css("display", "block");

});
Run Code Online (Sandbox Code Playgroud)

我想在客户端动态过滤内容.当我输入大写字母j时,它只返回第二个div,而我想得到包含j的所有div,无论是大写还是小写.

Hig*_*ife 101

您可以将.contains过滤器更改为不区分大小写或创建自己的选择器.

jQuery.expr[':'].icontains = function(a, i, m) {
  return jQuery(a).text().toUpperCase()
      .indexOf(m[3].toUpperCase()) >= 0;
};
Run Code Online (Sandbox Code Playgroud)

这会创建一个新的选择器:icontains(或者您可以将其命名为insensitive-contains,或任何适合您的喜好).它的用法与contains相同:$('div:icontains("Stack")');匹配:

<div>stack</div>
<div>Stack</div>
<div>StAcKOverflow</div>
Run Code Online (Sandbox Code Playgroud)

或覆盖现有.contains过滤器:

jQuery.expr[':'].contains = function(a, i, m) {
  return jQuery(a).text().toUpperCase()
      .indexOf(m[3].toUpperCase()) >= 0;
};
Run Code Online (Sandbox Code Playgroud)

有了这个,

$("div:contains('John')");
Run Code Online (Sandbox Code Playgroud)

将选择所有这三个元素:

<div>john</div>
<div>John</div>
<div>hey hey JOHN hey hey</div>
Run Code Online (Sandbox Code Playgroud)

  • 我认为您应该为此创建一个单独的选择器,而不是覆盖默认选择器. (4认同)
  • 万一有人在像我这样的`函数(a,i,m)中的`a,i,m`有问题...请参阅http://jquery-howto.blogspot.in/2009/06/jquery -custom-选择与 - parameters.html (3认同)
  • 感谢您的链接,@AbdulHameed!现在我明白为什么 m[3]。 (2认同)

Ada*_*kis 18

为什么不使用该filter函数,并传入一个使用不区分大小写的正则表达式的函数?

var filteredDivs = $("div.link-item").filter(function() {
    var reg = new RegExp(txtsearch, "i");
    return reg.test($(this).text());
});
Run Code Online (Sandbox Code Playgroud)

DEMO


Ste*_*fan 6

这是我的贡献,希望能对您有所帮助:)

$('#txt').keyup(function() {
    var query = $(this).val();
    $("div.link-item")
        .hide()
        .filter(':contains("' + query + '")')
        .show();
});
Run Code Online (Sandbox Code Playgroud)

:含有()选择器是大小写敏感的。

匹配的文本可以直接出现在所选元素中,该元素的任何后代或其组合中。与属性值选择器一样,:contains()括号内的文本可以写为裸词,也可以用引号引起来。文本必须具有匹配的大小写才能选择

如果有人想尝试也创建了一个演示

更新

抱歉,一定是误解了您的问题。

http://bugs.jquery.com/ticket/278找到了这个jQuery表达式,以创建一个不区分大小写的新选择器,并更新了我的演示

$.extend($.expr[':'], {
  'containsi': function(elem, i, match, array) {
    return (elem.textContent || elem.innerText || '').toLowerCase()
        .indexOf((match[3] || "").toLowerCase()) >= 0;
  }
});
Run Code Online (Sandbox Code Playgroud)