2010-02-04 65 views
89

我試圖不區分大小寫地使用「contains」。我試着用在以下計算器問題的解決方案,但它沒有工作:我該如何製作jQuery包含大小寫不敏感,包括jQuery 1.8+?

Is there a case insensitive jQuery :contains selector?

爲了方便起見,該解決方案複製到此處:

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"); 
    } 
    }); 

我原來的區分大小寫的使用「包含」在相同的情況下工作沒有任何錯誤。有沒有人有任何想法?我會很感激。

+0

如果有人有興趣,我已經在三個附加的包含選擇器':containsExact',':containsExactCase'和''containsExactCase''上更新了我的[博客文章](http://wowmotty.blogspot.com/2010/05/jquery-selectors-adding-contains-exact.html) :containsRegex'選擇器現在可以在所有版本的jQuery中工作。 – Mottie 2012-09-02 13:08:18

+0

請參閱https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/, – 2016-11-18 20:15:56

回答

124

這是我在當前項目中使用的,沒有任何問題。看看你是否有更好的運氣與此格式:

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; 
    }; 
}); 

You can test it out here。有關1.8+自定義選擇器的更多詳細信息,請參閱check out the Sizzle wiki here

+0

你是一個拯救生命的人。謝謝。 – Matrym 2010-02-04 01:47:23

+2

謝謝!這仍然適用於jQuery 1.6.1。 – 2011-06-15 17:11:25

+3

有什麼機會可以談論這到底是什麼? – 2011-10-25 21:09:37

42

值得注意的是,答案是正確的,但只涵蓋了: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; 
}; 

我花了一段時間才能出來爲什麼它不是爲我工作。

+0

我會在上面評論這一點,但顯然我無法做到。 – Ellipsis 2011-04-27 04:32:29

+5

我不確定你在這裏得到什麼。這覆蓋了':contains'的預期的記錄行爲。我認爲單獨保留原始的':contains'並將你的新選擇器叫做'icontains'更清晰。 – 2011-06-15 17:12:41

+5

這是我的帖子旁邊。創建一個替代選擇器當然是一個有效的選擇,但是我指出擴展:包含但忽略擴展:當它們產生不同的結果時,包含會導致用戶混淆。 – Ellipsis 2011-08-30 11:07:38

24

我會做這樣的事情

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

,並留下:contains人...

DEMO

那麼,爲什麼jQuery的不支持它,在它的圖書館?如果它是容易...

因爲Does your code pass the turkey code?

+2

完美!謝謝:) – masterchief 2014-05-23 01:23:35

+1

這應該是被接受的答案。 – 2015-06-24 18:48:42

5

可能會遲到....不過,

我更願意走這條路..

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

這樣,你不要篡改jQuery的NATIVE '。包含 ...你可能需要一個默認後來......如果篡改,你可能會發現自己回到計算器 ...

0

我會讓自己加我的朋友:

$.expr[":"].containsNoCase = function (el, i, m) { 
    var search = m[3]; 
    if (!search) return false; 
    return eval("/" + search + "/i").test($(el).text()); 
}; 
0

我只是能夠完全忽略jQuery的情況下的靈敏度達到我想要使用下面的代碼是什麼:

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

你可以使用這個鏈接找到代碼BA sed的對你的jQuery版本忽略大小寫, https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

另外,如果你想使用:包含,並提出一些搜索,你可能想看看這個:http://www.ultechspot.com/jquery/using-jquery-search-html-text-and-show-or-hide-accordingly