2010-09-23 11 views

risposta

17

Dipende da cosa intendi per variabile vuota.

Se significa che non ha avuto un valore assegnato, è possibile verificare la presenza di undefined

alert(someVariable !== "undefined"); 

Oppure, se si sa che ha un valore, e la necessità di vedere se si tratta di un elemento, si potrebbe fare qualcosa di simile:

alert(someVariable && someVariable.nodeType); 

Oppure, se avete bisogno di verificare che si tratta di un elemento di tipo 1, si potrebbe fare questo:

alert(someVariable && someVariable.nodeType === Node.ELEMENT_NODE); 

Elimina nodi di testo, nodi attributi, commenti e a bunch of others.

+0

Il nodeValue potrebbe essere vuoto/vuoto/nullo, no? '!! (document.createElement ('p')). nodeValue' –

+0

Fintanto che non ci sono altri oggetti con la proprietà' nodeType'. Le probabilità sono scarse, però. – crush

5

Un nodo? Un elemento DOM? avrebbe una proprietà .nodeType.

Riguardo nodeValue per l'altra risposta, il nodeValue può vuoto ma un nodo sempre un nodeType.

5

utilizzando l'elemento HTML e dare un'occhiata alla scheda Proprietà in Chrome Dev Tools possiamo vedere i discendenti:

HTML-> HTMLHtmlElement-> HTMLElement-> elemento-> Node> EventTarget- > oggetto

Ora non vogliamo controllare i primi 2 non importa cosa, troppe possibilità diverse in modo che ci lasciano con HTMLElement o elemento. Quindi qual è la differenza?

HTML, HEAD, SCRIPT, META, CORPO, DIV, P e UL hanno tutti la stessa eredità:

HTMLElement-> elemento-> Node> EventTarget-> Oggetto

ora un paio di risultati negativi da un documento tipico in cui:


<!DOCTYPE html>  DocumentType->Node->EventTarget->Object 
<!-- COMMENT --> Comment->CharacterData->Node->EventTarget->Object 

Quindi il nodo è il denominatore comune, ma la domanda è su come controllare un nodo DOM valido è come verificare un elemento del nodo DOM valido. Quindi qualsiasi oggetto con HTMLElement restituisce true, altrimenti restituisce false.

Ok ora utilizzando gli strumenti di Chrome Dev consente di guardare l'elemento HTML:

$obj.nodeType;  //1  No help what so ever 
$obj.nodeName;  //HTML Gives use the tag names 
$obj.nodeValue;  //null Waste of DOM space 

cerchiamo di controllare il prototipo o __proto?

$obj.prototype.nodeType; //TypeError 
$obj.prototype.nodeName; //TypeError 
$obj.prototype.nodeValue; //TypeError 

$obj.__proto__.nodeType; //undefined 
$obj.__proto__.nodeName; //undefined 
$obj.__proto__.nodeValue; //undefined 

Ok, quindi utilizzare il nodo è morto da utilizzare. Consente di passare al costruttore.

$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 

Ora consente di avvolgere in una bella funzione di utilità efficiente pulita.

//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}}; 

Test:

$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" 
+1

meder sottolinea che esiste sempre un nodeType e che è corretto. Questa è stata la prima cosa che ho controllato e il valore è 1. Lo standard nodeType 1 definito come "Elemento \t rappresenta un elemento \t Elemento, testo, commento, ProcessingInstruction, CDATASection, EntityReference". La domanda era per 'Elemento' non Testo, Commento, ecc. Quindi la mia funzione isElement() è la corretta? o mi sbaglio? – NlaakALD

Problemi correlati