जांचें कि ऑब्जेक्ट एक jQuery ऑब्जेक्ट है या नहीं


601

यदि एक वस्तु एक jQuery वस्तु या एक देशी जावास्क्रिप्ट वस्तु है तो जाँच का एक तेज़ तरीका है?

उदाहरण:

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')


3
JQuery 3.0 के रूप में, यह निश्चित रूप से एक jQuery ऑब्जेक्ट होने के लिए किसी वस्तु की जांच करने का एक सही तरीका नहीं है क्योंकि selectorसंपत्ति को बहुत पहले ही हटा दिया गया था और 3.0 में हटा दिया गया था। पहले के संस्करणों में भी, एक jQuery ऑब्जेक्ट में एक खाली चयनकर्ता स्ट्रिंग हो सकती है, उदाहरण के लिए $(window)कोई चयनकर्ता नहीं है। instanceofइसके बजाय उपयोग करें ।
डेव मेथ्विन

जवाबों:


878

आप instanceofऑपरेटर का उपयोग कर सकते हैं :

if (obj instanceof jQuery){
    console.log('object is jQuery');
}

स्पष्टीकरण : jQueryफ़ंक्शन (उर्फ $) को एक कंस्ट्रक्टर फ़ंक्शन के रूप में कार्यान्वित किया जाता है । कंस्ट्रक्टर कार्यों के साथ बुलाया जाना हैnew उपसर्ग के ।

जब आप कॉल करते हैं $(foo), तो आंतरिक रूप से jQuery इसका new jQuery(foo)1 में अनुवाद करता है । जावास्क्रिप्ट thisएक नए उदाहरण की ओर इशारा करने के लिए निर्माण कार्य के अंदर इनिशियलाइज़ करने के लिए आगे बढ़ता है jQuery, यह उस पर पाए जाने वाले jQuery.prototype(उर्फ jQuery.fn) के गुणों को निर्धारित करता है । इस प्रकार, आपको एक newवस्तु मिलती है जहां instanceof jQueryहै true


1 यह वास्तव में है new jQuery.prototype.init(foo): कंस्ट्रक्टर लॉजिक को किसी अन्य कंस्ट्रक्टर फ़ंक्शन को ऑफलोड किया गया है init, लेकिन अवधारणा समान है।


8
तो आपका मतलब है if (obj instanceof jQuery){...}?
निगेल एंजेल

2
@ निगेलअंगेल: हाँ, उसका यही मतलब है :)
चेसमॉस्कल

12
यह एक पृष्ठ पर कई jQuery उदाहरणों के मामले में काम नहीं करता है।
जॉर्जी इवान्किन

5
@CrescentFresh का मतलब है कि अगर मेरे पास jQuery2 की ओर इशारा करते हुए मेरे वर्तमान नामस्थान में $ है और मेरे पास बाहरी नाम स्थान (जहाँ $ jQuery1 है) से एक वस्तु है, तो मेरे पास यह जाँचने के लिए कोई साधन नहीं है कि क्या यह वस्तु एक jQuery वस्तु है।
जॉर्जी इवांका

6
यदि आप सुनिश्चित नहीं हैं कि क्या कथन के समय jQuery लोड किया गया है, तो आप चेक को विस्तारित कर सकते हैं typeof jQuery === 'function' && obj instanceof jQueryक्योंकि ऑपरेटर को किसी त्रुटि के बिना काम jQueryकरने के लिए घोषित करने की आवश्यकता नहीं है typeof
पैट्रिक रॉबर्ट्स

105

आप यहाँ वर्णित .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! ');
}

12
जैसा कि डेविड ने प्रश्न में बताया है, एक चर की संपत्ति की जांच करना, जिसका मूल्य शून्य हो सकता है (यानी अगर "" ए "या" बी "अशक्त थे) सुरक्षित नहीं है (यह एक टाइपरोर फेंक देगा)। "B Instof jQuery" का उपयोग करना बेहतर है।
रैस्टहाउस हाउस

23
यदि jQuery लोड नहीं है, तो यह तरीका काम करता है, जबकि b instanceof jQueryयदि JQuery पेज पर उपलब्ध नहीं है, तो एक रेफ़रेंस फेंकता है। दोनों दृष्टिकोण अलग-अलग मामलों में उपयोगी हैं।
नैट

अधिक कुशल हो सकता है, लेकिन अभी भी सुरक्षित नहीं है। इसकी आवश्यकता हो सकती है try ... catch, विशेषकर oldIE में।
क्लार्कबोय

ऐसे मामलों में जहां यह संभव है कि jQuery लोड न हो, आप उपयोग कर सकते हैंif ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
हैरी पेहकोनेंन

यह इतना अच्छा उदाहरण नहीं है .. अधिक संभावना aएक डोम नोड होगी, जैसे document.bodyऔर फिर, सैद्धांतिक रूप से एक मौका है कि jqueryकुंजी किसी तरह उस नोड की श्रृंखला के ऑनटॉप के रूप में आए।
vsync


26

एक वस्तु का उदाहरण जाँच करने के लिए सबसे अच्छा तरीका है के माध्यम से है instanceof ऑपरेटर या विधि के साथ isPrototypeOf () जो निरीक्षण करता है, तो एक वस्तु के प्रोटोटाइप किसी अन्य वस्तु के प्रोटोटाइप श्रृंखला में है।

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

लेकिन कभी-कभी यह एक दस्तावेज़ पर कई jQuery उदाहरणों के मामले में विफल हो सकता है। जैसा @Georgiy Ivankin ने उल्लेख किया है:

यदि मेरे पास $मेरे वर्तमान नाम स्थान की ओर इशारा करते हैं jQuery2और मेरे पास बाहरी नाम स्थान (जहां $है jQuery1) से एक वस्तु है, तो मेरे पास instanceofजांच के लिए उपयोग करने का कोई तरीका नहीं है यदि वह वस्तु एक jQueryवस्तु है

उस समस्या को दूर करने का एक तरीका एक बंद या IIFE में jQuery ऑब्जेक्ट को अलियास करके है

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

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

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

उस समस्या को दूर करने का अन्य तरीका jqueryसंपत्ति की पूछताछ करना हैobj

'jquery' in obj

हालाँकि, अगर आप उस जाँच को प्राथमिक मानों के साथ करने का प्रयास करते हैं, तो यह एक त्रुटि है, इसलिए आप objएक होना सुनिश्चित करके पिछली जाँच को संशोधित कर सकते हैंObject

'jquery' in Object(obj)

हालांकि पिछला तरीका सबसे सुरक्षित नहीं है (आप 'jquery'किसी ऑब्जेक्ट में संपत्ति बना सकते हैं ), हम दोनों के साथ काम करके सत्यापन में सुधार कर सकते हैं:

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

यहां समस्या यह है कि कोई भी वस्तु किसी संपत्ति jqueryको अपने अनुसार परिभाषित कर सकती है , इसलिए एक बेहतर तरीका यह होगा कि आप प्रोटोटाइप में पूछें, और यह सुनिश्चित करें कि वह वस्तु है nullया नहींundefined

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

के कारण बलात्कार , ifबयान का मूल्यांकन करके शॉर्ट सर्किट कर देगा &&ऑपरेटर जब objसे किसी है falsy मूल्यों ( null, undefined, false, 0,"" ), और फिर अन्य सत्यापन प्रदर्शन करने के लिए आगे बढ़ते हैं।

अंत में हम एक उपयोगिता फ़ंक्शन लिख सकते हैं:

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

आइए नज़र डालते हैं: तार्किक संचालक और सत्य / मिथ्या


हालांकि यह सुरक्षा में सुधार कैसे करता है? एक jQuery संपत्ति के साथ गैर- jQuery वस्तुओं अभी भी गलत किया जाएगा। मैं यह नहीं देखता कि दोनों दृष्टिकोणों का उपयोग करके "सुधार" भी हो सकता है।
गुई प्रात

यह जांचने का एक आसान तरीका है कि क्या कोई वस्तु एक jQuery वस्तु है, यदि किसी भी कारण से आपको संदेह है कि कोई व्यक्ति ऐसे गुण पैदा कर रहा है जैसे कि jquery , तो आप एक सत्यापनकर्ता को अधिक मजबूत बना सकते हैं, अर्थात प्रोटोटाइप में गुणों की जाँच कर सकते हैं : myOfj .constructor.prototype.jquery या बेहतर अभी तक, आप फ़ंक्शन का उपयोग कर सकते हैं ऑब्जेक्ट .prototype.isPrototypOf ()
jherax

1
यदि आप में से ||कोई भी 'jquery' in Object(obj), हालांकि, यह नाली में चला जाता है, क्योंकि यह गैर-jQuery वस्तुओं को उस संपत्ति के सत्यापन से गुजरने से नहीं रोकेगा। मेरा मानना ​​है कि प्रोटोटाइप में उस संपत्ति की जांच करने से स्थिति में सुधार होता है, हालांकि। हो सकता है कि आप अपने जवाब में इसे जोड़ दें! मुझे नहीं लगता कि यहां कोई अन्य उत्तर उस संभावना का उल्लेख करता है :)
गुई प्रा 0

1
पर्याप्त के obj.__proto__.jqueryबजाय नहीं obj.constructor.prototype.jqueryहै? बस थोड़ा सा कम :)
Axel

1
@ एक्सल हाँ, यह भी काम करता है :)। मैंने उपयोग किया constructor.prototypeक्योंकि objमाना जाता है कि कंस्ट्रक्टर का एक उदाहरण है, वह है jQuery। दूसरी ओर __proto__किसी भी प्रकार की वस्तु के लिए उपलब्ध है।
जेरैक्स

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

DOM तत्व के लिए जाँच करने के लिए, बेहतर nodeTypeसंपत्ति का उपयोग करें , और यह सुनिश्चित करने के लिए कि एक booleanमूल्य वापस किया जाए, आप दोहरे निषेध का उपयोग कर सकते हैं!!(el && el.nodeType)
jherax

3

हालाँकि, jQuery में ऑब्जेक्ट की जांच करने का एक और तरीका है।

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

मैंने चीजों को समझने के लिए उदाहरण बनाया है, jsfiddle लिंक


2

जो लोग जानना चाहते हैं कि क्या कोई वस्तु 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"];
}

1

आप देख सकते हैं कि ऑब्जेक्ट JQuery द्वारा jqueryसंपत्ति के साथ निर्मित किया गया है:

myObject.jquery // 3.3.1

=> JQuery संस्करण की संख्या लौटाते हैं यदि JQuery द्वारा निर्मित वस्तु। => अन्यथा, यह वापस आ जाता हैundefined


-9
var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE

11
स्पष्टीकरण के बिना कोड डंप शायद ही कभी उपयोगी होते हैं। कृपया अपने उत्तर में कुछ संदर्भ जोड़ने पर विचार करें।
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.