Проверьте, является ли переменная действительным элементом node

Как я могу изменить элемент JS, чтобы увидеть, является ли это 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"