2011-08-01 12 views
6

Pracuję nad debugowaniem niektórych jQuery na urządzeniu BlackBerry OS5 (8530). Istnieje wiele problemów, ale taki, który mam zawężony jest związane z jQuery .each()jQuery .each() wadliwy w systemie BB OS5?

logika jest taka:

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

W każdym normalnym przeglądarce pojawia się alert, kliknij przycisk OK, a następnie zobacz, że dany element (w tym przypadku TD) uzyska zaktualizowaną klasę, jeśli wyrażenie logiczne jest prawdziwe. Następnie powtarza się przez resztę przedmiotów, każdy dostaje alert, ja go sprawdzam i widzę, że ta konkretna klasa TD jest aktualizowana.

Jednak na BlackBery 8530 dostaję każde powiadomienie, ale TDs nie są aktualizowane jeden po drugim. Zamiast tego wszystkie są aktualizowane od razu po ostatnim ostrzeżeniu w oparciu o logikę if ostatniego tylko TD.

Szanse na poważne problemy z JS związane z tą przeglądarką, ale zastanawiam się, czy istnieje sposób na obejście tego problemu. Czy istnieją alternatywy dla używania .each() w jQuery?

UPDATE:

Bardziej szczegółowy przykład kodu:

$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'); 
    } 
}); 

mam zapętlenie poprzez każdego TR tabeli. Wewnątrz każdego TR jest TD (.td3), który zawiera pole wyboru. Muszę sprawdzić każdy. Jeśli nie jest zaznaczone, muszę dodać klasę do TD.

W dobrych przeglądarkach, alert wyświetli wartość true lub false, a na podstawie tego konkretnego alertu zobaczysz, że klasa jest odpowiednio stosowana do tego wiersza, gdy odrzucasz alert. Następnie powtarza się dla każdego rzędu.

W przeglądarce BB OS5 każde powiadomienie pojawia się z odpowiednią wartością, ale klasy nie są aktualizowane aż do ostatniego ostrzeżenia/pętli, więc każda klasa TD używała logiki tylko ostatniej pętli.

UPDATE 2 (fix):

Dzięki Alex, zrobiłem trochę więcej gry z tym i znaleźć sposób, aby to działało na upartego przeglądarce.

$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' 
    } 
}); 

Różnica polega na tym, że wracam do głównych jQuery obiekt $ TR a konkretnie chwytając jeden z elementów z nim opartych na indeksie.

Na tej podstawie, moje ostatnie pytanie brzmi: czy powyższe rozwiązanie ma jakieś wady dla "dobrych" przeglądarek? Czy istnieje uderzenie wydajności?

+0

jest '$ objectArray' prawdziwa tablica lub obiekt jQuery ? – Alnitak

+0

To obiekt jQuery. Zawartość '$ ('td')' selector –

+0

Wygląda na to, że może układać w stos 'alert's. Czy możesz zamiast tego debugować element div na stronie i sprawdzić, czy to działa? –

Odpowiedz

2

Spróbuj tego:

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

UPDATE:

Spróbuj tego, może to ma mniejszy narzut ...

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

co oznacza "idx" w tym przykładzie? –

+0

Niestety, to nie działa. Jeśli zamieniam alert na 'alert (... wynik pewnej logiki ...)' zwracana jest właściwa wartość dla każdego wiersza w każdym alarmie, ale klasy nie są aktualizowane aż do ostatniego ostrzeżenia, które następnie aktualizuje WSZYSTKIE klasy na podstawie wartości ostatniej pętli logicznej. –

+0

ah ... Myślę, że widzę problem. W powyższym przykładzie 'element' jest przekazywany jako obiekt DOM, a nie obiekt jQuery. Czy można zamiast tego przekazać obiekt jQuery? –

Powiązane problemy