Ответ 1
Чтобы проверить элемент DOM, вы можете проверить его свойство nodeType
:
if( elm.nodeType ) {
// Was a DOM node
}
или вы можете проверить свойство jQuery:
if( elm.jquery ) {
// Was a jQuery object
}
У меня есть функция, которую я хочу разрешить для передачи как обычного элемента объекта 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.
Чтобы проверить элемент DOM, вы можете проверить его свойство nodeType
:
if( elm.nodeType ) {
// Was a DOM node
}
или вы можете проверить свойство jQuery:
if( elm.jquery ) {
// Was a jQuery object
}
Чтобы проверить объект jQuery, вы можете использовать оператор instanceof
:
if(elm instanceof jQuery) {
...
}
или
if(elm instanceof $) {
...
}
jQuery делает это так:
if ( selector.nodeType )
(jQuery 1.4.3, строка 109)
Самый простой способ - просто передать его в функцию 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 с переданным в нем.
elm instanceof jQuery
является самым надежным способом, так как тестирование elm.nodeType
допускало бы {nodeType:1}
для элемента DOM, а тестирование elm.jquery
было бы ошибкой {jquery:$()}
для объекта jQuery, в дополнение к отсутствию гарантийного будущего Объекты jQuery не будут иметь свойства jquery
.
Классный способ:
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 не удалось загрузить.)