我一直在调试BlackBerry OS5设备上的一些jQuery(8530)。有很多问题,但我已经缩小的问题与jQuery的.each()
逻辑是这样的:
$objectArray.each(function(){
alert('test');
if(...some logic...){
$(this).addClass('testClass');
};
})
在任何普通的浏览器中,我都会收到警报,单击“确定”,然后在逻辑语句为真时查看特定项(在本例中为TD)获取更新的类。然后通过剩下的项目重复,每个项目都会收到警报,我确定它,然后我看到特定的TD课程会更新。
然而,在黑莓8530上,我收到了每个警报但TD没有逐个更新。相反,它们都会在最后一次警报后立即根据最后一次TD的if逻辑进行更新。
很可能这个特定的浏览器存在严重的JS问题,但我想知道是否有办法解决这个问题。是否有在jQuery中使用.each()
的替代方法?
更新:
更详细的代码示例:
$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');
}
});
我循环遍历TABLE的每个TR。在每个TR内是一个包含复选框的TD(.td3)。我需要检查每一个。如果没有选中,我需要在TD上添加一个类。
在良好的浏览器中,警报将显示真或假,并且根据该特定警报,您将在解除警报时看到正确应用于该行的类。然后它会重复每一行。
在BB OS5的浏览器中,每个警报都弹出正确的值,但是在最后一个警报/循环之后才会更新类,因此每个TD类只使用最后一个循环的逻辑。
更新2(修复?):
感谢Alex,我做了一些更多的玩法,并找到了一种方法让它在顽固的浏览器中运行。
$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对象$ TRs,并根据其索引特别从中获取其中一个元素。
基于此,我的最后一个问题是:上述解决方案是否对“好”浏览器有任何缺点?是否有性能受损?
答案 0 :(得分:2)
试试这个:
$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');
});