6

我一直致力于在 BlackBerry OS5 设备(8530)上调试一些 jQuery。有很多问题,但我缩小的一个与 jQuery 的有关.each()

逻辑是这样的:

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

在任何普通浏览器中,我都会收到警报,单击“确定”,然后如果逻辑语句为真,则查看该特定项目(在本例中为 TD)获取更新的类。然后它会重复其余的项目,每个项目都会收到警报,我确定它,我看到特定 TD 的课程得到更新。

然而,在 BlackBery 8530 上,我收到了每个警报,但 TD 并未一一更新。相反,它们都在最后一个警报之后立即更新,仅基于最后一个 TD 的 if 逻辑。

奇怪的是这个特定的浏览器存在严重的 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');
    }
});

我正在遍历 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 并根据其索引专门从其中抓取其中一个元素。

因此,基于此,我的最后一个问题是:上述解决方案对“好”浏览器有什么缺点吗?是否有性能影响?

4

1 回答 1

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');
});
于 2011-08-02T02:07:36.580 回答