Pracowałem nad debugowaniem jQuery na urządzeniu BlackBerry OS5 ( 8530). Jest wiele problemów, ale jeden, który zawęziłem, jest związany z jQuery .each ()
Logika jest taka:
$objectArray.each(function(){
alert('test');
if(...some logic...){
$(this).addClass('testClass');
};
})
W każdej normalnej przeglądarce pojawia się alert, kliknij OK i następnie zobacz, że konkretny element (w tym przypadku TD) otrzymuje zaktualizowaną klasę, jeśli instrukcja logiczna jest prawdziwa. Następnie powtarza się przez resztę pozycji, każdy otrzymuje alert, ja OK, a ja widzę, że ta konkretna klasa niszczyciela jest aktualizowana.
Jednak w BlackBery 8530 otrzymuję każdy alert, ale TD nie są aktualizowane jeden po drugim. Zamiast tego, wszystkie są aktualizowane od razu po ostatnim alercie w oparciu o logikę if ostatniego TD.
Istnieje prawdopodobieństwo, że są poważne problemy z JS w tej konkretnej przeglądarce, ale zastanawiam się, czy jest sposób, aby obejść to. Czy istnieją alternatywy dla używania .each ()
w jQuery?
AKTUALIZACJA:
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');
}
});
Przechodzę w pętli przez każdy TR tabeli. W każdym TR znajduje się TD (.td3), który zawiera pole wyboru. Muszę sprawdzić każdego. Jeśli nie jest zaznaczone, muszę dodać klasę do TD.
W dobrych przeglądarkach alert pokaże prawdę lub fałsz, a na podstawie tego konkretnego alertu zobaczysz, że klasa jest odpowiednio stosowana do tego wiersza po odrzuceniu ostrzeżenia. Następnie powtarza się dla każdego wiersza.
W przeglądarce BB OS5, każdy alert wyskakuje z odpowiednią wartością, ale klasy nie są aktualizowane aż do ostatniego alertu / pętli, więc każda klasa TD używa logiki tylko ostatnia pętla.
AKTUALIZACJA 2 (naprawić?):
Dzięki Alexowi trochę więcej bawiłem się tym i znalazłem sposób, aby to działało w upartej 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łównego obiektu $ TR jQuery i konkretnie pobierając z niego jeden z elementów na podstawie jego indeksu.
Na tej podstawie moje ostatnie pytanie brzmi: czy powyższe rozwiązanie ma jakieś wady dla „dobrych” przeglądarek? Czy jest hit wydajnościowy?