2010-11-10 3 views
31

У меня есть функция, которую я хочу разрешить передавать как в обычном объекте элемента DOM javascript, так и в объекте jQuery. Если его еще не объект jQuery, я сделаю его одним.Обнаружение объекта DOM против объекта jQuery

Кто-нибудь знает очень надежный способ обнаружить это.

function functionName(elm){ 
    //Detect if elm is not a jquery object in condition 
    if (elm) elm = $(elm); 

} 

Логический подход заключается в обнаружении одного из свойств объекта элемента DOM. Вопрос в том, какое свойство было бы наиболее надежным для обнаружения?

Я мог бы просто сделать его объектом jquery в любом случае, поскольку jQuery не имеет проблемы с чем-то вроде: $ ($ imajQueryObjAlready); Однако цель этого вопроса состоит не в том, чтобы просто решить проблему, а в том, чтобы найти хороший способ определить, является ли объект DOM объектом jQuery.

ответ

58

Для проверки элемента DOM, вы можете проверить его nodeType свойство:

if(elm.nodeType) { 
    // Was a DOM node 
} 

или вы можете проверить свойство JQuery:

if(elm.jquery) { 
    // Was a jQuery object 
} 
+3

+1 Два отличных решения - я предпочитаю последний для удобочитаемости. – lonesomeday

+2

@lonesomeday - Единственное исключение, которое я дал бы (или должен был дать), это то, что он не является частью публичного API, [в настоящее время так или иначе] (http://bugs.jquery.com/ticket/7200), поэтому jQuery может решить удалить это свойство когда-нибудь. Сомневаюсь. – user113716

+4

Правда. Конечно, наоборот, jQuery может решить добавить свойство 'nodeType'! – lonesomeday

8

JQuery делает это следующим образом:

if (selector.nodeType) 

(jQuery 1.4.3, строка 109)

13

Для проверки объекта JQuery, вы можете использовать instanceof оператор:

if(elm instanceof jQuery) { 
    ... 
} 

или:

if(elm instanceof $) { 
    ... 
} 
6

Самый простой способ это просто передать его в функцию JQuery либо образом. Если это уже объект JQuery, он возвращает его без изменений:

function(elem){ 
    elem = $(elem); 
    ... 
} 

из исходного кода JQuery, это то, что происходит:

if (selector.selector !== undefined) { 
    this.selector = selector.selector; 
    this.context = selector.context; 
} 

return jQuery.makeArray(selector, this); 

Где makeArray вливается новый объект (по умолчанию) JQuery с пройденный в одном.

+0

+1 для простоты – zzzzBov

+2

На самом деле это не изменилось. Вы получаете новый объект jQuery. Могут быть побочные эффекты. Вот демо: http://jsfiddle.net/nu7D6/ – user113716

+0

@Patrick - Нет, вы вернете исходный объект jQuery, если он уже является объектом jQuery. $ (selector) === $ ($ (selector)) всегда возвращает true. –

6

elm instanceof jQuery самый надежный способ, как тестирование elm.nodeType бы ошибкой {nodeType:1} для элемента DOM, и тестирование elm.jquery будет ошибкой {jquery:$()} для объекта JQuery, в дополнение к так как нет никакой гарантии в будущем объекты JQuery не будет иметь jquery недвижимость ,

0

Классный способ:

function is_jquery_object(x) { 
    return window.jQuery && x instanceof jQuery; 
} 

function is_dom_object(x) { 
    return window.HTMLElement && x instanceof HTMLElement; 
} 

Опираясь на @ karim79 Ответим, если вам нужно быть уверен это либо DOM или объект JQuery, использовать эти тесты. (Тест window помогает функции неудачно изящно, если класс не определен, например, jQuery не удалось загрузить.)

Смежные вопросы