93

我试图不区分大小写地使用“包含”。我尝试在以下 stackoverflow 问题中使用该解决方案,但它不起作用:

是否有不区分大小写的 jQuery :contains 选择器?

为方便起见,此处复制解决方案:

jQuery.extend(
        jQuery.expr[':'], { 
                Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" 
});

这是错误:

Error: q is not a function
Source File: /js/jquery-1.4.js?ver=1.4
Line: 81

这是我使用它的地方:

  $('input.preset').keyup(function() {
    $(this).next().find("li").removeClass("bold");
    var theMatch = $(this).val();
    if (theMatch.length > 1){
      theMatch = "li:Contains('" + theMatch + "')";
      $(this).next().find(theMatch).addClass("bold");
    }
  });

我在同一场景中使用原始区分大小写的“包含”没有任何错误。有没有人有任何想法?我会很感激的。

4

6 回答 6

129

这是我在当前项目中使用的,没有任何问题。看看你是否对这种格式有更好的运气:

jQuery.expr[':'].Contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};

在 jQuery 1.8 中,该 API 发生了变化,jQuery 1.8+ 版本将是:

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
    return function( elem ) {
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});

你可以在这里测试一下。有关 1.8+ 自定义选择器的更多详细信息,请在此处查看 Sizzle wiki

于 2010-02-04T00:59:10.723 回答
43

值得注意的是,答案是正确的,但仅涵盖了:Contains,而不是可能导致意外行为的别名:contains(或者可以通过设计用于需要敏感和不敏感搜索的高级应用程序)。

这可以通过复制别名的扩展名来解决:

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

我花了一段时间才弄清楚为什么它对我不起作用。

于 2011-04-27T04:31:48.633 回答
27

我会做这样的事情

     $.expr[':'].containsIgnoreCase = function (n, i, m) {
        return jQuery(n).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
    };

并且别管:contains...

演示

那么为什么 jQuery 在它的库中不支持它呢?!如果就这么容易...

因为 您的代码是否通过了土耳其代码?

于 2013-02-22T21:56:46.620 回答
6

可能会迟到……但是,

我宁愿走这条路。。

$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

这样,您就不会篡改 jQuery 的 NATIVE '.contains' ...稍后您可能需要默认的 ...如果被篡改,您可能会发现自己回到了stackOverFlow ...

于 2013-05-27T16:16:17.730 回答
0

我将允许自己添加我的朋友:

$.expr[":"].containsNoCase = function (el, i, m) { 
    var search = m[3]; 
    if (!search) return false; 
    return eval("/" + search + "/i").test($(el).text()); 
}; 
于 2014-02-11T08:38:51.233 回答
0

我只是能够完全忽略 jQuery 的大小写敏感度来实现我想要使用下面的代码:

            $.expr[":"].contains = $.expr.createPseudo(function(arg) {
            return function( elem ) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });

您可以使用此链接根据您的 jQuery 版本查找代码以忽略区分大小写, https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

此外,如果您想使用 :contains 并进行一些搜索,您可能想看看这个:http ://technarco.com/jquery/using-jquery-search-html-text-and-show-or-hide-因此

于 2016-01-11T11:02:21.083 回答