การเลือกอินพุตข้อความว่างโดยใช้ jQuery


104

ฉันจะระบุกล่องข้อความว่างโดยใช้ jQuery ได้อย่างไร ฉันต้องการทำโดยใช้ตัวเลือกถ้าเป็นไปได้ทั้งหมด นอกจากนี้ฉันต้องเลือกรหัสเนื่องจากในรหัสจริงที่ฉันต้องการใช้สิ่งนี้ฉันไม่ต้องการเลือกอินพุตข้อความทั้งหมด

ในสองตัวอย่างโค้ดต่อไปนี้รหัสแรกแสดงค่าที่ผู้ใช้พิมพ์ลงในช่องข้อความ "txt2" อย่างถูกต้อง ตัวอย่างที่สองระบุว่ามีช่องข้อความว่างอยู่ แต่ถ้าคุณกรอกข้อมูลลงไปก็ยังถือว่าว่างอยู่ ทำไมถึงเป็นแบบนี้?

สามารถทำได้โดยใช้เพียงแค่ตัวเลือกหรือไม่?

รหัสนี้รายงานค่าใน textbox "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

ฉันคิดถูกไหมที่สร้างตัวกรองว่างสำหรับงานนี้ $ ('input [type = text]: ว่าง'). doStuff ();
Antony Carthy

1
อ่านเอกสาร - docs.jquery.com/Selectors/empty Empty สำหรับองค์ประกอบที่ไม่มีลูกไม่ใช่ไม่มีค่า
Russ Cam

คำตอบ:


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

อะไรที่แยกตัวอย่างสุดท้ายของคุณออกจากตัวอย่างที่สองของฉัน ฉันจำเป็นต้องเลือกรหัสเนื่องจากในรหัสจริงฉันจะไม่ดูอินพุตข้อความทั้งหมด ตัวอย่างที่สองของฉันใช้ไม่ได้กับการป้อนข้อมูลของผู้ใช้ แต่ของคุณทำ
Cros

1
ตัวเลือกการทำงานดูเหมือนจะเกี่ยวข้องกับ: ข้อความในตัวเลือก - หากคุณเปิดการสาธิตการทำงานและเพิ่ม / แก้ไข URL คุณสามารถเล่นกับตัวเลือกที่ใช้ หากคุณถอดข้อความ: ตัวเลือกจะทำงานไม่ถูกต้องอีกต่อไปแม้ว่าจะมี $ ('input [value = ""]') ก็ตาม อาจเป็นข้อผิดพลาดในกลไกการเลือก Sizzle แต่ฉันไม่มีเวลาตรวจสอบ อย่างไรก็ตามฉันขอแนะนำให้ใช้แท็กองค์ประกอบในตัวเลือกมิฉะนั้นแต่ละองค์ประกอบจะได้รับการตรวจสอบเพื่อดูว่ามีค่าแอตทริบิวต์ตรงกันหรือไม่
Russ Cam

3
คำตอบที่ดี! แต่คุณอาจต้องการตรวจสอบให้แน่ใจว่าค่าขององค์ประกอบอินพุตเป็นค่าว่างอย่างแท้จริง (ช่องว่าง!) ตรวจสอบให้แน่ใจว่าคุณได้ตัดช่องว่างออกในกรณีนั้น อะไรทำนองนี้$('input:text').filter(function() { return $(this).val().trim() == ""; });
Vineeth Pradhan

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

ฉันกังวลเล็กน้อยเกี่ยวกับการแสดง แต่น่าจะเป็นคำตอบที่ง่ายที่สุด!
aliqandil

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

เหรอ?

อย่างไรก็ตามการโทรของคุณ:

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

สามารถอย่างมากง่ายและเร็วขึ้นด้วย:

$('#cmdSubmit')...

ฉันเดาว่ามีวงเล็บเหลี่ยมปิดหายไป แหล่งที่มาทั่วไปของ jQuery ไม่ทำงานตามที่คาดไว้ยากที่จะสังเกตเห็น: - /
OregonGhost

ตัวอย่างแรกของคุณคือสิ่งที่ตัวอย่างที่ไม่ได้ผลของฉัน ฉันต้องการทราบว่าผู้ใช้เพิ่มข้อความลงในช่องป้อนข้อมูลหรือไม่ตัวอย่างของคุณไม่ทำเช่นนี้
Cros

ฉันรีบมากตัวอย่างของคุณดูเหมือนจะใช้งานได้ แต่ไม่ได้เลือก id ซึ่งฉันต้องทำ
Cros

การทำ "input [id = .. ]" ไม่เหมือนกับ "#" # ไม่ได้ให้อาร์เรย์ของวัตถุ
dev4life

@ dev4life หากคุณใช้หลายองค์ประกอบบนเพจที่มี ID เดียวกันแสดงว่าคุณทำผิด
Sean Kendle

12

ดังที่ได้กล่าวไว้ในโพสต์อันดับสูงสุดสิ่งต่อไปนี้ใช้ได้กับเอ็นจิ้น Sizzle

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

ในความคิดเห็นพบว่าการลบ:textส่วนของตัวเลือกทำให้ตัวเลือกล้มเหลว ฉันเชื่อว่าสิ่งที่เกิดขึ้นคือ Sizzle อาศัยเบราว์เซอร์ที่สร้างขึ้นในเอ็นจิ้นตัวเลือกเมื่อเป็นไปได้ เมื่อ:textถูกเพิ่มลงในตัวเลือกมันจะกลายเป็นตัวเลือก CSS ที่ไม่ได้มาตรฐานดังนั้น Sizzle จึงต้องจัดการเอง ซึ่งหมายความว่า Sizzle ตรวจสอบค่าปัจจุบันของ INPUT แทนที่จะเป็นแอตทริบิวต์ "value" ที่ระบุใน HTML ต้นทาง

ดังนั้นจึงเป็นวิธีที่ชาญฉลาดในการตรวจสอบช่องข้อความว่าง แต่ฉันคิดว่ามันขึ้นอยู่กับพฤติกรรมเฉพาะของเอ็นจิ้น Sizzle (โดยใช้ค่าปัจจุบันของ INPUT แทนแอตทริบิวต์ที่กำหนดในซอร์สโค้ด) แม้ว่า Sizzle อาจส่งคืนองค์ประกอบที่ตรงกับตัวเลือกนี้ แต่document.querySelectorAllจะส่งคืนเฉพาะองค์ประกอบที่มีvalue=""ใน HTML ข้อแม้ emptor


6

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

หลังจากลองหลายเวอร์ชันฉันพบว่านี่เป็นเหตุผลที่สุด

โปรดทราบว่าtextคำนึงถึงขนาดตัวพิมพ์


4

มีคำตอบมากมายที่แนะนำสิ่งที่ต้องการ[value=""]แต่ฉันไม่คิดว่าจะได้ผลจริง . . หรืออย่างน้อยการใช้งานไม่สม่ำเสมอ ฉันกำลังพยายามทำสิ่งที่คล้ายกันโดยเลือกอินพุตทั้งหมดที่มีรหัสเริ่มต้นด้วยสตริงที่ไม่มีค่าที่ป้อน ฉันลองสิ่งนี้:

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

แต่มันไม่ได้ผล และไม่ย้อนกลับ ดูซอนี้ วิธีเดียวที่ฉันพบในการเลือกอินพุตทั้งหมดที่มีรหัสขึ้นต้นด้วยสตริงและไม่มีค่าที่ป้อนได้อย่างถูกต้องคือ

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

และ

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

แต่เห็นได้ชัดว่าเชิงลบสองเท่าทำให้สับสนจริงๆ อาจเป็นไปได้ว่าคำตอบแรกของ Russ Cam (พร้อมฟังก์ชั่นการกรอง) เป็นวิธีการที่ชัดเจนที่สุด


4

จากคำตอบของ @James Wiseman ฉันใช้สิ่งนี้:

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

สิ่งนี้จะจับอินพุตที่มีเฉพาะช่องว่างนอกเหนือจากที่ว่างเปล่าอย่างแท้จริง

ตัวอย่าง: http://jsfiddle.net/e9btdbyn/


3

ฉันขอแนะนำ:

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

2
วิธีนี้ใช้ไม่ได้เพราะ [แอตทริบิวต์] มองหาการมีอยู่ของแอตทริบิวต์ - ไม่ใช่ว่ามีค่าหรือไม่ <input value="">จะยังคงตรงกัน
Ben Hull

สิ่งนี้มีประโยชน์สำหรับฉันเมื่อใช้ Laravel ในการสร้างฟิลด์แบบฟอร์ม (เช่น{{Form::text('first_name', Input::old('first_name'), array('class' => 'form-control', 'required'))}}) เนื่องจาก Laravel ไม่ได้เพิ่มแอตทริบิวต์ "value" หากว่างเปล่า ดังนั้นฉันจึงใช้: $('input:text:not([value]):visible:enabled:first');เพื่อค้นหาช่องป้อนข้อความที่เปิดใช้งานว่างแรกที่มองเห็นได้
Ryan

1

การดำเนินการนี้จะเลือกอินพุตข้อความว่างที่มี id ที่ขึ้นต้นด้วย "txt":

$(':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.