jQuery .each() неисправен в BB OS5?
Я работал над отладкой некоторых jQuery на устройстве BlackBerry OS5 (8530). Есть ряд проблем, но одна из них, которую я сузил, связана с jQuery .each()
Логика такова:
$objectArray.each(function(){
alert('test');
if(...some logic...){
$(this).addClass('testClass');
};
})
В любом обычном браузере я получаю предупреждение, нажимаю OK, и затем вижу, что конкретный элемент (в данном случае TD) получает обновленный класс, если логическое утверждение истинно. Затем он повторяется по всем остальным пунктам, каждый получает предупреждение, я его окей, и я вижу, как обновляется класс этой конкретной TD.
На BlackBery 8530, однако, я получаю каждое предупреждение, но TD не обновляются по одному. Вместо этого все они обновляются сразу после последнего предупреждения, основываясь на логике if только последнего TD.
Скорее всего, есть серьезные проблемы с JS с этим конкретным браузером, но мне интересно, есть ли способ обойти это. Есть ли альтернативы использованию .each()
в jQuery?
ОБНОВИТЬ:
Более подробный пример кода:
$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');
}
});
Я перебираю все TR ТАБЛИЦЫ. Внутри каждого TR есть TD (.td3), который содержит флажок. Мне нужно проверить каждый. Если это не проверено, мне нужно добавить класс в TD.
В хороших браузерах предупреждение будет отображаться как истинное или ложное, и, основываясь на этом конкретном предупреждении, вы увидите, что класс соответствующим образом применяется к этой строке при отклонении предупреждения. Затем он повторяется для каждого ряда.
В браузере BB OS5 каждое предупреждение выскакивает с соответствующим значением, но классы не обновляются до ПОСЛЕ самого последнего предупреждения / цикла, поэтому каждый класс TD использовал логику только последнего цикла.
ОБНОВЛЕНИЕ 2 (исправить?):
Благодаря Алексу, я немного поиграл с этим и нашел способ заставить это работать в упрямом браузере.
$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'
}
});
Разница в том, что я возвращаюсь к основному объекту jQuery $TR и специально извлекаю из него один из элементов на основе его индекса.
Исходя из этого, мой последний вопрос: есть ли у вышеупомянутого решения недостатки для "хороших" браузеров? Хит производительности?
1 ответ
Попробуй это:
$objectArray.each(function(idx, element){
alert('test');
if(...some logic...){
$(element).addClass('testClass');
};
})
ОБНОВИТЬ:
Попробуйте это, может быть, у него меньше накладных расходов...
var $checkBox = $TRs.find('td.td3 input:not(:checked)');
$checkBox.each(function(){
$(this).parent().addClass('notSelected');
});