2455

jQueryで要素の存在を確認する方法

私が持っている現在のコードはこれです:

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

これに近づくためのもっとエレガントな方法はありますか?おそらくプラグインか関数か


  • わかりません、エレガントではないものとは何ですか。そもそも。 - HerrSerker

30 답변


2184

JavaScriptでは、すべてが '真実'または '偽'であり、数字の場合0(そしてNaN)という意味false、 ほかのすべてtrue。だからあなたは書くことができます:

if ($(selector).length)

あなたはそれを必要としません>0部。


  • 要素が存在しない場合にIDセレクタを使用すると、エラーが発生します。私が行ったさまざまなテストをチェックアウトしてください。 - abhirathore2006
  • @ abhirathore2006 IDセレクタを使用し、要素が存在しない場合、lengthは0で、例外をスローしません。 - Robert
  • 大変興味深いことにNaN != false。 - Robert
  • @Robertと[] + []=""...ああ私はJavaScriptが大好きです - James
  • @deblocker動画がありますよろしくお願いします。 - James

1284

はい!

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

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

これは以下に対応しています:Jeff AtwoodによるHerding Codeのポッドキャスト


  • if($(selector).length){...}を'>なしで書くだけです。 0' - vsync
  • きみの$.fn.existsたとえば、プロパティ検索(安い!)を2つの関数呼び出し(これははるかに高価です)に置き換えることです。これらの関数呼び出しの1つは、すでに持っているjQueryオブジェクトを再作成します。 - C Snover
  • @redsquare:コードの可読性は、jQueryにこの種の関数を追加するための最良の根拠です。と呼ばれるものを持っている.existsきれいに読みます.lengthたとえ意味論が同一の結果と一致したとしても、意味的に異なる何かとして読む。 - Ben Zotto
  • @quixoto、申し訳ありませんが、.lengthはラッピングを必要としない多くの言語にわたる標準です。他にどのように.lengthを解釈しますか? - redsquare
  • 私の意見では、それは「ゼロより大きいリスト長」という概念からの少なくとも1つの論理的な間接指定です。 「私が存在のためのセレクタを書いた要素」の概念に。ええ、それらは技術的には同じものですが、概念の抽象化は異なるレベルにあります。これにより、パフォーマンスを犠牲にしても、より明示的な指標を好む人がいます。 - Ben Zotto

342

あなたが使用した場合

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オブジェクト配列に値がない場合、配列の最初の項目を取得するとundefinedが返されます。

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


  • 最初の方法は読みやすいです。 $(" a";< a>;< a>;が存在する場合、要素が存在します。 $ .exists( "a")は、< a>が存在する場合は"と読み替えます。要素」 - strager
  • 本当ですが、繰り返しますが、連鎖が可能であることを暗示しています。$(selector).exists()。css(" color"、" red")のようにしようとするとうまくいきません。それから私は= *( - Jon Erickson
  • attrやdata関数のように、連鎖可能ではないメソッドが既にあります。私はあなたの論点を見ています、そして、それが価値があるもののために、私はただ長さについてテストします>とにかく0 - Matthew Crumley
  • なぜこれを鎖でつなぐ必要があるのでしょうか。$(".missing").css("color", "red")すでに正しいことをしている…(つまり何もしない) - Ben Blank
  • チェーニングに関することは完全にトッシュです - ありますたっぷりjQueryの$.fn新しいjQueryオブジェクト以外の何かを返すため、チェインしないメソッド。 - Alnitak

111

これを使うことができます:

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

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


  • Tim Büがすでにこれを与えているのを見なかったか回答あなたの2年前? - Th4t Guy
  • Pfft、Timは、要素が存在しないかどうかをテストする方法を示したことはありません。 - Jeremy W
  • あなたは人生「その他」を意味しますか?私のQはこれです:エラー、存在しなければならないか、セレクタが一致しません。長さは不要です。 - RichieHH
  • この回答とコメントは、stackoverflowのしくみをまとめたものです。 - aswzen

82

存在を確認するための最速かつ最も意味的に自己説明的な方法は、実際には単純なJavaScriptを使用することです。

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

jQueryの長さの代替方法よりも書くのに少し時間がかかりますが、ネイティブのJSメソッドであるため実行は速くなります。

そしてそれはあなた自身のjQuery関数を書く代わりの方法よりも優れています。 @snoverが述べた理由により、その代替方法は遅くなります。しかし、それは、exists()関数がjQueryに固有のものであるという印象を他のプログラマーにも与えるでしょう。知識の借金を増やすことなく、JavaScriptを他の人がコードを編集することで理解できるはずです。

NB:element_idの前に '#'がないことに注意してください(これはプレーンなJSでありjQueryではないため)。


  • まったく同じことではありません。 JQueryセレクタは、どのCSSルールにも使用できます。たとえば、$('#foo a.special')。そしてそれは複数の要素を返すことができます。getElementByIdそれに近づき始めることはできません。 - kikito
  • あなたはそれがセレクタのように広く適用可能ではないという点で正しいです。ただし、最も一般的な場合(単一の要素が存在するかどうかを確認する場合)にはうまく機能します。自己説明とスピードの議論はいまだに成り立ちます。 - Magne
  • @Nozif(document.querySelector("#foo a.special"))うまくいくでしょう。 jQueryは必要ありません。 - Blue Skies
  • JSエンジンでのスピードの議論は、jQueryなしでは機能できないという人々の心の中で死んでいるだけです。なぜなら、それは彼らが勝つことができないという議論だからです。 - Blue Skies
  • document.getElementByIdがすべてだった昔のことを思い出してください。そして私はいつもその文書を忘れた。それがなぜうまくいかなかったのか理解できませんでした。そして私はいつもそれを間違ってつづり、文字の大文字小文字を間違えました。 - JustJohn

58

次のように書くと数バイト節約できます。

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

これは、各jQueryオブジェクトも配列として見せかけているのでうまくいきます。したがって、配列の間接参照演算子を使用して最初の項目を取得できます。アレイ。戻るundefined指定されたインデックスにアイテムがない場合


  • 私はこの正確な答えを投稿するためにここに来ました...義務的ないじる:jsfiddle.net/jasonwilczak/ekjj80gy/2 - JasonWilczak
  • @JasonWilczak代わりにコメントしないように注意してください。型キャストではなく、見つかった最初の要素を参照するための.eq [0]または.first()? - Jean Paul A.K.A el_vete
  • いいえ、jQuery.first()またはjQuery.eq(0)どちらもオブジェクトを返すので、オブジェクトは空っぽくても真実です。この例では、これらの関数をそのままでは使用できない理由を説明する必要があります。if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists") - Salman A
  • 正しい。.eq(0)長さ1または0に切り捨てられた別のjQueryオブジェクトのみを返します。.first()の便利な方法です.eq(0)。しかし.get(0)最初のDOM要素を返すundefinedと同じです[0]。 jQueryオブジェクトの最初のDOM要素は、通常のobjectプロパティに次の名前で格納されています。'0'。これは単純なプロパティアクセスです。唯一の型キャストは、暗黙的に数値を変換することによって得られます。0文字列に'0'。型キャストが問題になるのであれば、あなたが使用することができます$.find(selector)['0']代わりに。 - Robert

54

あなたが使用することができます:

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

Aちょっともっとエレガントかも


  • これはそのような単純なことには多すぎます。 Tim Büをご覧ください。 - vsync
  • これは正しい答えです。 「長さ」 methodには、任意の数に対して誤検知を与えるという問題があります。例えば、$(666).length //は1を返しますが、これは有効なセレクタではありません - earnaz
  • これは非常に簡単な作業には非常に費用がかかります。 .is()の場合はjqueryの実装を調べるだけで、この単純な質問に答えるためにどれだけのコードを処理する必要があるかがわかります。また、あなたが正確に何をしたいのかは明らかではないので、問題の解決策と同じか、あるいはそれほど洗練されていません。 - micropro.cz
  • @ earnaz素晴らしい点、素敵なキャッチ。ただし、それが実際に価値のある問題となっている箇所がわかりません。要素を識別する開発者666他にもたくさんの理由でコードが壊れているのでしょう。これは無効なセレクタですが、$(666).length有効なJavaScriptです。:それは真実に評価されます、そしてそれ故にすべき条件を満たす - Todd
  • その特定のケースを避けるために@earnaz、$.find(666).length動作します。 - Emile Bergeron

52

このプラグインは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

1つか2つのコールバックを指定できます。最初の要素は要素が存在すれば起動し、2番目の要素は要素が存在すれば起動します。ではない存在します。ただし、関数を1つだけ渡すことを選択した場合は、要素が存在するときにのみ機能します。したがって、選択した要素が消滅するとチェーンは消滅しますではない存在します。もちろん、もしそれが存在すれば、最初の関数が起動しチェーンは継続します。

を使用することに留意してくださいコールバックバリアントは連鎖性を維持するのに役立ちます - 要素が返され、他の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    */
    }
})


  • コールバックバージョンでは、Has Itemsコールバックは実際に引数としてオブジェクトを渡しますか? - Chris Marisic

47

本当にjQueryは必要ありません。単純なJavaScriptでは、以下をチェックするのが簡単で意味的に正しいです。

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

何らかの理由で要素にIDを付けたくない場合でも、DOMにアクセスするように設計された他のJavaScriptメソッドを使用できます。

jQueryは本当にクールですが、純粋なJavaScriptを忘れることはできません。


  • 私は知っています:(jquery関数を要求する)元の質問に直接答えるのではありませんが、その場合の答えは「いいえ」です。または「意味的に正しい解決策ではない」。 - amypellegrini

47

私はここにほとんどの答えがあるのを見ます正確ではない要素の長さをチェックするため、要素の長さをチェックします。多くの場合は問題ありませんが、100%ではありません。代わりにnumberが関数に渡されると想像します。

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


41

あなたはこれを使用することができます:

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

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


37

これまでのすべての答えが必要な理由.lengthパラメータは、彼らが主にjqueryのを使用しているということです$()カーテンの後ろにquerySelectorAllを持つ(または直接使用している)セレクタ。このメソッドは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);


32

見つけた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.');
}

これは少し重いので、私はまだより良い解決策を探しています。

編集する警告!これはIEではうまくいきません。selector文字列です。

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


  • どのくらいの頻度であなたは自分自身を呼び出していると思いますか$()引数として空のオブジェクトを使って? - nnnnnn
  • @nnnnnn実際にはありません(私はもうjQueryを使用しません)。しかし、私は3年前、私はセレクターを受け取りそのセレクターの要素数を返すAPIを公開したことがあると思います。別の開発者が空のオブジェクトを渡すと、誤って1が返されます。 - Oleg
  • なぜあなたは空のオブジェクトを渡すのですか{}$()? - cpburnz
  • @cpburnzなぜあなたは私に尋ねますか?私は単なるAPIプロバイダーでした...人々はあらゆる種類のバカなことをAPIに渡します。 - Oleg
  • 気付いたのは、@FagnerBrackが参照しているjquery issue threadが彼のコメントの直後に更新されたことです。結局のところ、それは消えていないようです。 - Joseph Gabriel

29

あなたは要素が存在するかどうかを確認することができますまたはJavaスクリプトで長さを使用していません。    lengthがゼロより大きければelementが存在し、lengthがゼロであれば    要素が存在しません

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


  • ($('#elementid')。length){}で十分な場合は、天気の長さが0より大きいかどうかを確認する必要はありません。 - Pranav Labhe
  • あなたは実際に質問を読んだことがありますか? OPが使用している方法とまったく同じです。 - A1rPun

29

です$.contains()あなたが欲しいもの?

jQuery.contains( container, contained )

$.contains()直接の子であるか、より深くネストされているかに関係なく、2番目の引数によって提供されるDOM要素が最初の引数によって提供されるDOM要素の子孫である場合、methodはtrueを返します。そうでなければ、falseを返します。要素ノードのみがサポートされています。 2番目の引数がテキストまたはコメントノードの場合$.contains()falseを返します。

注意:最初の引数はjQueryオブジェクトやプレーンなJavaScriptオブジェクトではなくDOM要素でなければなりません。


  • これはセレクターを受け付けないため、セレクターを選択する必要があります。つまり、セレクションの結果を確認できます。 - user1106925

25

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


  • 私はこれらを使うのを避ける賢い方法が嫌いですifどこif2バイトを犠牲にして読みやすさを向上させるでしょう。 - Emile Bergeron
  • 加えて、ミニファイヤーはこれらすべてを行います&&あなたのために。 - user7892745

25

要素の存在を確認する公式のjQuery Webサイト自体にきちんと文書化されています!

使用.lengthあなたから返されたjQueryコレクションのプロパティ   セレクタ:

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

要素が存在するかどうかをテストする必要はありません。   次のコードは要素が存在する場合はそれを表示し、何もしません。   そうでない場合(エラーなし):

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


24

これはすべての答えと非常によく似ていますが、なぜそれを使用しないでください。!2回演算子を使うので、ブール値を得ることができます。

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

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


  • なぜならBoolean(x)できる時々より効率的になります。 - user7892745

22

テストしてみてくださいDOM素子

if (!!$(selector)[0]) // do stuff


21

に触発されたハイウェイの答え私は以下のことを思いついた。

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

jQuery.containsDOM要素を2つ取り、最初の要素に2番目の要素が含まれているかどうかを確認します。

を使うdocument.documentElement最初の引数がの意味論を満たすのでexists現在のドキュメント内の要素の存在をチェックするためだけにそれを適用したいときのメソッド。

以下に、比較するスニペットをまとめました。jQuery.exists()に対して$(sel)[0]そして$(sel).lengthどちらも返すアプローチtruthyの値$(4)しながら$(4).exists()戻るfalse。の文脈では存在確認DOM内の要素の望ましい結果

$.fn.exists = function() {
    return $.contains(document.documentElement, this[0]); 
  }
  
  var testFuncs = [
    function(jq) { return !!jq[0]; },
    function(jq) { return !!jq.length; },
    function(jq) { return jq.exists(); },
  ];
    
  var inputs = [
    ["$()",$()],
    ["$(4)",$(4)],
    ["$('#idoexist')",$('#idoexist')],
    ["$('#idontexist')",$('#idontexist')]
  ];
  
  for( var i = 0, l = inputs.length, tr, input; i < l; i++ ) {
    input = inputs[i][1];
    tr = "<tr><td>" + inputs[i][0] + "</td><td>"
          + testFuncs[0](input) + "</td><td>"
          + testFuncs[1](input) + "</td><td>"
          + testFuncs[2](input) + "</td></tr>";
    $("table").append(tr);
  }
td { border: 1px solid black }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="idoexist">#idoexist</div>
<table style>
<tr>
  <td>Input</td><td>!!$(sel)[0]</td><td>!!$(sel).length</td><td>$(sel).exists()</td>
</tr>
</table>
<script>
  
  $.fn.exists = function() {
    return $.contains(document.documentElement, this[0]); 
  }
  
</script>


19

私はこれをするために普通のバニラジャバスクリプトを使うのが好きです。

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


17

あるオブジェクトが別のオブジェクトの中に存在するかどうかを確認したい場合があるので、最初の答えに何かを追加してセレクタの内側にあるセレクタをチェックしました。

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


17

私はこの質問につまずいたし、私が現在使用しているコードの断片を共有したいと思います。

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


  • OPの独自のアプローチは、これよりもはるかに最小限であるだけでなく、より洗練されていると私は思います。 OPのメソッドが短く、コールバックが含まれていない場合、これだけのコードを書くのはやり過ぎに思えます。 - Lev
  • 単純な場合 - あなたは正しいです。しかし、両方のケースで多くのコードを含むより複雑な状況では、私のアプローチがより良いと思います。 - Eternal1
  • どのような複雑な状況で、このアプローチは単純なif / elseステートメントよりも優れているでしょうか。 - Jarvl

17

jQueryは必要ありません

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


16

どうですか?

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

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

ごくわずかなので、セレクタを次のように囲む必要がありません。$()毎回。


  • これは「存在する場合」と読みます。 「存在する場合」ではなく、どっちif($("#thing").exists(){}と読みます。また、これはjQueryのやり方ではありません。 - 1j01

12

私はこれを使っています:

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


10

これが私のお気に入りです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
    }
);


10

$("selector")を持つオブジェクトを与えるlengthデータ。 selectorに定義した要素がある場合は、それらをオブジェクトから取得します。それで、あなたがすでにあなたが見つけることができるその長さをチェックするならば、どんな要素も存在しますか。 JavaScriptで0 == falseまたnull == false。届かない場合0あなたのコードが実行されます。

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


  • "配列を指定" - いいえ、違います。それはあなたにjQueryオブジェクトを与えます(これはいくつかのプロパティを配列と共有します)。あなたの答えは、2009年からのTim Bのものと基本的に同じです。 - Quentin

8

if ( $('#myDiv').size() > 0 ) { //do something }

size()セレクタによって返された要素の数を数えます。


  • @Furbeenatorあなたがあなたの情報をどこから得たのか私にはわかりませんが、.size()戻る以外何もしない.length。廃止予定の理由があります - Ian
  • あなたは正しいですが、電話.lengthプロパティであるため、以下の関数呼び出しよりもわずかに少ないオーバーヘッドで済みます。.size()。私の悪い - Furbeenator

8

あなたはそれがより大きいかどうかを確認する必要はありません0好き$(selector).length > 0$(selector).lengthそれは要素の存在をチェックするのに十分かつ洗練された方法です。もっと特別なことをしたいのであれば、これだけのために関数を書く価値はないと思います。

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}

リンクされた質問


関連する質問

最近の質問