Как я могу изменить элемент JS, чтобы увидеть, является ли это node или пустой переменной?
Проверьте, является ли переменная действительным элементом node
Ответ 1
Это зависит от того, что вы подразумеваете под пустой переменной.
Если вы имеете в виду, что у него не было назначенного значения, вы можете проверить undefined
alert( someVariable !== "undefined" );
Или, если вы знаете, что у него есть значение, и нужно выяснить, является ли он элементом, вы можете сделать что-то вроде этого:
alert( someVariable && someVariable.nodeType );
Или, если вам нужно проверить, что это элемент типа 1, вы можете сделать это:
alert( someVariable && someVariable.nodeType === Node.ELEMENT_NODE );
Это устраняет текстовые узлы, узлы атрибутов, комментарии и кучу других.
Ответ 2
A node? Элемент DOM? он будет иметь свойство .nodeType
.
Относительно nodeValue
для другого ответа nodeValue может быть пустым, но node всегда будет иметь nodeType
.
Ответ 3
Используя элемент HTML и взглянув на вкладку "Свойства" в инструментах Chrome Dev мы можем видеть потомков:
HTML- > HTMLHtmlElement- > HTMLElement- > Элемент → Node → EventTarget- > Объект
Теперь мы не хотим проверять первые 2 независимо от того, что, слишком много разных возможностей так что оставим нас с HTMLElement или Element. Так в чем же разница?
HTML, HEAD, SCRIPT, META, BODY, DIV, P и UL имеют одинаковое наследование:
HTMLElement- > Элемент → Node → EventTarget- > Объект
Теперь несколько отрицательных результатов из типичного документа, где:
<!DOCTYPE html> DocumentType->Node->EventTarget->Object
<!-- COMMENT --> Comment->CharacterData->Node->EventTarget->Object
Итак, Node является общим знаменателем, но вопрос заключается в том, как проверить Действительный DOM Node, как проверить действительный элемент DOM Node. Таким образом, любой объект с HTMLElement возвращает true, в противном случае возвращает false.
Теперь, используя Chrome Dev Tools, вы можете просмотреть элемент HTML:
$obj.nodeType; //1 No help what so ever
$obj.nodeName; //HTML Gives use the tag names
$obj.nodeValue; //null Waste of DOM space
проверить прототип или __прото?
$obj.prototype.nodeType; //TypeError
$obj.prototype.nodeName; //TypeError
$obj.prototype.nodeValue; //TypeError
$obj.__proto__.nodeType; //undefined
$obj.__proto__.nodeName; //undefined
$obj.__proto__.nodeValue; //undefined
Хорошо, поэтому использование Node мертво для использования. Перейдем к конструктору.
$obj.constructor.name
//"HTMLHtmlElement" promising...
$obj.constructor.__proto__.prototype.toString()
//[object Object]
$obj.constructor.__proto__.constructor.name
Function
$obj.constructor.__proto__.prototype.constructor.name
HTMLElement
//BINGO
Теперь давайте обернемся в хорошую чистую эффективную функцию полезности.
//readable version
isElement=function($obj){
try {
return ($obj.constructor.__proto__.prototype.constructor.name)?true:false;
}catch(e){
return false;
}
}
/**
* PRODUCTION
* Return true if object parameter is a DOM Element and false otherwise.
*
* @param {object} Object to test
* @return {boolean}
*/
isElement=function(a){try{return a.constructor.__proto__.prototype.constructor.name?!0:!1}catch(b){return!1}};
Тесты:
$html=get('html')[0]; //[<html data-role="webpage" data-theme="dark" data-require="fa" data-hello="world">…</html>]
isElement($html); //"HTMLElement"
isElement($html.dataset); //false
isElement($html.firstChild); //"HTMLElement"
isElement($html.textContent); //false
$tail=gei('tail'); //<tail id="tail">…</tail>
isElement($tail); //"HTMLElement"
isElement(get('title')[0]); //"HTMLElement"