Подтвердить что ты не робот

Обнаружение объекта DOM и объекта jQuery

У меня есть функция, которую я хочу разрешить для передачи как обычного элемента объекта 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.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

if(elm instanceof jQuery) {
    ...
}

или

if(elm instanceof $) {
    ...
}

Ответ 3

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

if ( selector.nodeType )

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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 не удалось загрузить.)