如何使jQuery Contains不区分大小写,包括jQuery 1.8+?

Mat*_*rym 91 jquery contains case-sensitive case-insensitive

我正在尝试使用"包含"不区分大小写.我尝试在以下stackoverflow问题中使用该解决方案,但它不起作用:

是否有一个不区分大小写的jQuery:包含选择器?

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

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

这是错误:

Error: q is not a function
Source File: /js/jquery-1.4.js?ver=1.4
Line: 81
Run Code Online (Sandbox Code Playgroud)

这是我正在使用它的地方:

  $('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");
    }
  });
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ver 127

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

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

在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;
    };
});
Run Code Online (Sandbox Code Playgroud)

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

  • @ClovisSix - 感谢你的提醒,我提供了一个1.8+的方法,如果你有任何麻烦,让我知道. (4认同)
  • 你有没有机会谈论这究竟是做什么的? (3认同)
  • 选择器应该被称为`icontains`,或类似的东西. (3认同)
  • 谢谢!这仍然适用于jQuery 1.6.1. (2认同)
  • 请注意,这不会替换 :contains,只是添加另一个选择器 :Contains。 (2认同)

Ell*_*sis 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; 
};
Run Code Online (Sandbox Code Playgroud)

花了一些时间来弄清楚它为什么不适合我.

  • 我不确定你在这里得到什么.这会覆盖`:contains`的预期记录行为.我认为单独留下原始的`:contains`并调用你的新选择器`:icontains`会更清楚. (5认同)
  • 这与我的帖子不同.创建一个替代选择器当然是一个有效的选项,但我指出扩展:包含,但忽略扩展:包含可能导致用户混淆,当它们产生不同的结果. (5认同)

Min*_*iel 27

我会做这样的事情

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

并留下:contains一个人...

DEMO

那么为什么jQuery不支持它的库?!如果这很容易......

因为 你的代码是否通过火鸡代码?

  • 完善!谢谢 :) (2认同)

Eri*_*est 5

可能会迟到......但是,

我宁愿这样走..

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

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