2012-09-11 15 views
5

¿Por qué funciona lo siguiente correctamente en Firefox pero NO en Chrome? Si cambio el valor de retorno en el .each loop a 'verdadero', funciona en Chrome y no en Firefox. ¿Lo que da?

(Cuando no funciona, sólo se devuelve en segundos versus el día correcto, hora, etc.)

function time_remaining(expire_time) 
    { 
     var now = new Date().getTime()/1000, 
     time_left = expire_time - now, 
     time_left_str = '0 seconds'; 

     if (time_left < 1) { 
      return time_left_str; 
     } 

     var a = {}; 
      a[ 12 * 30 * 24 * 60 * 60 ] = 'year', 
      a[  30 * 24 * 60 * 60 ] = 'month', 
      a[   24 * 60 * 60 ] = 'day', 
      a[    60 * 60 ] = 'hour', 
      a[      60 ] = 'minute', 
      a[      1 ] = 'second'; 


     $.each(a, function (secs, str) { 
      var d = time_left/secs; 
      if (d >= 1) { 
       var r = Math.round(d); 
       time_left_str = r + ' ' + str + ((r > 1) ? 's' : ''); 
       return false; 
      } 
     }); 

     return time_left_str; 
    } 
+1

De acuerdo con los documentos 'Podemos romper el bucle $ .each() en una iteración particular haciendo que la función de devolución de llamada devuelva falso. La devolución de no falso es lo mismo que una instrucción continuar en un ciclo for; saltará de inmediato a la siguiente iteración. – MrOBrian

+0

Intente utilizar return (fasle) como devolución de llamada a su función. Esto debería resolver su problema, ya que actuará como un descanso; –

+0

He intentado tanto 'return false' como 'return (false)'. Esto SI FUNCIONA correctamente en Firefox. Sin embargo, NO funciona correctamente en Chrome. Chrome solo funciona correctamente cuando uso 'return true' ... ¿no estoy seguro? –

Respuesta

3

No es $.each problema, var a = {}; es un objeto y $.each(a, function (secs, str) {}) conseguir de alguna manera falló porque jQuery cada función acepta solo una matriz.

necesita convertir object en array y luego usa la función $.each.

Agregado nuevo código en el cuerpo de la función para hacer object a array

// converting object to array 
var temp = []; 
var finalArr = []; 
for (val in a) { 
    temp.push(val); 
} 

temp = temp.sort(function (a, b) { 
    return a - b 
}); 
for (var i = 0; i < temp.length; i++) { 
    finalArr.push(a[temp[i]] + "|" + temp[i]); 
} 

y también modificó la forma de acceder a los datos y valor del índice de la nueva matriz creada

function time_remaining(expire_time) { 
    var now = new Date().getTime()/1000, 
     time_left = expire_time - now, 
     time_left_str = '0 seconds'; 

    if (time_left < 1) { 
     return time_left_str; 
    } 

    var a = {}; 
    a[12 * 30 * 24 * 60 * 60] = 'year', 
    a[30 * 24 * 60 * 60] = 'month', 
    a[24 * 60 * 60] = 'day', 
    a[60 * 60] = 'hour', 
    a[60] = 'minute', 
    a[1] = 'second'; 


    // converting object to array 
    var temp = []; 
    var finalArr = []; 
    for (val in a) { 
     temp.push(val); 
    } 

    temp = temp.sort(function (a, b) { 
     return a - b 
    }); 
    for (var i = 0; i < temp.length; i++) { 
     finalArr.push(a[temp[i]] + "|" + temp[i]); 
    } 

    $.each(finalArr, function (secs, str) { 
     var time = time_left/parseInt(str.split("|")[1], 10); 

     if (time >= 1) { 

      var randomNum = Math.round(time); 
      time_left_str = randomNum + ' ' + str.split("|")[0] + ((randomNum > 1) ? 's' : ''); 
      return true; 
     } 
    }); 

    return time_left_str; 

} 
+1

Esto funciona. Es extraño cómo Chrome y FF lo manejan de manera diferente. Gracias KK. –