Cách kiểm tra các đối tượng null trong jQuery


169

Tôi đang sử dụng jQuery và tôi muốn kiểm tra sự tồn tại của một yếu tố trong trang của mình. Tôi đã viết mã sau đây, nhưng nó không hoạt động:

if($("#btext" + i) != null) {
    //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}

Làm cách nào để kiểm tra sự tồn tại của phần tử?

Câu trả lời:


251

Kiểm tra Câu hỏi thường gặp về jQuery ...

Bạn có thể sử dụng thuộc tính độ dài của bộ sưu tập jQuery được bộ chọn của bạn trả về:

if ( $('#myDiv').length ){}

Bạn nghĩ gì về var _myDiv = $ ('# myDiv'); ... .... if (_myDiv.lenght) {...} tạo ngoại lệ.
Nuri YILMAZ

1
như eleotlecram đã nói; tốt hơn nên tránh
.length

5
@AurelianoBuendia, bạn đã sử dụng lenghtthay vì length; đó là một lỗi chính tả.
Sam

4
@numediaweb, eleotlecram không nói tránh .length.
Sam

1
nhưng .. bạn có nhận được lỗi "Không thể đọc thuộc tính 'độ dài" của null không?
SEO Sagive

61

(Vì tôi dường như không có đủ danh tiếng để bỏ phiếu trả lời ...)

Sói đã viết:

Gọi thuộc tính độ dài trên không xác định hoặc đối tượng null sẽ khiến trình duyệt IE và webkit bị lỗi!

Thay vào đó hãy thử điều này:

 // NOTE!! THE FOLLOWING IS WRONG; DO NOT USE!  -- EleotleCram
if($("#something") !== null){
  // do something
}

hoặc là

 // NOTE!! THE FOLLOWING IS WRONG; DO NOT USE!  -- EleotleCram
if($("#something") === null){
  // don't do something
}

Mặc dù đúng là việc gọi thuộc tính độ dài trên một đối tượng không xác định hoặc null sẽ khiến trình duyệt không thành công, kết quả của các bộ chọn của jQuery ($ ('...')) sẽ không bao giờ là null hoặc không xác định. Do đó, các đề xuất mã không có ý nghĩa. Sử dụng một trong những câu trả lời khác, chúng có ý nghĩa hơn.


(Cập nhật 2012) Bởi vì mọi người nhìn vào mã và câu trả lời này khá cao trong danh sách: Trong vài năm qua, tôi đã sử dụng plugin nhỏ này:

  jQuery.fn['any'] = function() {
     return (this.length > 0);
  };

Tôi nghĩ $ ('div'). Any () đọc tốt hơn $ ('div'). Độ dài , cộng với bạn sẽ không phải chịu nhiều lỗi chính tả: $ ('div'). Ayn () sẽ báo lỗi thời gian chạy , $ ('div'). chiều dài rất có thể sẽ luôn bị giả mạo.

__
Chỉnh sửa tháng 11 năm 2012:

1) Vì mọi người có xu hướng nhìn vào mã và không đọc những gì được nói xung quanh mã, tôi đã thêm hai ghi chú lector lớn vào mã được trích dẫn của Wolf.
2) Tôi đã thêm mã của plugin nhỏ tôi sử dụng cho tình huống này.


2
@VovaPopov: Tôi đề nghị lần sau bạn dành thêm một chút thời gian để đọc câu trả lời. Tôi chỉ đơn thuần nói rằng ví dụ mã "của Wolf" là không chính xác. Tôi không bao giờ cung cấp một câu trả lời, chỉ đề cập đến một số câu trả lời khác có ý nghĩa hơn.
eleotlecram

Câu trả lời tốt. Tôi xin lỗi mọi người giải thích sai.
Joe Simmons

14

Hàm tra cứu trả về một mảng các phần tử phù hợp. Bạn có thể kiểm tra nếu độ dài bằng không. Lưu ý thay đổi để chỉ tra cứu các yếu tố một lần và sử dụng lại kết quả khi cần thiết.

var elem = $("#btext" + i);
if (elem.length != 0) {
   elem.text("Branch " + i);
}

Ngoài ra, bạn đã thử chỉ sử dụng chức năng văn bản - nếu không có phần tử nào tồn tại, nó sẽ không làm gì cả.

$("#btext" + i).text("Branch " + i);

7
0 là một giá trị sai, vì vậy biểu thức elem.length ước tính thành sai - nói cách khác, không cần phần '! = 0'
James

2
@ 999, tôi nghĩ rằng kiểm tra so với số 0 giúp mã dễ đọc hơn, mặc dù cả hai cách đều có thể đọc được đối với những người đã sử dụng ngôn ngữ script.
Sam

12

Hàm jquery $ () luôn trả về giá trị không null - các phần tử trung bình khớp với bạn chọn cretaria. Nếu phần tử không được tìm thấy, nó sẽ trả về một mảng trống. Vì vậy, mã của bạn sẽ trông giống như thế này -

if ($("#btext" + i).length){
        //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}

1
Tôi không nghĩ đúng là $ () trả về một mảng. Các đối tượng jQuery có các hành vi tương tự như các mảng, nhưng tôi không nghĩ chúng thực sự là các mảng và tôi nghĩ rằng bạn sẽ thấy rằng không phải tất cả các hành vi của chúng đều giống như các mảng. Xem trình diễn nhanh này .
Sam

5

Trong jQuery 1.4, bạn có được hàm $ .isEmptyObject, nhưng nếu bạn buộc phải sử dụng phiên bản cũ hơn của jQ như chúng tôi, các nhà phát triển Drupal nghèo chỉ ăn cắp sử dụng mã này:

// This is a function similar to the jQuery 1.4 $.isEmptyObject.
function isObjectEmpty(obj) {
  for ( var name in obj ) {
    return false;
  }
  return true;
}

Sử dụng nó như:

console.log(isObjectEmpty(the_object)); // Returns true or false.

Điều này không giải quyết câu hỏi.
Sam

5

bất kể bạn chọn gì là hàm $()luôn trả về một đối tượng jQuery để không thể sử dụng để kiểm tra. Cách tốt nhất (nếu không phải là duy nhất) là sử dụng size()hàm hoặc thuộc tính độ dài riêng như đã giải thích ở trên.

if ( $('selector').size() ) {...}                   

3
if ( $('#whatever')[0] ) {...}

Đối tượng jQuery được trả về bởi tất cả các phương thức jQuery gốc KHÔNG phải là một mảng, nó là một đối tượng có nhiều thuộc tính; một trong số họ là một tài sản "chiều dài". Bạn cũng có thể kiểm tra kích thước () hoặc get (0) hoặc get () - 'get (0)' hoạt động tương tự như truy cập phần tử đầu tiên, tức là $ (elem) [0]


3

Còn việc sử dụng "không xác định" thì sao?

if (value != undefined){ // do stuff } 

1

sử dụng $("#selector").get(0)để kiểm tra với null như thế. nhận được trả về phần tử dom, cho đến khi đó bạn đang xử lý một mảng, nơi bạn cần kiểm tra thuộc tính độ dài. Cá nhân tôi không thích kiểm tra độ dài để xử lý null, vì một số lý do khiến tôi bối rối :)


Thật thú vị khi những người khác nhau nghĩ khác nhau; Tôi nghĩ sẽ hợp lý hơn nếu kiểm tra xem số lượng phần tử có bằng không thay vì kiểm tra xem phần tử đầu tiên có mặt hay không.
Sam

1

Sử dụng tài sản chiều dài bạn có thể làm điều này.

jQuery.fn.exists = function(){return ($(this).length < 0);}
if ($(selector).exists()) { 
   //do somthing
}

2
Ý bạn là (cái này) .length> 0?
sage88

0

Khi đối tượng trống, trả về lỗi này:

Uncaught TypeError: Cannot read property '0' of null

Tôi thử mã này:

try{
  if ($("#btext" + i).length) {};               
}catch(err){
  if ($("#btext" + i).length) {
     //working this code if the item, not NULL 
   }
}

-4
if (typeof($("#btext" + i)) == 'object'){
    $("#btext" + i).text("Branch " + i);
}

-7

Gọi thuộc tính độ dài trên không xác định hoặc đối tượng null sẽ khiến trình duyệt IE và webkit bị lỗi!

Thay vào đó hãy thử điều này:

if($("#something") !== null){
  // do something
}

hoặc là

if($("#something") === null){
  // don't do something
}
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.