2010-09-20 13 views
15

tratando de determinar un método decente, navegador cruzado para obtener atributos con javascript? supongamos que el uso de la biblioteca de JavaScript (jQuery/Mootools/etc.) no es una opción.Cross-browser, método de javascript getAttribute()?

He intentado lo siguiente, pero frecuentemente obtengo "atributos" es nulo o no es un error de objeto cuando IE intenta usar el método "else". ¿Alguien puede ayudar?

<script type="text/javascript"> 
//... 
    getAttr: function(ele, attr) { 
     if (typeof ele.attributes[attr] == 'undefined'){ 
     return ele.getAttribute(attr); 
     } else { 
     return ele.attributes[attr].nodeValue; 
     } 
    }, 
//... 
</script> 


<div> 
<a href="http://www.yo.com#foo">Link</a> 
</div> 

usando el html anteriormente, en cada navegador, cómo hacer yo getAttr (ELE, 'href')? (suponga que seleccionar el nodo ele no es un problema)

Respuesta

10

Con respecto a la actualización de su pregunta, usted podría intentar esto.

Puede ser exagerado, pero si getAttribute() y la notación de puntos no devuelven un resultado, recorre el objeto attributes para tratar de encontrar una coincidencia.

Ejemplo:http://jsfiddle.net/4ZwNs/

var funcs = { 
    getAttr: function(ele, attr) { 
     var result = (ele.getAttribute && ele.getAttribute(attr)) || null; 
     if(!result) { 
      var attrs = ele.attributes; 
      var length = attrs.length; 
      for(var i = 0; i < length; i++) 
       if(attrs[i].nodeName === attr) 
        result = attrs[i].nodeValue; 
     } 
     return result; 
    } 
}; 

var result = funcs.getAttr(el, 'hash'); 

Es hasta usted para hacer algunas pruebas de cross-browser, sin embargo. : O)


Usando ele.attributes, es necesario acceder a ellos mediante un índice, como en:

ele.attributes[0].nodeName; // "id" (for example) 
ele.attributes[0].nodeValue; // "my_id" (for example) 

tratando de pasar attributes un nombre de atributo aparece para devolver un valor cuyo typeof es object, por lo que su El código else se está ejecutando aunque ele.attributes[attr] no le proporciona el valor que desea.

+0

Actualicé la pregunta para ser un poco más específico. ¿Cómo puedo especificar que quiero el attr "href" o "hash" usando su método? – tester

+0

@tester - Lo actualizaré en un minuto. – user113716

+0

funciona muy bien en Chrome/FF, probando en IE8, obtengo: El objeto no admite esta propiedad o método en esta línea: var result = ele.getAttribute (attr) || ele [attr] || nulo; – tester

5

Está intentando acceder a las propiedades de ele antes de establecer si esas propiedades existen. Tratar este tipo de cadena de evidencia:

if (ele.attributes && ele.attributes[attr] && typeof ele.attributes[attr] == 'undefined') 

etc.

+0

supongo que eliminará mi error (y gracias), pero ¿cómo digo que utilicé mi método $ .getAttr ($ ancla, 'href'); ¿cómo obtengo el href de en IE6-8? – tester

+0

Lo siento, no estoy seguro de lo que estás preguntando. – Robusto

+0

Actualicé la parte inferior de la pregunta para especificar lo que estoy tratando de obtener (el href de un enlace seleccionado) – tester

16

Para la gran mayoría de los casos, puede simplemente usar la función incorporada en getAttribute.

p. Ej.

ele.getAttribute(attr) 

Según QuirksMode esto debería funcionar en todos los principales navegadores (IE> = 6 incluido), con una pequeña excepción:

En IE5-7, el acceso al atributo style da un objeto, y el acceso a la El atributo onclick proporciona una función anónima alrededor del contenido real.

Cuestiones relacionadas