2013-04-24 12 views
26

ho creato questa piccola interazione per una delle piattaforme di lavoro - http://jsfiddle.net/S79qp/426/Jquery - .forEach() non funziona in IE8

Funziona bene in tutti i browser tranne formano IE8. Quando eseguo la console sembra essere questa sezione che si sta avendo problemi con ...

Array.prototype.forEach.call(l, function(item) { 
     a.push(jQuery(item).text()); 
    }); 

Qualcuno mi può mostrare un IE8 alternativa amichevole in modo da poter rendere compatibile per le versioni richieste?

+1

perché non si usa jQuery invece del prototipo –

+2

@Sarfaraz: il 'prototipo' in questo caso non è la libreria, ma la parola chiave in Javascript. – Guffa

+1

@Sarfaraz Cosa c'è di sbagliato nell'usare il prototipo? – rickyduck

risposta

35

Utilizzare la jQuery.each method:

jQuery.each(l, function(index, item){ 
    a.push(jQuery(item).text()); 
}); 

Se matrice di destinazione è vuota dall'inizio, è possibile utilizzare il jQuery.map method per questo, invece:

var a = jQuery.map(l, function(item){ 
    return jQuery(item).text(); 
}); 
+0

Ora la console dice che non supporta index = a.indexOf (current) + 1; if (indice <0 || indice> = l.length) { indice = 0; @Guffa } –

+0

@ Milo-J: 'Array.indexOf' è un altro metodo recentemente aggiunto. Usa invece il metodo 'jQuery.inArray'. http://api.jquery.com/jQuery.inArray/ – Guffa

+0

Ho provato a farlo ma non funzionerà. potresti dare un'occhiata? http://jsfiddle.net/S79qp/428/ @Guffa –

2

Infatti il ​​metodo forEach è disponibile solo da IE9. Dovresti usare la versione jQuery "each()" per offrire supporto ai browser più vecchi.

41

Se invece si è forEach() in IE8:

if (typeof Array.prototype.forEach != 'function') { 
    Array.prototype.forEach = function(callback){ 
     for (var i = 0; i < this.length; i++){ 
     callback.apply(this, [this[i], i, this]); 
     } 
    }; 
} 

Questo si comporterà as expected in qualsiasi browser che non ce l'ha incorporato.

+3

L'ha votato come quando arriva a un progetto su larga scala, alcune volte è più facile e più sicuro aiutare a correggere il browser difettoso invece di provare a correggere il codice che non è effettivamente difettoso – Mayhem

+1

Questo è geniale! – Anant

+0

Sarebbe meglio usare polyfill al link fornito. Questo codice è stato perfezionato. –

2

forEach non è supportato in IE 8, invece si può utilizzare un ciclo regolare:

for (var i = 0; i < myArray.length; i++) { 
    // code 
} 
1

ho avuto lo stesso problema con IE8 ed ecco come ho risolto!

Prima di tutto si desidera eseguire il loop e ottenere dati dall'oggetto JSON array. Date un'occhiata di originale che sta lavorando bene in Firex, cromo e ultima IE ma non IE8

  data.children.forEach(function(item) { 
 
       //javascript: console.log(item); 
 
       console.log(data.children); 
 
       attachRel(item, '1' + (data.children.length > 1 ? 1 : 0)); 
 
      });

Ecco la soluzione che ho sviluppato dopo una lunga giornata di lotta

  $.each(data.children, function() { 
 

 
       attachRel(this, '1' + (data.children.length > 1 ? 1 : 0)); 
 
      });