2009-01-05 11 views
29

tengo este código:para cada JavaScript ¿Soporte en IE?

<script> 
function toggle(source) { 

    checkboxes = document.getElementsByName('DG1'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 

    checkboxes = document.getElementsByName('DG2'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 

    checkboxes = document.getElementsByName('DG3'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 

    checkboxes = document.getElementsByName('DG4'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 

    checkboxes = document.getElementsByName('DG5'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 
} 
</script> 

<input type="checkbox" onClick="toggle(this)" />Select All<br/> 

<form method=POST action="DGUsageServlet"> 
    <input type="checkbox" name="DG1">DG1</input> 
    <input type="checkbox" name="DG2">DG2</input> 
    <input type="checkbox" name="DG3">DG3</input> 
    <input type="checkbox" name="DG4">DG4</input> 
    <input type="checkbox" name="DG5">DG5</input> 
</form> 

¿Cómo puedo hacer que el script de arriba para trabajar en IE?

+0

La sangría del código de 4 espacios le dará formato de código. –

Respuesta

38

Internet Explorer no admite "para cada" bucles. Tendrá que cambiar el código para el uso regular de bucles:

function toggle(source) { 
    var checkboxes = document.getElementsByName('DG1'); 
    for (var i = 0; i < checkboxes.length; i++) { 
     checkboxes[i].checked = source.checked; 
    } 
    ... 
} 

O bien, puede utilizar una biblioteca como jQuery y hacerlo de esta manera:

function toggle(source) { 
    $("input[name^=DG]").attr("checked", source.checked); 
} 

Editar: Además, el camino usted está usando "para cada uno" puede que no siempre haga lo que quiere incluso en Firefox. Al igual que "para (clave en el objeto)" bucles, "para cada uno" itera sobre todas las propiedades del objeto incluyendo las propiedades de su prototipo. Realmente está hecho para iterar sobre las propiedades del objeto, no las matrices.

En JavaScript 1.7 puede crear un iterador que funciona correctamente con arreglos como:

for each (let [i, checkbox] in Iterator(checkboxes)) { 
     checkbox.checked = source.checked; 
    } 

Por supuesto, esto sólo funciona en Firefox 2.0+.

+1

Sí. Una viruela en la cabeza de múltiples implementaciones de javascript. –

+3

Anteriormente solo era necesario ser * fuente * compatible en múltiples arquitecturas. Ahora tiene que ser compatible "binario" en varias arquitecturas de navegador, además de una pila de ladrillos sueltos dispersos con un tejón muerto atrapado debajo, gritando por piedad. –

+0

-1 '[1,2,3] .length' puede ser 4 debido a toString en IE8. Es mejor que uses hasOwnProperty. –

2

Para completar la respuesta de Mateo Crumley, también puede tener un problema con el fracaso getElementByName() en IE, ha explicado here:

El poco utilizado getElementsByName() método es parte de la especificación DOM nivel 1 y es apoyado por ambos, Internet Explorer y Mozilla/Firefox. getElementsByName()

De acuerdo con la especificación HTML 4.01, los únicos elementos que admiten los atributos NAME son BUTTON, TEXTAREA, APPLET, SELECT, FORM, FRAME, IFRAME, IMG, A, INPUT, OBJECT, MAP, PARAM and META. Entonces, para colocar un NAME dentro de un DIV, el HTML es realmente inválido.

(por lo que funciona en su caso (NAME de un campo INPUT), pero no es seguro de usar en IE)

Moz/Firefox no tiene un problema con esto y Felizmente devolverá los tres elementos DIV. Pero MSIE lo trata el atributo no válido NAME como expando attribute y excluye aquellos elementos

Una posible solución se da con this script.


Nota: cuando se está codificando un for, alwatys añadir a continuación que encierra entre paréntesis para rizar { and }: es más seguro. Si agrega una segunda línea de código en su ciclo, se tendrá en cuenta en el bloque for.

0

Lo limpiaría un poco.

function select(){ 
    var butt = document.getElementById('selectall'); 
    butt.onclick = selectall; 

    function selectall(){ 
     for(var i=1;i<6;i++){ 
      var id='DG'+i; 
      var all = document.getElementById(id); 
      all.setAttribute('checked','checked'); 
     } 
    } 
} 

pero funciona sólo para getElemenById() (y no getElementsByName(), lo que no entiendo).Sólo tiene que añadir a cada ID de entrada = 'selectall', id = 'DG1' ...

3

Es posible utilizar una forma modificada de cada uno en Internet Explorer, la sintaxis es la siguiente.

var checkboxes = document.getElementsByName('DG2'); 
for (var i in checkboxes) 
    checkboxes[i].checked = 'true'; 
+1

'i' puede ser' toString' en ie8 también. –

+0

Esto funciona para teclas no numéricas :) – marcovtwout

4

nativa IE8 está actualizado para foreach, pero, ¿cómo utilizo jQuery, que optó por jQuery.each a superar este problema.

Mi copiar y pegar del jQuery API Doc:

var obj = { 
   "flammable", "inflammable" 
   "duh": "no duh" 
}; 
$. each (obj, function (key, value) { 
   alert (key + ":" + value); 
}); 

http://api.jquery.com/jQuery.each/

5

Creo jQuery.each es la mejor solución para ello

var idArr = ["LocationFirst","LocationSecond","LocationThird","LocationFourth","LocationFifth"]; 

$.each(idArr,function(index, entry) { 
    //some code 
}); 

itera sobre todos los elementos en la matriz "idArr" y pueden hacer algo con cada elemento.

3

tuve un problema con el IE forEach 11

y he encontrado una solución solución como esa

Array.prototype.slice.call(document.getElementsByName('element_name')).forEach(function (el) { 
    if (el.checked) { 
     console.log('checked'); 
    } 

Se está trabajando bien para mí.

+2

esa es la mejor solución, imho. forma abreviada: '[] .slice.call (...) .forEach (...)' –