Обнаружение объекта DOM против объекта JQuery - PullRequest
32 голосов
/ 10 ноября 2010

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

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

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

}

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

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

Ответы [ 6 ]

61 голосов
/ 10 ноября 2010

Чтобы проверить элемент DOM, вы можете проверить его свойство nodeType:

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

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

if( elm.jquery ) {
    // Was a jQuery object
}
13 голосов
/ 10 ноября 2010

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

if(elm instanceof jQuery) {
    ...
}

или:

if(elm instanceof $) {
    ...
}
8 голосов
/ 10 ноября 2010

jQuery делает это так:

if ( selector.nodeType )

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

7 голосов
/ 10 ноября 2010

Самый простой способ - просто передать его в функцию 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 с переданным в один.

6 голосов
/ 10 ноября 2010

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

0 голосов
/ 30 января 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...