jQuery에 대한 "존재"기능이 있습니까?


2778

jQuery에서 요소의 존재를 어떻게 확인할 수 있습니까?

내가 가지고있는 현재 코드는 다음과 같습니다.

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

이것에 접근하는 더 우아한 방법이 있습니까? 아마도 플러그인이나 함수입니까?

답변:


2489

JavaScript에서 모든 것은 '거짓'또는 '거짓'이며 숫자 0(및 NaN)의 경우 false다른 모든 것을 의미 합니다 true. 그래서 당신은 쓸 수 있습니다 :

if ($(selector).length)

>0부분 은 필요하지 않습니다 .


52
@ abhirathore2006 id 선택기를 사용하고 요소가 존재하지 않는 경우 길이는 0이며 예외를 throw하지 않습니다.
Robert

14
흥미롭게도 NaN != false.
Robert

35
@Robert and [] + []= ""... ahh 저는 자바 스크립트를 좋아합니다
James

9
@ 제임스 그 때문에 [].toString() === [].join(',') === ""하고 "" === "".
Ismael Miguel

5
@Robert와typeof NaN == 'number'
oriadam

1356

예!

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

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

Jeff Atwood 님의 Herding Code podcast 님의 질문에 답변


254
난 그냥 작성 : if ($ (selector) .length) {...} '> 0'없이
vsync

369
귀하의 $.fn.exists예를 훨씬 더 두 함수 호출과 속성 조회 (싼를!) 대체 비용 및 그 함수 호출 중 하나는 당신이 이미 단지 바보 인이있는 jQuery를 개체를 다시 만듭니다.
C Snover

212
@redsquare : 코드 가독성은 jQuery에 이러한 종류의 함수를 추가하는 가장 좋은 근거입니다. 호출 갖는 일이 .exists있는 반면, 완전히 판독 .length의미는 동일한 결과가 일치하는 경우에도, 다른 것을 의미로서 판독한다.
벤 조토

48
@quixoto, 죄송하지만 .length는 줄 바꿈이 필요없는 많은 언어의 표준입니다. .length를 어떻게 해석합니까?
redsquare

144
제 생각에는 "제로보다 큰 목록 길이"라는 개념에서 "존재하기 위해 선택기를 작성한 요소"의 개념으로 향하는 최소한 하나의 논리적 인 간접적입니다. 예, 기술적으로는 동일하지만 개념 추상화는 다른 수준입니다. 이로 인해 일부 사람들은 약간의 성능 비용으로보다 명확한 지표를 선호합니다.
벤 조토

377

사용한 경우

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

체인이 불가능할 때 체인이 가능했음을 암시합니다.

이것은 더 나을 것입니다 :

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

또는 FAQ에서 :

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

다음을 사용할 수도 있습니다. jQuery 객체 배열에 값이 없으면 배열의 첫 번째 항목을 가져 오면 정의되지 않은 상태로 반환됩니다.

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

11
첫 번째 방법은 더 잘 읽습니다. $ ( "a"). exists ()는 "<a> 요소가있는 경우"로 읽습니다. $ .exists ( "a")는 "<a> 요소가있는 경우"로 읽습니다.
strager

16
사실이지만 다시 말하지만 체인이 가능하다는 것을 암시하고 $ (selector) .exists (). css ( "color", "red")와 같은 것을 시도하면 작동하지 않으며 = * (
Jon Erickson

19
attr 및 데이터 함수와 같이 연결할 수없는 메소드가 이미 있습니다. 나는 당신의 요점을보고, 가치가있는 것에 대해, 나는 길이가> 0인지 테스트합니다.
Matthew Crumley

39
지구상에서 왜 이것을 연결해야합니까? $(".missing").css("color", "red")이미 옳은 일을한다… (즉, 아무것도)
Ben Blank

15
체인에 관한 것들은 완전합니다- 새로운 jQuery 객체 이외의 것을 반환하고 체인을 만들지 않는 많은 jQuery $.fn메소드가 있습니다.
Alnitak

136

이것을 사용할 수 있습니다 :

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

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

134
Tim Büthe가 이미 2 년 전에이 답변을 제공 한 것을 보지 못했습니까 ?
Th4t Guy

101
Pfft, Tim은 요소가 존재하지 않는지 테스트하는 방법을 보여주지 않았습니다.
Jeremy W

1
인생이 "그렇지 않다"는 말입니까? 내 Q는 이것입니다 : 오류, 존재해야하거나 선택기가 일치하지 않습니다. 길이는 불필요합니다.
RichieHH

26
이 답변과 의견은 어떻게 유래 작품을 요약
aswzen

101

존재를 확인하는 가장 빠르고 의미 론적으로 자기 설명 방법은 실제로 plain을 사용하는 것입니다 JavaScript.

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

jQuery 길이 대안보다 작성하는 것이 약간 더 길지만 기본 JS 메소드이므로 더 빠르게 실행됩니다.

그리고 자신의 jQuery함수 를 작성하는 것보다 낫습니다 . @snover가 언급 한 이유 때문에 그 대안이 더 느립니다. 그러나 그것은 또한 다른 프로그래머들 exists()에게이 함수가 jQuery 고유 의 기능 이라는 인상을 줄 것 입니다. JavaScript지식 부채 증가없이 코드를 편집하는 다른 사람들이 이해할 수 있어야합니다.

NB : 앞에 '#'이 없다는 것을 주목하십시오 element_id(이것은 일반 JS이기 때문에 jQuery).


56
완전히 같은 것은 아닙니다. 예를 들어 JQuery 선택기는 모든 CSS 규칙에 사용할 수 있습니다 $('#foo a.special'). 그리고 둘 이상의 요소를 반환 할 수 있습니다. getElementById접근하기 시작할 수 없습니다.
kikito

7
선택기만큼 광범위하게 적용 할 수 없다는 것이 맞습니다. 그러나 가장 일반적인 경우 (단일 요소가 존재하는지 확인)에서 잘 작동합니다. 자기 설명과 속도의 주장은 여전히 ​​유효합니다.
Magne

29
@ 노즈 if(document.querySelector("#foo a.special"))가 작동합니다. jQuery가 필요하지 않습니다.
푸른 하늘

34
JS 엔진의 속도에 대한 주장은 jQuery 없이는 기능 할 수없는 사람들을 위해 죽었다. 왜냐하면 그들이 이길 수없는 주장이기 때문이다.
푸른 하늘

22
document.getElementById가 우리가 가진 모든 것이었던 옛날을 기억하십니까? 그리고 나는 항상 문서를 잊어 버렸습니다. 왜 작동하지 않는지 알 수 없었습니다. 그리고 나는 항상 철자를 잘못 입력하고 캐릭터 케이스를 잘못했습니다.
JustJohn

73

다음과 같이 작성하여 몇 바이트를 절약 할 수 있습니다.

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

이 작품은 각각의 jQuery 객체는 가장 무도회는 배열로, 그래서 우리는에서 첫 번째 항목을 얻을 수있는 배열 역 참조 연산자를 사용할 수 있기 때문에 배열 . undefined지정된 인덱스에 항목이없는 경우 반환 합니다.


1
나는이 정확한 답변을 게시하기 위해 여기에왔다 ... 의무적 인 바이올린 : jsfiddle.net/jasonwilczak/ekjj80gy/2
JasonWilczak

3
@JasonWilczak 대신 왜 .eq [0] 또는 .first ()를 사용하여 타입 캐스팅 대신 발견 된 첫 번째 요소를 언급 하시겠습니까?
Jean Paul AKA el_vete

5
아니 jQuery.first()거나 jQuery.eq(0)둘 다 물건을 반환하면 물건이 비어있는 경우에도 진실합니다. 이 예는 이러한 기능을 그대로 사용할 수없는 이유를 설명해야합니다.if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
Salman A

1
옳은. .eq(0)길이 1 또는 0으로 잘린 다른 jQuery 객체 만 반환 .first()합니다 .eq(0). 의 편리한 방법입니다 . 그러나 .get(0)첫 번째 DOM 요소를 반환하고 undefined와 동일합니다 [0]. jQuery 객체의 첫 번째 DOM 요소는 name과 함께 일반 객체 속성에 저장됩니다 '0'. 그것은 간단한 재산 접근입니다. 유일한 유형 캐스팅은 숫자 0를 문자열로 암시 적으로 변환 한 것입니다 '0'. 따라서 타입 캐스팅이 문제라면 $.find(selector)['0']대신 사용할 수 있습니다 .
Robert

66

당신이 사용할 수있는:

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

작은 아마도 더 우아한.


38
이것은 간단한 일에 비해 너무 많습니다. 팀 쎄 답변을 참조
VSYNC

이것이 정답입니다. '길이'방법은 예를 들어, 어떤 수의 위양성을 제공하는 문제가 : $ (666) .length // 반환 일을하지만, 올바른 선택이 아니다
earnaz

이것은 매우 간단한 작업에 매우 비쌉니다. .is () 경우 jquery 구현을 살펴 보고이 간단한 질문에 대답하기 위해 얼마나 많은 코드를 처리 해야하는지 알 수 있습니다. 또한 정확히 무엇을하고 싶은지는 분명하지 않으므로 문제의 해결책과 동일하거나 덜 우아합니다.
micropro.cz

1
@earnaz 좋은 지적, 좋은 캐치. 그래도 그것이 실제로 가치있는 부분이 어디인지는 알 수 없습니다. 요소를 식별하는 개발자는 666아마도 코드가 손상된 다른 많은 이유 가 있을 것입니다. 그것은 잘못된 선택이지만, $ (666) .length는 유효한 자바 스크립트입니다 그것은 truthy로 평가, 따라서 : 해야 조건을 만족.
Todd

@earnaz는 특정 사례를 피하기 위해 $.find(666).length작동합니다.
Emile Bergeron

66

이 플러그인은 콜백 if과 같은 명령문 if ($(ele).exist()) { /* DO WORK */ }이나 콜백 에서 사용할 수 있습니다 .

플러그인

;;(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

하나 또는 두 개의 콜백을 지정할 수 있습니다. 첫 번째 요소는 요소가 있으면 시작되고 두 번째 요소는 요소가 없으면 시작 됩니다. 그러나 하나의 함수 만 전달하도록 선택하면 요소가 존재하는 경우에만 실행됩니다. 따라서 선택한 요소가 존재 하지 않으면 체인이 죽습니다 . 물론 존재하는 경우 첫 번째 기능이 실행되고 체인이 계속 작동합니다.

콜백 변형 을 사용하면 체인 성 을 유지하는 데 도움이됩니다 . 요소가 반환되고 다른 jQuery 메소드와 마찬가지로 체인 명령을 계속할 수 있습니다!

사용 예

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
콜백 버전에서 Has Items콜백이 실제로 객체를 인수로 전달 해서는 안 됩니까?
Chris Marisic 2016 년

62

나는 대부분의 대답이 정확하지 않다는 것을 알았습니다. 요소 길이를 확인합니다 . 많은 경우 OK 일 수 있지만 100 %는 아닙니다. 숫자가 함수에 대신 전달되는지 상상해보십시오. 그래서 모든 것을 검사하는 함수를 프로토 타입으로 만듭니다. 조건과 응답을 다음과 같이 반환하십시오.

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

길이와 유형을 모두 확인하므로 다음과 같이 확인할 수 있습니다.

$(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

실제로 jQuery가 필요하지 않습니다. 일반 JavaScript를 사용하면 다음을 확인하는 것이 더 쉽고 의미 론적으로 정확합니다.

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

어떤 이유로 든 요소에 ID를 넣고 싶지 않은 경우 DOM에 액세스하도록 설계된 다른 JavaScript 메소드를 계속 사용할 수 있습니다.

jQuery는 정말 멋지지만 순수한 JavaScript가 망각에 빠지지 않도록하십시오 ...


5
나는 알고있다 : 그것은 원래의 질문 (jquery 함수를 요구하는)에 직접 대답하지 않지만, 그 경우 대답은 "아니오"또는 "의미 적으로 올바른 해결책이 아니다".
amypellegrini

부모 선택기가 필요한 경우 어떻게해야 :has()합니까?
Константин Ван

54

이것을 사용할 수 있습니다 :

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

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

43

이전의 모든 답변에 .length매개 변수가 필요한 이유 는 주로 $()커튼 뒤에 querySelectorAll이있는 jquery 선택기를 사용하거나 직접 사용하기 때문입니다. 이 방법은 전체 DOM 트리를 구문 분석하여 해당 선택기와 일치하는 모든 항목을 찾고 배열을 채울 필요가 있기 때문에 다소 느립니다 .

[ 'length'] 매개 변수는 필요하지 않거나 유용하지 않으며 document.querySelector(selector)대신 직접 사용 하는 경우 코드가 훨씬 빠릅니다 . 첫 번째 요소는 일치하는 첫 번째 요소를 반환하거나 찾지 못하면 null입니다.

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

그러나이 메소드는 실제 객체가 반환되도록합니다. 변수로 저장되지 않고 반복적으로 사용되지 않으면 괜찮습니다 (따라서 잊어 버린 경우 참조를 유지합니다).

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 */

어떤 경우에는 이것이 필요할 수 있습니다. 다음과 같이 for 루프에서 사용할 수 있습니다.

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

실제로 요소가 필요하지 않고 true / false 만 가져 오거나 저장하려는 경우 두 배가 아닌 !! 묶이지 않은 신발에 효과가 있습니다.

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()당신이 원하는?

jQuery.contains( container, contained )

$.contains()메소드는 두 번째 인수가 제공 한 DOM 요소가 첫 번째 인수가 제공 한 DOM 요소의 하위 요소 (직접 하위 요소이든 더 깊이 중첩되어 있는지)인지 여부를 리턴합니다. 그렇지 않으면 false를 반환합니다. 요소 노드 만 지원됩니다. 두 번째 인수가 텍스트 또는 주석 노드이면 $.contains()false를 반환합니다.

참고 : 첫 번째 인수는 jQuery 객체 또는 일반 JavaScript 객체가 아닌 DOM 요소 여야합니다.


3
이것은 선택자를 허용하지 않으므로 선택자를 선택해야하므로 선택 결과를 확인할 수 있습니다.

39

나는 if ($(selector).length) {}불충분 한 것으로 밝혀졌다 . selector비어있는 객체 일 때 앱이 자동으로 중단됩니다 {}.

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

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

내 유일한 제안은에 대한 추가 확인을 수행하는 것입니다 {}.

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

나는 이것이 조금 무겁지만 여전히 더 나은 해결책을 찾고 있습니다.

편집 : 경고! selector문자열 일 때 IE에서는 작동하지 않습니다 .

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

12
$()빈 개체를 인수로 사용하여 얼마나 자주 자신을 부르고 있습니까?
nnnnnn

@nnnnnn 실제로는 절대 사용하지 않습니다 (더 이상 jQuery를 사용하지 않습니다). 그러나 3 년 전에 선택기를 사용하고 해당 선택기에 대한 요소 수를 반환하는 API를 노출 한 사례가 있다고 생각합니다. 다른 개발자가 빈 개체를 전달하면 1로 잘못 응답합니다.
Oleg

3
지구상에서 왜 빈 물체 {}를 전달 $()하시겠습니까?
모든 근로자가 필수적

7
@cpburnz 왜 나 한테 물어봐? 나는 단지 API 제공 업체였습니다 ... 사람들은 모든 종류의 어리석은 것들을 API에 전달합니다.
Oleg

4
@FagnerBrack이 언급 한 jquery 이슈 스레드는 그의 주석 직후 업데이트되었다. 결국 사라지지 않는 것 같습니다.
Joseph Gabriel

38

Java 스크립트에서 요소가 존재하는지 또는 길이를 사용하지 않는지 확인할 수 있습니다. 길이가 0보다 크면 요소가 존재하고 길이가 0이면 요소가 존재하지 않습니다

// 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
날씨 길이가 0보다 큰지 확인할 필요가 없습니다. if ($ ( '# elementid'). length) {}이면 충분합니다.
Pranav Labhe

13
실제로 질문을 읽었습니까? OP가 사용하는 것과 정확히 같은 방법입니다.
A1rPun

34

요소있는지 확인하는 것은 공식 jQuery 웹 사이트 자체에 깔끔하게 문서화되어 있습니다!

선택기에서 반환 한 jQuery 컬렉션 의 .length 속성을 사용하십시오 .

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

요소가 존재하는지 항상 테스트 할 필요는 없습니다. 다음 코드는 요소가 존재하는 경우 표시하고, 존재하지 않으면 아무 것도하지 않고 (오류없이) 수행합니다.

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

31

이것은 모든 답변과 매우 유사하지만 !부울을 얻을 수 있도록 연산자를 두 번 사용하지 않는 이유는 무엇입니까?

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

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

2
때로는 더 효율적일 Boolean(x)수 있기 때문입니다.

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

19
나는 2 바이트의 비용으로 가독성을 향상시킬 수있는 if곳 을 사용하지 않는 현명한 방법을 싫어 if합니다.
Emile Bergeron

또한 미니어처가 이러한 모든 작업을 수행 &&합니다.


27

hiway의 답변에서 영감을 얻어 다음을 생각해 냈습니다.

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

jQuery.contains 는 두 개의 DOM 요소를 가져 와서 첫 번째 요소가 두 번째 요소를 포함하는지 확인합니다.

document.documentElement첫 번째 인수로 사용 exists하면 현재 문서에서 요소의 존재를 확인하기 위해 적용 할 때만 메소드 의 의미를 충족시킵니다 .

아래에서는 while returns 값을 반환 jQuery.exists()하는 $(sel)[0]$(sel).length접근 방식 과 비교하는 스 니펫을 작성했습니다 . DOM에 요소 가 있는지 검사 하는 상황 에서 이것은 원하는 결과 인 것 같습니다 .truthy$(4)$(4).exists()false


26

jQuery 불필요 (기본 솔루션)

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

아래에서 훨씬 더 성능이 좋은 옵션 (클래스 전에 점이 없음에 유의하십시오).

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

querySelector는 jQuery에서 $ () (sizzle)과 같은 적절한 일치 엔진을 사용하고 더 많은 컴퓨팅 성능을 사용하지만 99 %의 경우에는 정상적으로 작동합니다. 두 번째 옵션은보다 명확하며 코드에 정확히 무엇을 지시합니다. jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25 에 따르면 훨씬 빠릅니다.


25

나는 이것을하기 위해 일반 바닐라 자바 ​​스크립트를 사용하고 싶습니다.

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

23

이 질문을 우연히 발견했으며 현재 사용중인 코드 스 니펫을 공유하고 싶습니다.

$.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;
}

이제 이런 코드를 작성할 수 있습니다.

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

많은 코드처럼 보일지 모르지만 CoffeeScript로 작성되면 상당히 작습니다.

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

9
OP의 독창적 인 접근 방식은 이것보다 훨씬 작고 우아합니다. OP의 메소드가 더 짧고 콜백을 포함하지 않을 때이 많은 코드를 작성하는 것은 과도한 것으로 보입니다.
Lev

간단한 경우-당신이 맞아요. 그러나 두 경우 모두에 많은 코드가 관련된 더 복잡한 상황에서는 내 접근 방식이 더 좋습니다.
Eternal1

4
어떤 복잡한 상황에서이 접근법이 간단한 if / else 문보다 낫습니까?
Jarvl

19

객체가 다른 객체 안에 존재하는지 확인하고 싶었 기 때문에 첫 번째 답변에 무언가를 추가하여 선택기 내부의 선택기를 확인했습니다.

// 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

어때요?

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

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

매우 작으며 $()매번 선택기를 동봉해야합니다 .


3
다음과 같이 읽는 "존재하는 경우"대신 "존재하는 경우"로 if($("#thing").exists(){}읽습니다. 또한 jQuery 방식이 아닙니다.
1j01

15

나는 이것을 사용하고있다 :

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

jQuery 요소가 존재하는 경우에만 체인을 실행하십시오 -http : //jsfiddle.net/andres_314/vbNM3/2/


14

여기 existjQuery에서 가장 좋아하는 방법이 있습니다.

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

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

선택기가 존재하지 않을 때 콜백을 지원하는 다른 버전

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

예:

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

14

$("selector")는 length속성 이있는 객체를 반환합니다 . 선택기가 요소를 찾으면 해당 요소가 객체에 포함됩니다. 따라서 길이를 확인하면 요소가 있는지 확인할 수 있습니다. JavaScript에서는 코드를 0 == false얻지 못하면 0코드가 실행됩니다.

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

5
"배열 제공"— 아니요. 그렇지 않습니다. jQuery 객체 (배열과 일부 속성을 공유)를 제공합니다. 당신의 대답은 본질적으로 2009 년의 Tim Büthe와 동일합니다.
Quentin

11

다음은 jQuery 선택기에서 배열 또는 요소를 반환하기 때문에 직접 if를 사용하여 요소가 존재하는지 여부를 확인하는 다양한 상황과 방법의 완전한 예입니다.

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

마지막 해결책

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

디버거에서 $ ( "# xysyxxs")를 시도하면 jquery가 null 또는 undefined를 반환하지 않음을 알 수 있습니다. 따라서 최종 솔루션이 작동하지 않을 것입니다.
Béranger

11

당신은 그것보다 더 큰 있는지 확인하지 않아도 0같은 $(selector).length > 0, $(selector).length그것은 충분 및 요소의 존재를 확인하는 우아한 방법. 더 많은 일을하고 싶다면이 기능을 작성하는 것이 가치가 있다고 생각하지 않습니다.

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.