Nesnenin bir jQuery nesnesi olup olmadığını kontrol edin


601

Bir nesnenin bir jQuery nesnesi mi yoksa yerel bir JavaScript nesnesi mi olduğunu kontrol etmenin hızlı bir yolu var mı?

misal:

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

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

doStuff(o);
doStuff(e);

Açıkçası, yukarıdaki kod çalışıyor ama güvenli değil. oNesneye potansiyel olarak bir seçici anahtar ekleyebilir ve aynı sonucu alabilirsiniz. Nesnenin bir jQuery nesnesi olduğundan emin olmanın daha iyi bir yolu var mı?

Doğrultusunda bir şey (typeof obj == 'jquery')


3
JQuery 3.0'dan itibaren, bu selectorözellik jQuery nesnesi olan bir nesneyi kontrol etmek için kesinlikle doğru bir yol değildir çünkü özellik uzun zaman önce kullanımdan kaldırılmış ve 3.0'da kaldırılmıştır. Önceki sürümlerde bile, bir jQuery nesnesinin boş bir seçici dizesi olabilir, örneğin $(window)seçici yoktur. instanceofBunun yerine kullanın .
Dave Methvin

Yanıtlar:


878

instanceofOperatörü kullanabilirsiniz :

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

Açıklama : jQuery(aka $) işlevi yapıcı işlevi olarak uygulanır . Yapıcı işlevleri newönek ile çağrılmalıdır .

Aradığınızda $(foo), dahili olarak jQuery bunu new jQuery(foo)1'e çevirir . JavaScript , özelliklerini (aka ) üzerinde bulunanlara ayarlayarak thisyeni bir örneğini göstermek için yapıcı işlevi içinde başlatmaya devam eder . Böylece, bir olsun nesneyi olduğunu .jQueryjQuery.prototypejQuery.fnnewinstanceof jQuerytrue


1 Aslında new jQuery.prototype.init(foo): kurucu mantığı, adı verilen başka bir kurucu işlevine indirilmiştir init, ancak kavram aynıdır.


8
Yani demek istiyorsun if (obj instanceof jQuery){...}?
Nigel Angel

2
@NigelAngel: Evet, demek istediği bu :)
ChaseMoskal

12
Bu, bir sayfada birden çok jQuery örneği olması durumunda çalışmaz.
Georgii Ivankin

5
@CrescentFresh Geçerli ad alanımda jQuery2 işaret eden $ varsa ve bu nesne bir jQuery nesnesi olup olmadığını denetlemek için instanceof kullanmak için hiçbir yolu var ($ $ jQuery1 olduğu) bir nesne var demek.
Georgii Ivankin

6
Eğer jQuery eğer ifadenin zamanında yüklenen olmadığına emin olsun Eğer sen olmak çek uzatabilirsiniz typeof jQuery === 'function' && obj instanceof jQueryberi jQueryiçin sırayla belirtilmelidir zorunda değildir typeofbir hata atma olmadan işe operatörü.
Patrick Roberts

105

.Jquery özelliğini burada açıklandığı şekilde de kullanabilirsiniz: 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
David'in soruda belirttiği gibi , değeri olan bir değişkenin bir özelliğini kontrol etmek null olabilir (yani "a" veya "b" boşsa) güvenli değildir (bir TypeError atar). "B instanceof jQuery" kullanmak daha iyidir.
rstackhouse

23
Bu şekilde jQuery yüklü değilse çalışır, ancak b instanceof jQueryjQuery sayfada yoksa bir ReferenceError atar. Her iki yaklaşım da farklı durumlarda yararlıdır.
Nate

Daha verimli olabilir, ancak yine de güvenli değildir. Bu gerektirebilir try ... catchözellikle ihtiyar içinde.
ClarkeyBoy

if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
JQuery'nin

Bu iyi bir örnek değil. Daha büyük olasılıkla abir DOM düğümü olabilir, document.bodyve teorik olarak, jqueryanahtarın bir şekilde bu düğüm zincirinin üstünde olma şansı vardır .
vsync


26

Bir nesnenin örneğini kontrol etmenin en iyi yolu, instanceof operatörü veya bir nesnenin prototipinin başka bir nesnenin prototip zincirinde olup olmadığını kontrol eden isPrototypeOf () yöntemidir .

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

Ancak bazen bir belgedeki birden fazla jQuery örneği durumunda başarısız olabilir. @Georgiy Ivankin'in belirttiği gibi:

Ben varsa $benim şimdiki ad işaret eden jQuery2ve dış ad (burada bir nesne var $ise jQuery1) o zaman kullanmak yolu yoktur instanceofbu nesne bir olup olmadığını kontrol için jQuerynesne

Bu sorunun üstesinden gelmenin bir yolu jQuery nesnesini bir kapatma veya IIFE

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

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

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

Bu sorunun üstesinden gelmenin diğer bir yolu, jquerymülkünobj

'jquery' in obj

Ancak, bu denetimi ilkel değerlerle gerçekleştirmeye çalışırsanız, bir hata atar, böylece önceki denetimi değiştirerek objbirObject

'jquery' in Object(obj)

Önceki yol en güvenli olmasa da ( 'jquery'özelliği bir nesnede oluşturabilirsiniz), her iki yaklaşımla da çalışarak doğrulamayı geliştirebiliriz:

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

Buradaki sorun, herhangi bir nesne bir özellik tanımlamak olmasıdır jquerydaha iyi bir yaklaşım prototip sormak olacağını, böylece kendi gibi ve nesne olmadığından emin nullyaundefined

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

Nedeniyle zorlama , ifdeyim değerlendirerek kısa devre yapacak &&zaman operatörü objherhangi biridir falsy değerler ( null, undefined, false, 0, "") ve sonra diğer doğrulamaları gerçekleştirmek için ilerler.

Son olarak bir yardımcı program yazabiliriz:

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

Şuna bir bakalım: Mantıksal Operatörler ve doğruluk / sahtelik


Ancak bu güvenliği nasıl geliştirir? Jquery özelliğine sahip jQuery olmayan nesneler yine de yanlış algılanır. Ben de her iki yaklaşımı kullanarak başka neler "geliştirmek" göremiyorum.
Gui Prá

bu, bir nesnenin jQuery nesnesi olup olmadığını kontrol etmenin kolay bir yoludur, herhangi bir nedenle bir kişinin jquery gibi özelliklere sahip nesneler oluşturduğundan şüpheleniyorsanız , daha doğrulayıcı, yani prototipteki özellikleri kontrol edebilirsiniz : myObj .constructor.prototype.jquery veya daha iyisi, Object.prototype.isPrototypeOf ()
jherax

1
Eğer varsa ||bir o herhangi 'jquery' in Object(obj)olsa da, buna dışı jQuery doğrulama geçmesini o mülkle nesneleri engel olmaz, çünkü tahliye gider. Yine de, prototipte bu özelliği kontrol etmenin durumu iyileştirdiğine inanıyorum. Belki de cevabınıza eklemelisiniz! Burada başka bir cevap olduğunu düşünmüyorum ki bu olasılık :)
Gui Prá

1
değil obj.__proto__.jqueryyerine obj.constructor.prototype.jqueryyeterli? biraz kısa :)
Axel

1
@Axel evet, çok işe yarıyor :). Ben kullandım constructor.prototypeçünkü objyapıcı bir örnek olması gerekiyordu, yani jQuery. Öte yandan __proto__her türlü nesne için kullanılabilir.
jherax

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

Bir DOM öğesini kontrol etmek, nodeTypeözelliği daha iyi kullanmak ve bir booleandeğerin döndürülmesini sağlamak için çift olumsuzlama kullanabilirsiniz!!(el && el.nodeType)
jherax

3

Ancak, nesneyi jQuery'de kontrol etmenin bir yolu daha vardır.

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

Ben şeyler anlamak için örnek yaptım, jsfiddle link


2

Bir nesnenin jQuery yüklü olmadan bir jQuery nesnesi olup olmadığını bilmek isteyenler için, aşağıdaki snippet'in işi yapması gerekir:

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

Nesnenin JQuery tarafından jqueryözellik ile üretilip üretilmediğini kontrol edebilirsiniz :

myObject.jquery // 3.3.1

=> JQuery tarafından üretilen nesne JQuery sürüm numarasını döndürür. => aksi takdirde geri dönerundefined


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

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

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

11
Açıklama yapmadan kod dökümleri nadiren yararlıdır. Lütfen cevabınıza bir bağlam eklemeyi düşünün.
Chris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.