Có một chức năng nào đó tồn tại trên mạng cho jQuery không?


2778

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

Mã hiện tại mà tôi có là:

if ($(selector).length > 0) {
    // Do something
}

Có cách nào thanh lịch hơn để tiếp cận điều này? Có lẽ là một plugin hoặc một chức năng?

Câu trả lời:


2490

Trong JavaScript, mọi thứ đều là 'sự thật' hoặc 'giả mạo' và đối với các số 0(và NaN) có nghĩa là false, mọi thứ khác true. Vì vậy, bạn có thể viết:

if ($(selector).length)

Bạn không cần >0phần đó .


52
@ abhirathore2006 Nếu bạn sử dụng bộ chọn id và phần tử không tồn tại thì độ dài là 0 và không ném ngoại lệ.
Robert

14
Thật thú vị NaN != false.
Robert

35
@Robert và [] + []= ""... ahh Tôi yêu javascript
James

9
@James Đó là bởi vì [].toString() === [].join(',') === """" === "".
Ismael Miguel

5
@Robert vàtypeof NaN == 'number'
oriadam

1356

Đúng!

jQuery.fn.exists = function(){ return this.length > 0; }

if ($(selector).exists()) {
    // Do something
}

Điều này là để đáp lại: podcast mã Herding với Jeff Atwood


254
Tôi chỉ viết: if ($ (bộ chọn) .length) {...} mà không có '> 0'
vsync

369
$.fn.existsVí dụ của bạn đang thay thế một tra cứu thuộc tính (giá rẻ!) Bằng hai lệnh gọi hàm, đắt hơn nhiều và một trong những lệnh gọi đó tạo lại một đối tượng jQuery mà bạn đã có, điều này thật ngớ ngẩn.
C Snover

212
@redsapes: Khả năng đọc mã là lý do tốt nhất để thêm loại hàm này trên jQuery. Có một cái gì đó được gọi là .existsđọc sạch sẽ, trong khi .lengthđọc như một cái gì đó khác biệt về mặt ngữ nghĩa, ngay cả khi ngữ nghĩa trùng khớp với một kết quả giống hệt nhau.
Ben Zotto

48
@quixoto, xin lỗi, nhưng .length là một tiêu chuẩn trên nhiều ngôn ngữ không cần gói. Làm thế nào khác để bạn giải thích .length?
redsapes

144
Theo tôi, đó là ít nhất một sự chuyển hướng logic từ khái niệm "độ dài danh sách lớn hơn 0" đến khái niệm "phần tử tôi đã viết một bộ chọn tồn tại". Vâng, chúng giống nhau về mặt kỹ thuật, nhưng sự trừu tượng về khái niệm ở một cấp độ khác. Điều này khiến một số người thích một chỉ số rõ ràng hơn, thậm chí với một số chi phí hiệu suất.
Ben Zotto

377

Nếu bạn đã sử dụng

jQuery.fn.exists = function(){return ($(this).length > 0);}
if ($(selector).exists()) { }

bạn sẽ ám chỉ rằng chuỗi là có thể khi nó không.

Điều này sẽ tốt hơn:

jQuery.exists = function(selector) {return ($(selector).length > 0);}
if ($.exists(selector)) { }

Ngoài ra, từ Câu hỏi thường gặp :

if ( $('#myDiv').length ) { /* Do something */ }

Bạn cũng có thể sử dụng như sau. Nếu không có giá trị nào trong mảng đối tượng jQuery thì việc nhận mục đầu tiên trong mảng sẽ trả về không xác định.

if ( $('#myDiv')[0] ) { /* Do something */ }

11
Phương pháp đầu tiên đọc tốt hơn. $ ("a"). tồn tại () đọc là "nếu <a> phần tử tồn tại." $ .exists ("a") đọc là "nếu có tồn tại <a> phần tử."
strager

16
đúng nhưng một lần nữa, bạn đang ám chỉ rằng việc xâu chuỗi là có thể và nếu tôi đã cố gắng làm một cái gì đó như $ (bộ chọn) .exists (). css ("color", "red") thì nó sẽ không hoạt động và sau đó tôi sẽ = * (
Jon Erickson

19
Đã có các phương thức không thể kết nối được, như các hàm attr và dữ liệu. Mặc dù vậy, tôi thấy quan điểm của bạn và về giá trị của nó, tôi chỉ kiểm tra độ dài> 0 dù sao đi nữa.
Matthew Crumley

39
Tại sao trên trái đất bạn sẽ cần phải chuỗi này? $(".missing").css("color", "red")đã làm điều đúng đắn (tức là không có gì)
Ben Blank

15
Các công cụ về chuỗi hoàn tất là tosh - có rất nhiều$.fn phương thức jQuery trả về một cái gì đó không phải là một đối tượng jQuery mới và do đó không có chuỗi.
Alnitak

136

Bạn có thể sử dụng điều này:

// if element exists
if($('selector').length){ /* do something */ }

// if element does not exist
if(!$('selector').length){ /* do something */ }

134
Bạn không thấy rằng Tim Büthe đã đưa ra câu trả lời này 2 năm trước bạn phải không?
Th4t Guy

101
Pfft, Tim không bao giờ chỉ ra cách kiểm tra nếu phần tử không tồn tại.
Jeremy W

1
Bạn có nghĩa là cuộc sống "khác"? Q của tôi là thế này: err, nó phải tồn tại hoặc bộ chọn không khớp. Chiều dài là thừa.
RichieHH

26
câu trả lời và nhận xét này tổng hợp cách hoạt động của stackoverflow
vào

101

Cách nhanh nhất và tự giải thích về mặt ngữ nghĩa nhất để kiểm tra sự tồn tại thực ra là sử dụng đơn giản JavaScript:

if (document.getElementById('element_id')) {
    // Do something
}

Nó dài hơn một chút để viết so với thay thế độ dài jQuery, nhưng thực thi nhanh hơn vì nó là một phương thức JS gốc.

Và nó là tốt hơn so với thay thế bằng văn bản jQuerychức năng của riêng bạn . Sự thay thế đó chậm hơn, vì những lý do @snover đã nêu. Nhưng nó cũng sẽ tạo cho các lập trình viên khác ấn tượng rằng exists()hàm này là thứ gì đó vốn có của jQuery. JavaScriptsẽ / nên được hiểu bởi những người khác chỉnh sửa mã của bạn, mà không tăng nợ kiến ​​thức.

Lưu ý: Lưu ý thiếu '#' trước element_id(vì đây là JS đơn giản, không phải jQuery).


56
Hoàn toàn không giống nhau. Bộ chọn JQuery có thể được sử dụng cho bất kỳ quy tắc CSS nào - ví dụ $('#foo a.special'). Và nó có thể trả về nhiều hơn một yếu tố. getElementByIdkhông thể bắt đầu tiếp cận điều đó
kikito

7
Bạn đúng ở chỗ nó không được áp dụng rộng rãi như bộ chọn. Tuy nhiên, nó thực hiện công việc khá tốt trong trường hợp phổ biến nhất (kiểm tra xem có tồn tại một yếu tố nào không). Các lý lẽ của tự giải thích và tốc độ vẫn đứng.
Magne

29
@Noz if(document.querySelector("#foo a.special"))sẽ làm việc. Không cần jQuery.
Bầu trời xanh

34
Đối số về tốc độ trong các công cụ JS chỉ chết trong suy nghĩ của những người không thể hoạt động mà không có jQuery, vì đó là đối số mà họ không thể thắng.
Bầu trời xanh

22
Nhớ những ngày xưa tốt đẹp khi document.getEuityById là tất cả những gì chúng ta có? Và tôi luôn quên tài liệu. và không thể hiểu tại sao nó không hoạt động. Và tôi luôn đánh vần sai và nhận sai ký tự.
JustJohn

73

Bạn có thể lưu một vài byte bằng cách viết:

if ($(selector)[0]) { ... }

Điều này hoạt động vì mỗi đối tượng jQuery cũng giả dạng như một mảng, vì vậy chúng ta có thể sử dụng toán tử hội nghị mảng để lấy mục đầu tiên từ mảng . Nó trả về undefinednếu không có mục nào trong chỉ mục được chỉ định.


1
Tôi đến đây để gửi câu trả lời này chính xác ... fiddle bắt buộc: jsfiddle.net/jasonwilczak/ekjj80gy/2
JasonWilczak

3
@JasonWilczak Hãy chú ý tại sao không thay vào đó: .eq [0] hoặc .first () để chỉ một yếu tố đầu tiên được tìm thấy thay vì kiểu đúc?
Jean Paul AKA kéo dài

5
Không, jQuery.first()hoặc jQuery.eq(0)cả hai đối tượng trả về, các đối tượng là trung thực ngay cả khi chúng trống rỗng. Ví dụ này sẽ minh họa tại sao các chức năng này không thể được sử dụng nguyên trạng:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
Salman A

1
Chính xác. .eq(0)trả về chỉ một đối tượng jQuery khác bị cắt ngắn theo chiều dài 1 hoặc 0. .first()chỉ là một phương thức thuận tiện cho .eq(0). Nhưng .get(0)trả về phần tử DOM đầu tiên hoặc undefinedvà giống như [0]. Phần tử DOM đầu tiên trong một đối tượng jQuery được lưu trữ trong thuộc tính đối tượng thông thường có tên '0'. Đó là một truy cập tài sản đơn giản. Việc truyền kiểu duy nhất bắt nguồn từ việc chuyển đổi ngầm định số 0thành chuỗi '0'. Vì vậy, nếu kiểu đúc là một vấn đề bạn có thể sử dụng $.find(selector)['0']thay thế.
Robert

66

Bạn có thể dùng:

if ($(selector).is('*')) {
  // Do something
}

Thanh lịch hơn một chút , có lẽ.


38
Điều này là quá nhiều cho một điều đơn giản như vậy. xem câu trả lời của Tim Büthe
vsync

Đây là câu trả lời chính xác. Phương thức 'độ dài' có vấn đề là nó cho kết quả dương tính giả với bất kỳ số nào, ví dụ: $ (666) .length // trả về 1, nhưng đó không phải là một công cụ chọn hợp lệ
Earnaz

Điều này là vô cùng tốn kém cho nhiệm vụ rất đơn giản. Chỉ cần nhìn vào triển khai jquery nếu .is () và bạn sẽ thấy nó cần bao nhiêu mã để xử lý câu hỏi đơn giản này. Ngoài ra, không rõ ràng những gì bạn muốn làm chính xác, vì vậy nó là tương tự hoặc có thể ít thanh lịch hơn sau đó giải pháp trong câu hỏi.
micropro.cz

1
@earnaz điểm tuyệt vời, bắt đẹp. Tuy nhiên, tôi không thấy nơi đó thực sự là một mối quan tâm đáng giá. Các nhà phát triển xác định các yếu tố có 666thể có nhiều lý do khác khiến mã của họ bị hỏng. Mặc dù nó là một bộ chọn không hợp lệ, $ (666) .length là javascript hợp lệ : Nó đánh giá là trung thực và do đó sẽ đáp ứng điều kiện.
Todd

@earnaz để tránh trường hợp cụ thể, $.find(666).lengthhoạt động.
Emile Bergeron

66

Plugin này có thể được sử dụng trong một iftuyên bố như if ($(ele).exist()) { /* DO WORK */ }hoặc sử dụng một cuộc gọi lại.

Cắm vào

;;(function($) {
    if (!$.exist) {
        $.extend({
            exist: function() {
                var ele, cbmExist, cbmNotExist;
                if (arguments.length) {
                    for (x in arguments) {
                        switch (typeof arguments[x]) {
                            case 'function':
                                if (typeof cbmExist == "undefined") cbmExist = arguments[x];
                                else cbmNotExist = arguments[x];
                                break;
                            case 'object':
                                if (arguments[x] instanceof jQuery) ele = arguments[x];
                                else {
                                    var obj = arguments[x];
                                    for (y in obj) {
                                        if (typeof obj[y] == 'function') {
                                            if (typeof cbmExist == "undefined") cbmExist = obj[y];
                                            else cbmNotExist = obj[y];
                                        }
                                        if (typeof obj[y] == 'object' && obj[y] instanceof jQuery) ele = obj[y];
                                        if (typeof obj[y] == 'string') ele = $(obj[y]);
                                    }
                                }
                                break;
                            case 'string':
                                ele = $(arguments[x]);
                                break;
                        }
                    }
                }

                if (typeof cbmExist == 'function') {
                    var exist =  ele.length > 0 ? true : false;
                    if (exist) {
                        return ele.each(function(i) { cbmExist.apply(this, [exist, ele, i]); });
                    }
                    else if (typeof cbmNotExist == 'function') {
                        cbmNotExist.apply(ele, [exist, ele]);
                        return ele;
                    }
                    else {
                        if (ele.length <= 1) return ele.length > 0 ? true : false;
                        else return ele.length;
                    }
                }
                else {
                    if (ele.length <= 1) return ele.length > 0 ? true : false;
                    else return ele.length;
                }

                return false;
            }
        });
        $.fn.extend({
            exist: function() {
                var args = [$(this)];
                if (arguments.length) for (x in arguments) args.push(arguments[x]);
                return $.exist.apply($, args);
            }
        });
    }
})(jQuery);

jsFiddle

Bạn có thể chỉ định một hoặc hai cuộc gọi lại. Cái thứ nhất sẽ bắn nếu phần tử tồn tại, cái thứ hai sẽ bắn nếu phần tử không tồn tại. Tuy nhiên, nếu bạn chọn chỉ truyền một hàm, nó sẽ chỉ kích hoạt khi phần tử tồn tại. Do đó, chuỗi sẽ chết nếu phần tử được chọn không tồn tại. Tất nhiên, nếu nó tồn tại, chức năng đầu tiên sẽ kích hoạt và chuỗi sẽ tiếp tục.

Hãy nhớ rằng việc sử dụng biến thể gọi lại giúp duy trì khả năng liên kết chuỗi - phần tử được trả về và bạn có thể tiếp tục xâu chuỗi các lệnh như với bất kỳ phương thức jQuery nào khác!

Ví dụ sử dụng

if ($.exist('#eleID')) {    /*    DO WORK    */ }        //    param as STRING
if ($.exist($('#eleID'))) { /*    DO WORK    */ }        //    param as jQuery OBJECT
if ($('#eleID').exist()) {  /*    DO WORK    */ }        //    enduced on jQuery OBJECT

$.exist('#eleID', function() {            //    param is STRING && CALLBACK METHOD
    /*    DO WORK    */
    /*    This will ONLY fire if the element EXIST    */
}, function() {            //    param is STRING && CALLBACK METHOD
    /*    DO WORK    */
    /*    This will ONLY fire if the element DOES NOT EXIST    */
})

$('#eleID').exist(function() {            //    enduced on jQuery OBJECT with CALLBACK METHOD
    /*    DO WORK    */
    /*    This will ONLY fire if the element EXIST    */
})

$.exist({                        //    param is OBJECT containing 2 key|value pairs: element = STRING, callback = METHOD
    element: '#eleID',
    callback: function() {
        /*    DO WORK    */
        /*    This will ONLY fire if the element EXIST    */
    }
})

1
Trên phiên bản gọi lại, không nên Has Itemsgọi lại thực sự trong đối tượng làm đối số?
Chris Marisic

62

Tôi thấy hầu hết các câu trả lời ở đây đều không chính xác vì chúng phải như vậy, chúng kiểm tra độ dài phần tử, nó có thể ổn trong nhiều trường hợp, nhưng không phải 100% , hãy tưởng tượng nếu số chuyển sang hàm thay vào đó, vì vậy tôi thử nghiệm một hàm để kiểm tra tất cả điều kiện và trả lại câu trả lời như mong muốn:

$.fn.exists = $.fn.exists || function() { 
  return !!(this.length && (this[0] instanceof HTMLDocument || this[0] instanceof HTMLElement)); 
}

Điều này sẽ kiểm tra cả chiều dài và loại, Bây giờ bạn có thể kiểm tra theo cách này:

$(1980).exists(); //return false
$([1,2,3]).exists(); //return false
$({name: 'stackoverflow', url: 'http://www.stackoverflow.com'}).exists(); //return false
$([{nodeName: 'foo'}]).exists() // returns false
$('div').exists(); //return true
$('.header').exists(); //return true
$(document).exists(); //return true
$('body').exists(); //return true

55

Không cần jQuery thực sự. Với JavaScript đơn giản, dễ dàng hơn và chính xác về mặt ngữ nghĩa để kiểm tra:

if(document.getElementById("myElement")) {
    //Do something...
}

Nếu vì bất kỳ lý do nào bạn không muốn đặt id cho phần tử, bạn vẫn có thể sử dụng bất kỳ phương thức JavaScript nào khác được thiết kế để truy cập DOM.

jQuery thực sự rất tuyệt, nhưng đừng để JavaScript thuần túy rơi vào quên lãng ...


5
Tôi biết: nó không trả lời trực tiếp câu hỏi ban đầu (yêu cầu hàm jquery), nhưng trong trường hợp đó, câu trả lời sẽ là "Không" hoặc "không phải là một giải pháp đúng ngữ nghĩa".
amypellegrini

Điều gì nếu bạn cần một bộ chọn cha mẹ :has()?
Toàn cảnh

54

Bạn có thể sử dụng điều này:

jQuery.fn.extend({
    exists: function() { return this.length }
});

if($(selector).exists()){/*do something*/}

43

Lý do tất cả các câu trả lời trước yêu cầu .lengththam số là vì chúng chủ yếu sử dụng $()bộ chọn của jquery có truy vấnSelectorTất sau màn cửa (hoặc chúng đang sử dụng trực tiếp). Phương pháp này khá chậm vì nó cần phân tích toàn bộ cây DOM để tìm tất cả các kết quả khớp với bộ chọn đó và điền vào một mảng với chúng.

Tham số ['length'] là không cần thiết hoặc hữu ích và mã sẽ nhanh hơn rất nhiều nếu bạn trực tiếp sử dụng document.querySelector(selector)thay thế, bởi vì nó trả về phần tử đầu tiên mà nó khớp hoặc null nếu không tìm thấy.

function elementIfExists(selector){  //named this way on purpose, see below
    return document.querySelector(selector);
}
/* usage: */
var myelement = elementIfExists("#myid") || myfallbackelement;

Tuy nhiên phương pháp này để lại cho chúng ta đối tượng thực tế được trả về; Sẽ tốt nếu nó không được lưu dưới dạng biến và được sử dụng nhiều lần (do đó giữ tham chiếu xung quanh nếu chúng ta quên).

var myel=elementIfExists("#myid");
// now we are using a reference to the element which will linger after removal
myel.getParentNode.removeChild(myel);
console.log(elementIfExists("#myid")); /* null */
console.log(myel); /* giant table lingering around detached from document */
myel=null; /* now it can be garbage collected */

Trong một số trường hợp điều này có thể được mong muốn. Nó có thể được sử dụng trong một vòng lặp for như thế này:

/* locally scoped myel gets garbage collected even with the break; */
for (var myel; myel = elementIfExist(sel); myel.getParentNode.removeChild(myel))
    if (myel == myblacklistedel) break;

Nếu bạn không thực sự cần yếu tố này và muốn nhận / lưu trữ chỉ là đúng / sai, thì chỉ cần tăng gấp đôi thôi !! Nó hoạt động cho những đôi giày được cởi trói, vậy tại sao lại thắt nút ở đây?

function elementExists(selector){
    return !!document.querySelector(selector);
}
/* usage: */
var hastables = elementExists("table");  /* will be true or false */
if (hastables){
    /* insert css style sheet for our pretty tables */
}
setTimeOut(function (){if (hastables && !elementExists("#mytablecss"))
                           alert("bad table layouts");},3000);

40

$.contains()những gì bạn muốn?

jQuery.contains( container, contained )

Các $.contains()phương thức trả về true nếu phần tử DOM được cung cấp bởi đối số thứ hai là một hậu duệ của phần tử DOM được cung cấp bởi đối số đầu tiên, cho dù đó là một đứa trẻ trực tiếp hoặc lồng nhau sâu sắc hơn. Nếu không, nó trả về false. Chỉ các nút phần tử được hỗ trợ; nếu đối số thứ hai là nút văn bản hoặc nút nhận xét, $.contains()sẽ trả về false.

Lưu ý : Đối số đầu tiên phải là một thành phần DOM, không phải là đối tượng jQuery hoặc đối tượng JavaScript đơn giản.


3
Điều này không chấp nhận bộ chọn, có nghĩa là anh ta sẽ phải chọn nó, điều đó có nghĩa là anh ta chỉ cần kiểm tra kết quả của lựa chọn của mình.

39

Tôi đã tìm thấy if ($(selector).length) {}là không đủ. Nó sẽ âm thầm phá vỡ ứng dụng của bạn khi selectorlà một đối tượng trống {}.

var $target = $({});        
console.log($target, $target.length);

// Console output:
// -------------------------------------
// [▼ Object              ] 1
//    ► __proto__: Object

Đề nghị duy nhất của tôi là thực hiện một kiểm tra bổ sung cho {}.

if ($.isEmptyObject(selector) || !$(selector).length) {
    throw new Error('Unable to work with the given selector.');
}

Tôi vẫn đang tìm kiếm một giải pháp tốt hơn mặc dù vì đây là một giải pháp hơi nặng.

Chỉnh sửa: CẢNH BÁO! Điều này không hoạt động trong IE khi selectorlà một chuỗi.

$.isEmptyObject('hello') // FALSE in Chrome and TRUE in IE

12
Bạn có thường xuyên thấy mình gọi $()với một đối tượng trống làm đối số không?
nnnnnn

@nnnnnn Thực tế không bao giờ (Tôi không sử dụng jQuery nữa). Nhưng tôi đoán 3 năm trước tôi đã gặp trường hợp phơi bày một API sẽ lấy bộ chọn và trả về số lượng phần tử cho bộ chọn đó. Nếu một nhà phát triển khác sẽ vượt qua trong một đối tượng trống, nó sẽ phản hồi không chính xác với 1.
Oleg

3
Tại sao trên trái đất bạn sẽ vượt qua một đối tượng rỗng {}để $()?
Tất cả công nhân là thiết yếu

7
@cpburnz tại sao bạn hỏi tôi? Tôi chỉ là một nhà cung cấp API ... Mọi người chuyển mọi thứ ngu ngốc cho API.
Oleg

4
Chỉ cần chú ý, chủ đề vấn đề jquery mà @FagnerBrack tham chiếu đã được cập nhật ngay sau khi nhận xét của anh ấy; Dường như nó sẽ không biến mất sau tất cả.
Joseph Gabriel

38

Bạn có thể kiểm tra phần tử có mặt hay không sử dụng độ dài trong tập lệnh java. Nếu độ dài lớn hơn 0 thì phần tử có mặt nếu độ dài bằng 0 thì phần tử không có mặt

// These by Id
if ($("#elementid").length > 0) {
  // Element is Present
} else {
  // Element is not Present
}

// These by Class
if ($(".elementClass").length > 0) {
  // Element is Present
} else {
  // Element is not Present
}

4
Bạn không cần phải kiểm tra độ dài thời tiết lớn hơn 0, nếu ($ ('# Elementid'). Chiều dài) {} sẽ là đủ.
Pranav Labhe

13
Bạn đã thực sự đọc câu hỏi? Đó chính xác là cùng một phương pháp mà OP đang sử dụng.
A1rPun

34

Kiểm tra sự tồn tại của một phần tử được ghi lại gọn gàng trong chính trang web jQuery chính thức!

Sử dụng thuộc tính .length của bộ sưu tập jQuery được bộ chọn của bạn trả về:

if ($("#myDiv").length) {
    $("#myDiv").show();
}

Lưu ý rằng không phải lúc nào cũng cần kiểm tra xem một phần tử có tồn tại hay không. Đoạn mã sau sẽ hiển thị phần tử nếu nó tồn tại và không làm gì cả (không có lỗi) nếu nó không:

$("#myDiv").show();

31

điều này rất giống với tất cả các câu trả lời, nhưng tại sao không sử dụng !toán tử hai lần để bạn có thể nhận được boolean:

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

if ($(selector).exists()) {
    // the element exists, now what?...
}

2
Bởi vì Boolean(x)có thể đôi khi có hiệu quả hơn.

28
$(selector).length && //Do something

19
Tôi ghét những cách tránh thông minh này để sử dụng một ifnơi ifsẽ cải thiện khả năng đọc với chi phí là 2 byte.
Emile Bergeron

Thêm vào đó, minifier sẽ làm tất cả những điều này &&cho bạn.


27

Lấy cảm hứng từ câu trả lời của hiway, tôi đã đưa ra những điều sau đây:

$.fn.exists = function() {
    return $.contains( document.documentElement, this[0] );
}

jQuery.contains lấy hai phần tử DOM và kiểm tra xem phần tử thứ nhất có chứa phần tử thứ hai không.

Sử dụng document.documentElementlàm đối số đầu tiên đáp ứng ngữ nghĩa của existsphương thức khi chúng ta chỉ muốn áp dụng nó để kiểm tra sự tồn tại của một phần tử trong tài liệu hiện tại.

Dưới đây, tôi đã đặt cùng một đoạn so sánh jQuery.exists()so với đồng $(sel)[0]$(sel).lengthphương pháp tiếp cận mà cả hai trở lại truthygiá trị cho $(4)thời gian $(4).exists()trở lại false. Trong bối cảnh kiểm tra sự tồn tại của một phần tử trong DOM, đây dường như là kết quả mong muốn .


26

Không cần jQuery (giải pháp cơ bản)

if(document.querySelector('.a-class')) {
  // do something
}

Tùy chọn hiệu suất cao hơn nhiều bên dưới (thông báo thiếu dấu chấm trước một lớp).

if(document.getElementsByClassName('a-class')[0]) {
  // do something
}

querySelector sử dụng một công cụ kết hợp phù hợp như $ () (sizzle) trong jQuery và sử dụng nhiều sức mạnh tính toán hơn nhưng trong 99% trường hợp sẽ làm tốt. Tùy chọn thứ hai rõ ràng hơn và cho biết mã chính xác phải làm gì. Nó nhanh hơn nhiều theo jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25


25

Tôi chỉ thích sử dụng javascript vanilla đơn giản để làm điều này.

function isExists(selector){
  return document.querySelectorAll(selector).length>0;
}

23

Tôi vấp phải câu hỏi này và tôi muốn chia sẻ một đoạn mã tôi hiện đang sử dụng:

$.fn.exists = function(callback) {
    var self = this;
    var wrapper = (function(){
            function notExists () {}

            notExists.prototype.otherwise = function(fallback){
                if (!self.length) {                    
                    fallback.call();
                }
            };

            return new notExists;
        })();

    if(self.length) {
        callback.call();    
    }

    return wrapper;
}

Và bây giờ tôi có thể viết mã như thế này -

$("#elem").exists(function(){
    alert ("it exists");
}).otherwise(function(){
    alert ("it doesn't exist");
});

Nó có vẻ rất nhiều mã, nhưng khi được viết bằng CoffeeScript thì nó khá nhỏ:

$.fn.exists = (callback) ->
    exists = @length
    callback.call() if exists        
    new class
       otherwise: (fallback) ->            
            fallback.call() if not exists

9
Tôi thấy cách tiếp cận ban đầu của OP không chỉ tối giản hơn nhiều mà còn thanh lịch hơn thế này. Có vẻ như quá mức cần thiết để viết nhiều mã này khi phương thức của OP ngắn hơn và không liên quan đến các cuộc gọi lại.
Lev

Đối với các trường hợp đơn giản - bạn đã đúng. Nhưng đối với các tình huống phức tạp hơn liên quan đến rất nhiều mã trên cả hai trường hợp tôi nghĩ cách tiếp cận của tôi tốt hơn.
Eternal1

4
Trong tình huống phức tạp, cách tiếp cận này sẽ tốt hơn một câu lệnh if / other đơn giản?
Jarvl

19

Tôi đã có một trường hợp mà tôi muốn xem liệu một đối tượng có tồn tại bên trong một đối tượng khác hay không, vì vậy tôi đã thêm một cái gì đó vào câu trả lời đầu tiên để kiểm tra bộ chọn bên trong bộ chọn ..

// Checks if an object exists.
// Usage:
//
//     $(selector).exists()
//
// Or:
// 
//     $(selector).exists(anotherSelector);
jQuery.fn.exists = function(selector) {
    return selector ? this.find(selector).length : this.length;
};

18

Làm thế nào về:

function exists(selector) {
    return $(selector).length;
}

if (exists(selector)) {
    // do something
}

Nó rất tối thiểu và tiết kiệm cho bạn $()mỗi lần phải kèm theo bộ chọn .


3
Điều này đọc là "nếu điều tồn tại" thay vì "nếu điều tồn tại" mà if($("#thing").exists(){}đọc là. Ngoài ra, đó không phải là cách của jQuery.
1j01

15

Tôi đang sử dụng cái này:

    $.fn.ifExists = function(fn) {
      if (this.length) {
        $(fn(this));
      }
    };
    $("#element").ifExists( 
      function($this){
        $this.addClass('someClass').animate({marginTop:20},function(){alert('ok')});               
      }
    ); 

Chỉ thực hiện chuỗi nếu một phần tử jQuery tồn tại - http://jsfiddle.net/andres_314/vbNM3/2/


14

Đây là existphương thức yêu thích của tôi trong jQuery

$.fn.exist = function(callback) {
    return $(this).each(function () {
        var target = $(this);

        if (this.length > 0 && typeof callback === 'function') {
            callback.call(target);
        }
    });
};

và phiên bản khác hỗ trợ gọi lại khi bộ chọn không tồn tại

$.fn.exist = function(onExist, onNotExist) {
    return $(this).each(function() {
        var target = $(this);

        if (this.length > 0) {
            if (typeof onExist === 'function') {
                onExist.call(target);
            }
        } else {
            if (typeof onNotExist === 'function') {
                onNotExist.call(target);
            }
        }
    });
};

Thí dụ:

$('#foo .bar').exist(
    function () {
        // Stuff when '#foo .bar' exists
    },
    function () {
        // Stuff when '#foo .bar' does not exist
    }
);

14

$("selector") trả về một đối tượng có thuộc lengthtính. Nếu bộ chọn tìm thấy bất kỳ phần tử nào, chúng sẽ được đưa vào đối tượng. Vì vậy, nếu bạn kiểm tra độ dài của nó, bạn có thể thấy nếu có bất kỳ yếu tố nào tồn tại. Trong JavaScript 0 == false, vì vậy nếu bạn không nhận được 0mã của mình sẽ chạy.

if($("selector").length){
   //code in the case
} 

5
"Đưa ra một mảng" - Không, nó không. Nó cung cấp cho bạn một đối tượng jQuery (chia sẻ một số thuộc tính với một mảng). Câu trả lời của bạn về cơ bản giống như của Tim Büthe từ năm 2009.
Quentin

11

Dưới đây là ví dụ đầy đủ về các tình huống và cách khác nhau để kiểm tra xem phần tử có tồn tại bằng cách sử dụng trực tiếp hay không nếu trên bộ chọn jQuery có thể hoặc không hoạt động vì nó trả về mảng hoặc phần tử.

var a = null;

var b = []

var c = undefined ;

if(a) { console.log(" a exist")} else { console.log("a doesn't exit")}
// output: a doesn't exit

if(b) { console.log(" b exist")} else { console.log("b doesn't exit")}
// output: b exist

if(c) { console.log(" c exist")} else { console.log("c doesn't exit")}
// output: c doesn't exit

GIẢI PHÁP CUỐI CÙNG

if($("#xysyxxs").length){ console.log("xusyxxs exist")} else { console.log("xusyxxs doesnn't exist") }
//output : xusyxxs doesnn't exist

if($(".xysyxxs").length){ console.log("xusyxxs exist")} else { console.log("xusyxxs doesnn't exist") }
    //output : xusyxxs doesnn't exist

Bạn có thể thử $ ("# xysyxxs") trong trình gỡ lỗi của mình, bạn sẽ thấy rằng jquery không trả về null hoặc không xác định. Vì vậy, giải pháp cuối cùng sẽ không hiệu quả
Béranger

11

Bạn không cần phải kiểm tra nếu nó lớn hơn 0thích $(selector).length > 0, $(selector).lengthnó đủ và là một cách thanh lịch để kiểm tra sự tồn tại của các yếu tố. Tôi không nghĩ rằng đó là giá trị để viết một chức năng chỉ cho việc này, nếu bạn muốn làm thêm nhiều thứ, vâng.

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}
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.