Chọn kiểu nhập văn bản trống bằng jQuery


103

Làm cách nào để xác định các hộp văn bản trống bằng jQuery? Tôi muốn làm điều đó bằng cách sử dụng bộ chọn nếu có thể. Ngoài ra, tôi phải chọn trên id vì trong mã thực nơi tôi muốn sử dụng, tôi không muốn chọn tất cả các đầu vào văn bản.

Trong hai ví dụ mã sau đây của tôi, ví dụ đầu tiên hiển thị chính xác giá trị được người dùng nhập vào hộp văn bản "txt2". Ví dụ thứ hai xác định rằng có một hộp văn bản trống, nhưng nếu bạn điền vào nó vẫn coi nó là trống. Tại sao thế này?

Điều này có thể được thực hiện chỉ bằng cách sử dụng bộ chọn không?

Mã này báo cáo giá trị trong hộp văn bản "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>

Mã này luôn báo cáo hộp văn bản "txt2" là trống:

<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
Có ai biết nếu '[value =]' bỏ qua đầu vào của người dùng và chỉ kiểm tra những gì trong nguồn không?
Cros

Tôi có đúng rằng: bộ lọc trống được tạo cho công việc này không? $ ('input [type = text]: blank'). doStuff ();
Antony Carthy

1
đọc tài liệu - docs.jquery.com/Selectors/empty . Trống là cho các yếu tố mà không có con, không có giá trị
Russ Cam

Câu trả lời:


196

Cách khác

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

hoặc là

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

hoặc là

// 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=""]');

Demo làm việc

mã từ bản demo

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

});

Đối với tôi: if ($ ('[id ^ = txt]'). Filter (function () {return $ (this) .val () == "";}). Length> 0) {alert ('WARNING' ); }
Cros

Điều gì ngăn cách ví dụ cuối cùng của bạn với ví dụ thứ hai của tôi? Tôi cần chọn trên id, vì trong mã thực, tôi sẽ không xem xét tất cả các đầu vào văn bản. Ví dụ thứ hai của tôi không hoạt động với đầu vào của người dùng, nhưng của bạn thì có.
Cros

1
Bộ chọn hoạt động dường như liên quan đến: văn bản trong bộ chọn - nếu bạn mở bản trình diễn đang hoạt động và thêm / chỉnh sửa vào URL, bạn có thể chơi với bộ chọn được sử dụng. Nếu bạn bỏ: text, bộ chọn không còn hoạt động chính xác, ngay cả với $ ('input [value = ""]'). Có thể có lỗi trong công cụ chọn Sizzle, nhưng tôi không có thời gian để điều tra. Nhân tiện, tôi khuyên bạn nên sử dụng thẻ phần tử trong bộ chọn, nếu không, mỗi phần tử sẽ được kiểm tra để xem có khớp với các giá trị thuộc tính hay không.
Russ Cam

3
Câu trả lời rất hay! Nhưng bạn cũng có thể muốn đảm bảo rằng giá trị của phần tử đầu vào là null theo nghĩa đen (khoảng trắng!). Hãy chắc chắn rằng bạn đã cắt bỏ những khoảng trống trong trường hợp đó. Một cái gì đó như thế này$('input:text').filter(function() { return $(this).val().trim() == ""; });
Vineeth Pradhan

31
Lưu ý rằng nếu phần tử có mặt nhưng không có thuộc tính giá trị thì [value=""]bộ chọn sẽ không hoạt động vì nó không tìm thấy thuộc tính giá trị. Tuy nhiên, kỹ thuật .filter không hoạt động trong trường hợp này.
AaronLS

26

Bạn cũng có thể làm điều đó bằng cách xác định bộ chọn của riêng mình:

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

Và sau đó truy cập chúng như thế này:

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

Tôi hơi lo ngại về hiệu suất. Nhưng có lẽ là câu trả lời dễ dàng nhất!
aliqandil

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

?

Nhân tiện, cuộc gọi của bạn về:

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

có thể được đơn giản hóa và tăng tốc rất nhiều với:

$('#cmdSubmit')...

Tôi đoán thiếu một dấu ngoặc vuông đóng. Một nguồn tin chung của jQuery không làm việc như mong đợi, khó có thể nhận ra: - /
OregonGhost

Ví dụ đầu tiên của bạn về cơ bản là những gì ví dụ không hoạt động của tôi làm. Tôi muốn biết liệu người dùng có thêm văn bản vào trường nhập hay không, ví dụ của bạn không làm điều này.
Cros

Tôi đã vội vàng, ví dụ của bạn có vẻ hoạt động, nhưng nó không chọn trên id, điều này tôi phải làm.
Cros

Thực hiện "input [id = ..]" không giống như "#". # không cung cấp cho bạn một mảng đối tượng.
dev4life 14/10/19

@ dev4life nếu bạn đang sử dụng nhiều phần tử trên một trang có cùng một ID, bạn đang làm sai
Sean Kendle

12

Như đã đề cập trong bài đăng được xếp hạng hàng đầu, phần sau hoạt động với công cụ Sizzle.

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

Trong các nhận xét, người ta lưu ý rằng việc xóa :textphần của bộ chọn khiến bộ chọn bị lỗi. Tôi tin rằng điều đang xảy ra là Sizzle thực sự dựa vào công cụ chọn sẵn của trình duyệt khi có thể. Khi :textđược thêm vào bộ chọn, nó sẽ trở thành bộ chọn CSS không chuẩn và do đó, Sizzle phải tự xử lý. Điều này có nghĩa là Sizzle kiểm tra giá trị hiện tại của INPUT, thay vì thuộc tính "value" được chỉ định trong HTML nguồn.

Vì vậy, đó là một cách thông minh để kiểm tra các trường văn bản trống, nhưng tôi nghĩ rằng nó dựa trên một hành vi cụ thể cho công cụ Sizzle (sử dụng giá trị hiện tại của INPUT thay vì thuộc tính được xác định trong mã nguồn). Mặc dù Sizzle có thể trả về các phần tử phù hợp với bộ chọn này, nhưng document.querySelectorAllsẽ chỉ trả về các phần tử có value=""trong HTML. Emptor caveat.


5

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

Sau khi thử rất nhiều phiên bản, tôi thấy điều này là hợp lý nhất.

Lưu ý rằng phân textbiệt chữ hoa chữ thường.


4

Dựa trên câu trả lời của @James Wiseman, tôi đang sử dụng cái này:

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

Điều này sẽ bắt các đầu vào chỉ chứa khoảng trắng bên cạnh những đầu vào 'thực sự' trống.

Ví dụ: http://jsfiddle.net/e9btdbyn/


3

Tôi khuyên bạn nên:

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

2
Điều này sẽ không hoạt động, bởi vì [thuộc tính] tìm kiếm sự hiện diện của một thuộc tính - không phải cho dù nó có giá trị hay không. <input value="">vẫn sẽ phù hợp.
Ben Hull

Điều này rất hữu ích đối với tôi khi sử dụng Laravel để tạo các trường biểu mẫu (ví dụ {{Form::text('first_name', Input::old('first_name'), array('class' => 'form-control', 'required'))}}) vì Laravel không thêm thuộc tính 'giá trị' nếu nó trống. Vì vậy, sau đó tôi đã sử dụng: $('input:text:not([value]):visible:enabled:first');để tìm trường nhập văn bản được kích hoạt trống có thể nhìn thấy đầu tiên.
Ryan

3

Có rất nhiều câu trả lời ở đây gợi ý điều gì đó như thế nào [value=""]nhưng tôi không nghĩ rằng điều đó thực sự hiệu quả. . . hoặc ít nhất, cách sử dụng không nhất quán. Tôi đang cố gắng làm điều gì đó tương tự, chọn tất cả các đầu vào có id bắt đầu bằng một chuỗi nhất định cũng không có giá trị đã nhập. Tôi đã thử điều này:

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

nhưng nó không hoạt động. Cũng không đảo ngược chúng. Xem trò chơi này . Các cách duy nhất tôi tìm thấy để chọn chính xác tất cả các đầu vào có id bắt đầu bằng một chuỗi và không có giá trị đã nhập là

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

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

nhưng rõ ràng, các phủ định kép làm cho điều đó thực sự khó hiểu. Có lẽ, câu trả lời đầu tiên của Russ Cam (có chức năng lọc) là phương pháp rõ ràng nhất.


1

Thao tác này sẽ chọn các đầu vào văn bản trống có id bắt đầu bằng "txt":

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

0

Vì việc tạo đối tượng JQuery cho mọi so sánh không hiệu quả, chỉ cần sử dụng:

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

Sau đó, bạn có thể làm:

$(":input:blank")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.