jQueryを使用して空のテキスト入力を選択する


103

jQueryを使用して空のテキストボックスを識別するにはどうすればよいですか?可能であればセレクタを使ってやりたいです。また、実際のコードではこれを使用したいので、すべてのテキスト入力を選択したくないので、idを選択する必要があります。

次の2つのコード例では、最初のコード例は、ユーザーがテキストボックス「txt2」に入力した値を正確に表示しています。2番目の例は、空のテキストボックスがあることを示していますが、入力しても、空と見なされます。どうしてこれなの?

これはセレクターだけを使用して実行できますか?

このコードは、テキストボックス「txt2」の値を報告します。

<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript">
            $(function() {
                $('#cmdSubmit').click(function() {
                    alert($('[id=txt2]').val());
                });             
            });
        </script>
    </head>
    <body>
        <form>
            <input type="text" name="txt1" id="txt1" value="123" /><br />
            <input type="text" name="txt2" id="txt2" value="" /><br />
            <input type="text" name="txt3" id="txt3" value="abc" /><br />
            <input type="submit" name="cmdSubmit" id='cmdSubmit' value="Send" /><br />
        </form>
    </body>
</html>

このコードは常にテキストボックス "txt2"を空として報告します:

<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript">
            $(function() {
                $('#cmdSubmit').click(function() {
                    if($('[id^=txt][value=""]').length > 0) {
                        if (!confirm("Are you sure you want to submit empty fields?")) {
                            if (event.preventDefault) {
                                event.preventDefault();
                            } else {
                                event.returnValue = false;
                            }
                        }
                    }
                });             
            });
        </script>
    </head>
    <body>
        <form>
            <input type="text" name="txt1" id="txt1" value="123" /><br />
            <input type="text" name="txt2" id="txt2" value="" /><br />
            <input type="text" name="txt3" id="txt3" value="abc" /><br />
            <input type="submit" name="cmdSubmit" id='cmdSubmit' value="Send" /><br />
        </form>
    </body>
</html>

6
'[value =]'がユーザー入力を無視し、ソースの内容のみをチェックするかどうかは誰かが知っていますか?
Cros

:emptyフィルターがこのジョブ用に作成されていることは正しいですか?$( 'input [type = text]:empty')。doStuff();
アントニーカーシー

1
docs-docs.jquery.com/Selectors/emptyをお読みください。空は、値がないのではなく、子がない要素の場合です
Russ Cam '21

回答:


196

別の方法

$('input:text').filter(function() { return $(this).val() == ""; });

または

$('input:text').filter(function() { return this.value == ""; });

または

// WARNING: if input element does not have the "value" attribute or this attribute was removed from DOM then such selector WILL NOT WORK! 
// For example input with type="file" and file does not selected.
// It's prefer to use "filter()" method.
// Thanks to @AaronLS
$('input:text[value=""]');

作業デモ

デモのコード

jQuery

 $(function() {

  $('#button').click(function() {

    var emptyTextBoxes = $('input:text').filter(function() { return this.value == ""; });
    var string = "The blank textbox ids are - \n";

    emptyTextBoxes.each(function() {
      string += "\n" + this.id;
    });
    alert(string);
  });

});

私の場合:if($( '[id ^ = txt]')。filter(function(){return $(this).val()== "";})。length> 0){alert( 'WARNING' ); }
Cros

最後の例と2番目の例の違いは何ですか?実際のコードではすべてのテキスト入力を調べないため、idを選択する必要があります。2番目の例はユーザー入力では機能しませんが、あなたの入力では機能します。
Cros

1
動作しているセレクターはセレクターの:textに関係しているようです-動作しているデモを開いてURLに/ editを追加すると、使用されているセレクターで再生できます。:textを削除すると、$( 'input [value = ""]')を使用しても、セレクターが正しく機能しなくなります。おそらくシズルセレクターエンジンのバグですが、調査する時間はありません。ちなみに、セレクターの要素タグを使用することをお勧めします。そうしないと、各要素が属性値に一致するかどうかが確認されます。
ラスカム

3
素敵な答え!ただし、入力要素の値が文字通りnull(空白スペース)であることを確認することもできます。その場合は、空白を必ず削除してください。このようなもの$('input:text').filter(function() { return $(this).val().trim() == ""; });
Vineeth Pradhan 2012

31
要素は存在するが値属性を[value=""]持たない場合、セレクターは値属性を見つけられないため機能しません。ただし、.filter手法はこのシナリオでは機能します。
AaronLS

26

独自のセレクターを定義することによっても行うことができます。

$.extend($.expr[':'],{
    textboxEmpty: function(el){
        return $(el).val() === "";
    }
});

そして、次のようにそれらにアクセスします:

alert($(':text:textboxEmpty').length); //alerts the number of text boxes in your selection

パフォーマンスが少し気になります。しかし、おそらく最も簡単な答えです!
アリカンジル2017

19
$(":text[value='']").doStuff();

ちなみに、あなたの呼び出し:

$('input[id=cmdSubmit]')...

以下を使用すると、大幅に簡略化および高速化できます。

$('#cmdSubmit')...

右角括弧が抜けているようです。jQueryの一般的なソースが期待どおりに機能せず、見つけるのが難しい:-/
OregonGhost 09

あなたの最初の例は、基本的に私の動作しない例がすることです。ユーザーが入力フィールドにテキストを追加したかどうかを知りたいのですが、あなたの例ではこれを行いません。
Cros

私は急いでいました、あなたの例はうまくいくようですが、それは私がしなければならないidを選択しません。
Cros

「input [id = ..]」を行うことは「#」と同じではありません。#はオブジェクトの配列を提供しません。
dev4life

@ dev4life同じIDのページで複数の要素を使用している場合、それは間違っています
Sean Kendle

12

トップランクの投稿で述べたように、以下はシズルエンジンで動作します。

$('input:text[value=""]');

コメントで:textは、セレクターの一部を削除するとセレクターが失敗することが指摘されています。私は、Sizzleが実際にはブラウザーの組み込みセレクターエンジンに可能な限り依存していることが起こっていると思います。場合:textセレクタに追加され、それは非標準CSSセレクタとなり、それによってニーズがシズル自体によって処理されなければなりません。つまり、Sizzleは、ソースHTMLで指定された「value」属性の代わりに、INPUTの現在の値をチェックします。

空のテキストフィールドをチェックする賢い方法ですが、Sizzleエンジンに固有の動作(ソースコードで定義された属性の代わりにINPUTの現在の値を使用する動作)に依存していると思います。Sizzleはこのセレクターに一致する要素を返す可能性がありdocument.querySelectorAllますvalue=""が、HTMLにある要素のみを返します。買い手責任負担。


5

$("input[type=text][value=]")

多くのバージョン試したこれが最も論理的であることがわかりました。

text大文字と小文字が区別されることに注意してください。


4

@ジェームズワイズマンの答えに基づいて、私はこれを使用しています:

$.extend($.expr[':'],{
    blank: function(el){
        return $(el).val().match(/^\s*$/);
    }
});

これは、「本当に」空の入力に加えて空白のみを含む入力をキャッチします。

例:http : //jsfiddle.net/e9btdbyn/


3

私はお勧めします:

$('input:text:not([value])')

2
これは機能しません。[属性]は、値があるかどうかではなく、属性の存在を検索するためです。<input value="">まだ一致します。
ベン・ハル

これは、Laravelを使用してフォームフィールド(例:)を生成するときに役立ちます。これは{{Form::text('first_name', Input::old('first_name'), array('class' => 'form-control', 'required'))}}、Laravelが空白の場合、 'value'属性を追加しないためです。だから私はそれから使用しました:$('input:text:not([value]):visible:enabled:first');最初に表示される空の有効なテキスト入力フィールドを見つけるために。
ライアン

3

ここに何かを示唆する多くの答えがありますが、[value=""]それは実際にうまくいくとは思いません。。。または、少なくとも、使用方法に一貫性がありません。同様のことを実行しようとしています。入力された値がない特定の文字列で始まるIDを持つすべての入力を選択しています。私はこれを試しました:

$("input[id^='something'][value='']")

しかし、それは機能しません。それらを逆にすることもしません。このフィドルを参照してください。文字列で始まるIDがあり、値が入力されていないすべての入力を正しく選択する唯一の方法は、

$("input[id^='something']").not("[value!='']")

そして

$("input[id^='something']:not([value!=''])")

しかし、明らかに、ダブルネガティブはそれを本当に混乱させます。おそらく、Russ Camの最初の答え(フィルタリング機能付き)が最も明確な方法でしょう。


1

これは、「txt」で始まるIDを持つ空のテキスト入力を選択します。

$(':text[value=""][id^=txt]')

0

すべての比較に対してJQueryオブジェクトを作成することは効率的ではないため、次のように使用します。

$.expr[":"].blank = function(element) {
    return element.value == "";
};

その後、次のことができます。

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