2012-03-05 33 views
45

Sé que "getElementsByClassName" no es compatible con IE8. ¿Sabes qué puedo usar en su lugar? Me estoy molestando por el errorgetElementsByClassName & IE8: El objeto no admite esta propiedad o el método

"El objeto no admite esta propiedad o método".

El código HTML es:

function sumar() { 
var elems = document.getElementsByClassName('verdana14 toAdd'); 
var myLength = elems.length; 
total = 0; 
for (var i = 0; i < myLength; ++i) { 
    if (elems[i].value!="") { 
     total += parseInt(elems[i].value,10); 
     } 
    } 

var promedio = total/myLength; 
parseFloat(document.getElementById('promediocal').value = promedio.toFixed(2)); 
} 

Este texto de entrada que se llama a la función javascript:

<input name='AE_EA_1_BIV_003_2' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_2' style='width:50px' onChange='sumar()'/> 
<input name='AE_EA_1_BIV_003_3' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_3' style='width:50px' onChange='sumar()'/> 
<input name='AE_EA_1_BIV_003_4' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_4' style='width:50px' onChange='sumar()'/> 
+0

jQuery tiene una gran aplicación selector CSS (que incluye las búsquedas de nombres de clase): http://jquery.com/ –

+2

Me encanta jQuery también, y por algo corriendo IE8 es casi seguro que no sería prohibitivo sobrecarga, pero para vainilla pura javascript querySelectorAll() es la mejor respuesta, siempre y cuando los espacios de nombres no estén en la imagen. – Swanny

Respuesta

0

uso de jQuery, o filtrar los resultados de getElementsByTag

7

Usted podría escribe lo tuyo. Algo como:

function GEBCN(cn){ 
    if(document.getElementsByClassName) // Returns NodeList here 
     return document.getElementsByClassName(cn); 

    cn = cn.replace(/ *$/, ''); 

    if(document.querySelectorAll) // Returns NodeList here 
     return document.querySelectorAll((' ' + cn).replace(/ +/g, '.')); 

    cn = cn.replace(/^ */, ''); 

    var classes = cn.split(/ +/), clength = classes.length; 
    var els = document.getElementsByTagName('*'), elength = els.length; 
    var results = []; 
    var i, j, match; 

    for(i = 0; i < elength; i++){ 
     match = true; 
     for(j = clength; j--;) 
      if(!RegExp(' ' + classes[j] + ' ').test(' ' + els[i].className + ' ')) 
       match = false; 
     if(match) 
      results.push(els[i]); 
    } 

    // Returns Array here 
    return results; 
} 

Funcionará bastante bien, pero podría escribir uno más rápido si lo desea. A continuación, sólo se puede cambiar:

document.getElementsByClassName('verdana14 toAdd'); 

Para:

GEBCN('verdana14 toAdd'); 
+0

Debe cambiar 'cn.replace ('', '.')' Porque solo reemplazará el primer espacio. Necesitará una expresión gráfica 'g'lobal que también considere que los espacios adyacentes son uno. Lo mismo con su 'cn.split (/ /)', debe ser global y probar espacios adyacentes, y debe incluir otros caracteres espaciales, como pestañas, por lo que '\ s' es probablemente mejor. –

+0

@amnotiam Gracias, sí, me confundí con PHP y olvidé cuál reemplaza todo sin el modificador g. Cambié deliberadamente de '\ s' a' 'porque no creo que se llame a la función con pestañas o nuevas líneas. Lo modifiqué para recortar los espacios finales también. – Paulpro

+0

Sí, probablemente sea una apuesta segura sobre las pestañas/nuevas líneas. –

59

Uso document.querySelectorAll('.verdana14.toAdd').

Actualización: FWIW, He escrito un relacionado blog post.

+1

Esto ofrecería la solución más simple, pero debería tener 'querySelectorAll' para obtener múltiples elementos. –

+1

Gracias, he corregido mi error tipográfico reemplazando qs con qsA. –

+0

Descargué jQuery y usé document.querySelectorAll ('. Verdana14.toAdd'); –

-3

puede probar u canta jquery ya que tiene un selector de clase alternativo para obtener los elementos por sus nombres de clase. $ (". Testclass"). Cada ...le dará los elementos necesarios por nombres de clase

0

Escribí esta pequeña biblioteca (menos de 1kb) que usa métodos nativos para recuperar elementos dom. Si revisa el método className, encontrará la respuesta a su pregunta.

Find JS on Github

+4

Su enlace está roto. Sé que esta es una respuesta anterior, pero por favor incluya la solución en la respuesta. – psaxton

Cuestiones relacionadas