Làm cách nào để phát hiện nếu bộ chọn trả về null?


271

Cách tốt nhất để phát hiện nếu bộ chọn jQuery trả về một đối tượng trống. Nếu bạn làm:

alert($('#notAnElement'));

bạn nhận được [Object Object], vì vậy cách tôi làm bây giờ là:

alert($('#notAnElement').get(0));

sẽ viết "không xác định" và vì vậy bạn có thể kiểm tra xem. Nhưng có vẻ rất tệ. Có cách nào khác không?

Câu trả lời:


494

Yêu thích của tôi là mở rộng jQuery với sự tiện lợi nhỏ bé này:

$.fn.exists = function () {
    return this.length !== 0;
}

Được sử dụng như:

$("#notAnElement").exists();

Rõ ràng hơn là sử dụng chiều dài.


2
Tại sao bạn lại bọc 'cái này' bên trong $ ()? 'cái này' trong ngữ cảnh này có thực sự trỏ đến đối tượng jQuery không?
Adham Atta

1
Tôi thấy rằng trở về thislà hữu ích hơn nhiều true. Xem câu trả lời của tôi về presencephương pháp của Rails .
Marc-André Lafortune

5
Nếu bạn muốn duy trì khả năng xâu chuỗi, hàm sẽ trả về đúng hay nếu bạn muốn sử dụng phương thức này để gán thischo một biến, tôi khuyên bạn nên thay đổi câu lệnh return thành CSharp .
Hanna

1
Magnar, bạn có thể vui lòng giải thích chức năng "mở rộng" này thực sự hoạt động như thế nào không? Tôi cho rằng đó là một khái niệm Javascript chứ không phải là một khái niệm JQuery. Tôi đã xem xét nguyên mẫu nhưng tôi không chắc liệu điều đó có áp dụng ở đây không và tại sao cú pháp sẽ là "$ .fn."
KyleM

3
@Adam Có. Nhưng trong trường hợp đó, bạn chỉ nên bỏ kiểm tra tồn tại, đưa ra cách thức hoạt động của jQuery. Nó sẽ không làm gì nếu không có phần tử phù hợp với bộ chọn.
Magnar

197
if ( $("#anid").length ) {
  alert("element(s) found")
} 
else {
  alert("nothing found")
}

67

Bộ chọn trả về một mảng các đối tượng jQuery. Nếu không tìm thấy phần tử phù hợp, nó sẽ trả về một mảng trống. Bạn có thể kiểm tra .lengthbộ sưu tập được bộ chọn trả về hoặc kiểm tra xem phần tử mảng đầu tiên có 'không xác định' hay không.

Bạn có thể sử dụng bất kỳ ví dụ nào sau đây trong câu lệnh IF và tất cả chúng đều tạo ra cùng một kết quả. Đúng, nếu bộ chọn tìm thấy một phần tử phù hợp, thì ngược lại.

$('#notAnElement').length > 0
$('#notAnElement').get(0) !== undefined
$('#notAnElement')[0] !== undefined

1
Tôi sử dụng .lengthtrừ khi mã nóng. Đó chắc chắn là rõ ràng nhất với ý định. Ngoài ra, .size()không được chấp nhận và đã được nhiều năm (kể từ 1.8). Tôi sẽ chỉnh sửa câu trả lời của bạn và xóa nó đi, cứ thoải mái thêm lại bằng một ghi chú nhưng nó quá cũ, tôi nghĩ nó tốt hơn hết.
Evan Carroll

1
Về mặt kỹ thuật, nó trả về một đối tượng jQuery không chứa các nút DOM. Nói rằng nó trả về một mảng trống không đúng.
Vigrant

39

Tôi thích làm một cái gì đó như thế này:

$.fn.exists = function(){
    return this.length > 0 ? this : false;
}

Vì vậy, sau đó bạn có thể làm một cái gì đó như thế này:

var firstExistingElement = 
    $('#iDontExist').exists() ||      //<-returns false;
    $('#iExist').exists() ||          //<-gets assigned to the variable 
    $('#iExistAsWell').exists();      //<-never runs

firstExistingElement.doSomething();   //<-executes on #iExist

http://jsfiddle.net/vhbSG/


6
@Ehsan Trên thực tế, đây không phải là bản sao của câu trả lời được chấp nhận ... lưu ý rằng câu trả lời được chấp nhận chỉ trả về true / false trong khi câu trả lời này trả về đối tượng ban đầu ("này") hoặc sai. Câu trả lời này cho phép bạn thực hiện các công cụ bổ sung với giá trị trả về (chẳng hạn như chuỗi chức năng bổ sung) nếu nó không sai.
RSW

1
Tôi có chính xác cùng một mã trong bộ công cụ tiêu chuẩn của tôi. Biểu mẫu này tương đương với object.presence trong Rails và siêu hữu ích trong cấu trúc dự phòng mà @CSharp mô tả.
inopinatus

Đây là một câu trả lời tốt, nhưng sẽ hữu ích nếu bạn giải thích điều gì xảy ra nếu KHÔNG tồn tại các yếu tố được kiểm tra. Câu trả lời ngắn : TypeError: firstExistingElement.doSomething is not a function. Bạn có thể gói toàn bộ phép gán / kiểm tra biến trong if () và chỉ làm một cái gì đó nếu tìm thấy một phần tử ....
Stephen R

9

Tôi thích sử dụng presence, lấy cảm hứng từ Ruby on Rails :

$.fn.presence = function () {
    return this.length !== 0 && this;
}

Ví dụ của bạn trở thành:

alert($('#notAnElement').presence() || "No object found");

Tôi thấy nó vượt trội so với đề xuất $.fn.existsbởi vì bạn vẫn có thể sử dụng các toán tử boolean hoặc if, nhưng kết quả trung thực là hữu ích hơn. Một vi dụ khac:

$ul = $elem.find('ul').presence() || $('<ul class="foo">').appendTo($elem)
$ul.append('...')

7

Sở thích của tôi và tôi không biết tại sao điều này chưa có trong jQuery:

$.fn.orElse = function(elseFunction) {
  if (!this.length) {
    elseFunction();
  }
};

Được sử dụng như thế này:

$('#notAnElement').each(function () {
  alert("Wrong, it is an element")
}).orElse(function() {
  alert("Yup, it's not an element")
});

Hoặc, như trong CoffeeScript:

$('#notAnElement').each ->
  alert "Wrong, it is an element"; return
.orElse ->
  alert "Yup, it's not an element"


0

Bạn có thể muốn làm điều này mọi lúc theo mặc định. Tôi đã vật lộn để bọc hàm jquery hoặc phương thức jquery.fn.init để làm điều này mà không gặp lỗi, nhưng bạn có thể thực hiện một thay đổi đơn giản cho nguồn jquery để làm điều này. Bao gồm một số dòng xung quanh bạn có thể tìm kiếm. Tôi khuyên bạn nên tìm kiếm nguồn jquery choThe jQuery object is actually just the init constructor 'enhanced'

var
  version = "3.3.1",

  // Define a local copy of jQuery
  jQuery = function( selector, context ) {

    // The jQuery object is actually just the init constructor 'enhanced'
    // Need init if jQuery is called (just allow error to be thrown if not included)
    var result = new jQuery.fn.init( selector, context );
    if ( result.length === 0 ) {
      if (window.console && console.warn && context !== 'failsafe') {
        if (selector != null) {
          console.warn(
            new Error('$(\''+selector+'\') selected nothing. Do $(sel, "failsafe") to silence warning. Context:'+context)
          );
        }
      }
    }
    return result;
  },

  // Support: Android <=4.0 only
  // Make sure we trim BOM and NBSP
  rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;

jQuery.fn = jQuery.prototype = {

Cuối cùng nhưng không kém phần quan trọng, bạn có thể lấy mã nguồn jquery không nén tại đây: http://code.jquery.com/

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.