jQuery 1.8+など、jQueryが大文字と小文字を区別しないようにするにはどうすればよいですか?


91

"contains"の大文字小文字を区別せずに使用しようとしています。次の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");
    }
  });

同じシナリオで元の大文字と小文字を区別する「含む」を使用しても、エラーは発生しません。誰かアイデアはありますか?私はそれを感謝します。


誰かが興味を持っている場合に備えて、私は3つの追加のcontainsセレクター、およびjQueryのすべてのバージョンで機能するようにセレクターについて私のブログ投稿を更新しました。:containsExact:containsExactCase:containsRegex
Mottie 2012


.filter()も良い方法だと思います。参照
劉鎮瑲

回答:


127

これは私が現在のプロジェクトで使用しているもので、何の問題もありませんでした。このフォーマットで運が良かったか確認してください:

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をご覧ください


あなたは命の恩人です。ありがとう。
Matrym

3
これが何をしているのか正確に話せる可能性はありますか?
安倍ミースラー

4
@ClovisSix-おかげさまで、1.8以上の同じ方法を提供しました。問題が発生した場合はお知らせください。
Nick Craver

1
これは:containsを置き換えないことに注意してください。別のセレクタ:Containsを追加するだけです。
albanx 2014年

3
セレクタはicontains、またはそれに似た名前で呼び出す必要があります。
Sebastian

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

なぜうまくいかなかったのかを理解するのにしばらくかかりました。


私は上でこれについてコメントしたでしょうが、どうやら私はそうすることができません。
Ellipsis 2011

5
ここで何が表示されているのかわかりません。これにより、文書化されたの予想される動作が上書きされます:contains。オリジナルをそのままにして:contains、新しいセレクターを呼び出す方が明確だと思います:icontains
ジャスティンフォース

5
それは私の記事の要点の外です。代替セレクターを作成することは確かに有効なオプションですが、:containsを拡張することを指摘しましたが、:Containsを拡張しないと、異なる結果が得られる場合にユーザーの混乱を招く可能性があります。
省略記号'30

1
それでは、この「ごちゃごちゃ」を共有していただきありがとうございます。:)それでも、非破壊的な並列動作を構築する作業が少ない場合は、組み込みの動作をオーバーライドしない方がよいと述べることは良い考えだと思います。
ジャスティンフォース

私はこれについて投稿されたいくつかの異なる解決策を試してみましたが、これは最終的にはうまくいきました。ありがとう。
テイラーミッシェルズ2014年


6

遅刻するかもしれませんが……。

私はこのように行きたいです。

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

このように、あなたはしていない jQueryのNATIVEを改ざん」.contains'あなたは改ざん場合、デフォルトの1が後に...、あなたが戻って自分自身を見つけるかもしれない必要があるかもしれません... stackoverflowの ...


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

このリンクを使用して、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-を参照してください。それに応じて

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.