web-dev-qa-db-ja.com

objectがjQueryオブジェクトかどうかを確認

オブジェクトがjQueryオブジェクトかネイティブのJavaScriptオブジェクトかどうかを確認するための迅速な方法はありますか?

例:

var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);

明らかに、上記のコードは機能しますが、安全ではありません。 oオブジェクトにセレクターキーを追加しても同じ結果が得られます。オブジェクトが実際にjQueryオブジェクトであることを確認するためのより良い方法はありますか?

(typeof obj == 'jquery')に沿ったもの

571
David Hellsing

instanceof 演算子を使用できます。

obj instanceof jQuery

説明jQuery関数(別名$)は コンストラクター関数 として実装されています。コンストラクタ関数はnewという接頭辞を付けて呼び出されます。

$(foo)を呼び出すと、内部的にjQueryはこれをnew jQuery(foo)に変換します。1。 JavaScriptは、thisの新しいインスタンスを指すようにコンストラクタ関数内でjQueryを初期化し、そのプロパティをjQuery.prototype(別名jQuery.fn)にあるものに設定します。したがって、instanceof jQuerynewであるtrueオブジェクトが得られます。


1それは実際にはnew jQuery.prototype.init(foo)です:コンストラクタロジックはinitと呼ばれる別のコンストラクタ関数にオフロードされました、しかし概念は同じです。

839
Crescent Fresh

ここで説明しているように、.jqueryプロパティを使用することもできます。 http://api.jquery.com/jquery-2/

var a = { what: "A regular JS object" },
b = $('body');

if ( a.jquery ) { // falsy, since it's undefined
    alert(' a is a jQuery object! ');    
}

if ( b.jquery ) { // truthy, since it's a string
    alert(' b is a jQuery object! ');
}
105
mt81

instanceof 演算子を調べてください。

var isJqueryObject = obj instanceof jQuery
30
Corey Sunwold

オブジェクトのインスタンスをチェックする最善の方法はinstanceof operatorまたはオブジェクトのプロトタイプが別のオブジェクトのプロトタイプにあるかどうかを調べる isPrototypeOf() )を使うことです。プロトタイプチェーン.

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

しかし、ドキュメントに複数のjQueryインスタンスがあると失敗することがあります。 @Georgiy Ivankinが述べたように:

現在のネームスペースに$を指すjQuery2があり、外側のネームスペースからのオブジェクトがある場合($jQuery1である場合)、そのオブジェクトがinstanceofname__オブジェクトであるかどうかを確認するのにjQueryname__を使用する方法はありません

この問題を解決する1つの方法は、jQueryオブジェクトをクロージャまたはIIFE)にエイリアスすることです。

//aliases jQuery as $
(function($, undefined) {
    /*... your code */

    console.log(obj instanceof $);
    console.log($.prototype.isPrototypeOf(obj));

    /*... your code */
}(jQuery1));
//imports jQuery1

この問題を解決する他の方法は、jqueryname__のobjname__プロパティを問い合わせることです。

'jquery' in obj

ただし、そのプリミティブ値を使用してそのチェックを実行しようとするとエラーが発生するため、objname__をObjectname__にすることで前のチェックを変更できます。

'jquery' in Object(obj)

これまでの方法が最も安全というわけではありませんが(オブジェクト内に'jquery'プロパティを作成することができます)、次の2つの方法を併用して検証を向上させることができます。

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }

ここでの問題は、どのオブジェクトもそれ自身としてプロパティjqueryname__を定義できることです。そのため、より良い方法はプロトタイプで問い合わせて、オブジェクトがnullname__またはundefinedname__ではないことを確認することです。

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }

coercionのため、ifname__がfalsyvalues(objname__、nullname__)のいずれかである場合、undefinedname__ステートメントは&&演算子を評価することによって短絡になります。 、falsename__、0"")を入力してから、他の検証の実行に進みます。

最後に、効用関数を書くことができます。

function isjQuery(obj) {
  return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}

見てみましょう: 論理演算子と真実/ falsy

24
jherax
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
3
johnchou

しかし、jQueryでオブジェクトをチェックするもう1つの方法があります。

jQuery.type(a); //this returns type of variable.

私は物事を理解するために例を作りました、 jsfiddle link

3
Shaunak Shukla

JQueryがインストールされていないオブジェクトがjQueryオブジェクトかどうかを知りたい場合は、次のスニペットを使用してください。

function isJQuery(obj) {
  // Each jquery object has a "jquery" attribute that contains the version of the lib.
  return typeof obj === "object" && obj && obj["jquery"];
}
2
Karl.S

オブジェクトがjqueryプロパティを使用してJQueryによって生成されたものかどうかを確認できます。

myObject.jquery // 3.3.1

=>オブジェクトがJQueryによって生成された場合はJQueryのバージョン番号を返します。 =>それ以外の場合、undefinedを返します。

1