2008-10-08 16 views
85

¿Hay alguna forma de probar el tipo de elemento en JavaScript?Prueba del tipo de un elemento DOM en JavaScript

La respuesta puede requerir o no la biblioteca de prototipos, sin embargo, la siguiente configuración hace uso de la biblioteca.

function(event) { 
    var element = event.element(); 
    // if the element is an anchor 
    ... 
    // if the element is a td 
    ... 
} 

Respuesta

109

Puede utilizar typeof(N) para obtener el tipo de objeto real, pero lo que quiere hacer es comprobar la etiqueta, no el tipo de elemento DOM. En este caso, use la propiedad elem.tagName o elem.nodeName.

si quiere ser realmente creativo, puede usar un diccionario de nombres de etiquetas y cierres anónimos en lugar de un interruptor o si/else.

63
if (element.nodeName == "A") 
{ 
} 
else if (element.nodeName == "TD") 
{ 
} 
+10

+1 porque usar ** MAYÚSCULAS ** no es una opción! ;) –

+1

A veces lo es. De todos modos, siempre puedes usar 'element.nodeName.match (/ \ bTBODY \ b/i)' o 'element.nodeName.toLowerCase() == 'tbody'' etc. – Robusto

+5

@Robusto es incorrecto. Si el documento es HTML y la implementación de DOM es correcta, siempre estará en mayúsculas. De acuerdo con: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-104682815 debajo de la sección "tagName" (para elementos nodeName == tagName) "El HTML DOM regresa el tagName de un elemento HTML en la forma canónica mayúscula, independientemente del caso en el documento HTML fuente ". – bobwienholt

17

Tal vez tendrá que comprobar el tipo de nodos también:

if(element.nodeType == 1){//element of type html-object/tag 
    if(element.tagName=="a"){ 
    //this is an a-element 
    } 
    if(element.tagName=="div"){ 
    //this is a div-element 
    } 
} 

Editar: Se ha corregido el valor nodeType

+3

Tenga cuidado con el caso de tagName. – eyelidlessness

+3

sí, parece que tagName devolverá los nombres de las etiquetas en mayúsculas. –

+0

@Casey: lo hará en una página HTML; en una página XHTML, se conserva el caso de la etiqueta (por lo que "a" será "A" en páginas HTML y "a" en páginas XHTML): http://www.w3.org/TR/2000/REC- DOM-Level-2-Core-20001113/core.html # ID-104682815 (Asumiendo que la página XHTML se ha servido correctamente y no se ha servido como 'text/html'.) –

6

roenving es correcta, pero es necesario cambiar el examen para:

 
if(element.nodeType == 1) { 
//code 
} 

porque nodeType of 3 es en realidad un nodo de texto y nodeType de 1 es un elemento HTML. Ver http://www.w3schools.com/Dom/dom_nodetype.asp

0

Tengo otra forma de probar lo mismo.

Element.prototype.typeof = "element"; 
 
var element = document.body; // any dom element 
 
if (element && element.typeof == "element"){ 
 
    return true; 
 
    // this is a dom element 
 
} 
 
else{ 
 
    return false; 
 
    // this isn't a dom element 
 
}

0

lo general obtener desde el valor de retorno toString(). Funciona de manera diferente accede a los elementos DOM:

var a = document.querySelector('a'); 

var img = document.createElement('img'); 

document.body.innerHTML += '<div id="newthing"></div>'; 
var div = document.getElementById('newthing'); 

Object.prototype.toString.call(a); // "[object HTMLAnchorElement]" 
Object.prototype.toString.call(img); // "[object HTMLImageElement]" 
Object.prototype.toString.call(div); // "[object HTMLDivElement]" 

A continuación, el dato relevante:

Object.prototype.toString.call(...).split(' ')[1].slice(0, -1); 

funciona en Chrome, FF, Opera, Borde, IE9 + (en IE mayores que vuelva "[object Object] ").

Cuestiones relacionadas