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?
jest '$ objectArray' prawdziwa tablica lub obiekt jQuery ? – Alnitak
To obiekt jQuery. Zawartość '$ ('td')' selector –
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? –