2011-08-01 9 views
6

He estado trabajando en la depuración de algunos jQuery en un dispositivo BlackBerry OS5 (el 8530). Hay una serie de problemas, pero que he reducido se relaciona con jQuery .each()jQuery .each() defectuoso en BB OS5?

La lógica es como tal:

$objectArray.each(function(){ 
    alert('test'); 
    if(...some logic...){ 
     $(this).addClass('testClass'); 
    }; 
}) 

En cualquier navegador normal, me da la alerta, haga clic en Aceptar y, a continuación, ver ese elemento en particular (en este caso, un TD) obtener una clase actualizada si la declaración lógica es verdadera. Luego se repite a través del resto de los elementos, cada uno recibe una alerta, yo lo apruebo y veo que la clase particular de TD se actualiza.

En el BlackBerry 8530, sin embargo, recibo cada alerta pero los TD no se actualizan uno por uno. En su lugar, todos se actualizan inmediatamente después de la última alerta basada en la lógica si del último TD solamente.

Las probabilidades son que hay problemas graves de JS con este navegador en particular, pero me pregunto si hay una forma de evitar esto. ¿Existen alternativas al uso de .each() en jQuery?

UPDATE:

un ejemplo de código más detallada:

$TRs.each(function(){ 
    var $TR = $(this); 
    var $checkBoxTD = $TR.find('td.td3'); 
    var $checkBox = $checkBoxTD.find('input'); 

    alert($checkBox.is(':checked')); 

    if ($checkBox.is(':checked')!=true){ 
     $checkBoxTD.addClass('notSelected'); 
    } 
}); 

estoy bucle a través de cada TR de una tabla. Dentro de cada TR hay un TD (.td3) que contiene una casilla de verificación. Necesito verificar cada uno. Si no está marcado, necesito agregar una clase al TD.

En buenos navegadores, la alerta mostrará un verdadero o falso y, en función de esa alerta en particular, verá que la clase se aplica apropiadamente a esa fila cuando descarta la alerta. Luego se repite para cada fila.

En el navegador BB OS5, cada alerta aparece con el valor adecuado, pero las clases no se actualizan hasta DESPUÉS de la última alerta/bucle, por lo que cada clase TD utiliza la lógica del último bucle solamente.

ACTUALIZACIÓN 2 (fijar?):

Gracias a Alex, he hecho un poco más jugar con esto y encontrar una manera de conseguir que esto funcione en el navegador terco.

$TRs.each(function(idx){ 
    var $TR = $(this); 
    var $checkBoxTD = $TR.find('td.td3'); 
    var $checkBox = $checkBoxTD.find('input'); 

    alert($checkBox.is(':checked')); 

    if ($checkBox.is(':checked')!=true){ 
     $TRs.eq(idx).find('td.td3').addClass('notSelected'); // <-- the 'fix' 
    } 
}); 

La diferencia es que voy a volver a los principales jQuery objeto $ TR y agarrando específicamente uno de los elementos de que en base a su índice.

Basándome en eso, mi última pregunta es: ¿La solución anterior tiene algún inconveniente para los 'buenos' navegadores? ¿Hay un golpe de rendimiento?

+0

es '$ objectArray' una matriz real, o un objeto jQuery ? – Alnitak

+0

Es un objeto jQuery. El contenido de un selector '$ ('td')' –

+0

Parece que podría estar apilando las 'alertas'. ¿Puedes depurar a un div en la página y ver si funciona? –

Respuesta

2

Prueba esto:

$objectArray.each(function(idx, element){ 
    alert('test'); 
    if(...some logic...){ 
     $(element).addClass('testClass'); 
    }; 
}) 

ACTUALIZACIÓN:

Prueba de esto, tal vez tiene menos gastos generales ...

var $checkBox = $TRs.find('td.td3 input:not(:checked)'); 
$checkBox.each(function(){ 
    $(this).parent().addClass('notSelected'); 
}); 
+0

¿qué representa 'idx' en ese ejemplo? –

+0

por desgracia, eso no funciona. Si reemplazo la alerta con 'alerta (... resultado de alguna lógica ...)' se devuelve el valor apropiado para cada fila en cada alerta, pero las clases no se actualizan hasta después de la última alerta, que luego actualiza TODAS las clases en función del valor del último bucle lógico. –

+0

ah ... Creo que veo el problema. En el ejemplo anterior, 'element' se pasa como un objeto DOM, en lugar de un objeto jQuery. ¿Es posible pasar el objeto jQuery en su lugar? –

Cuestiones relacionadas