无法在每个循环中突破jquery

时间:2014-01-17 06:04:50

标签: jquery return iteration each

我有一个用jquery编写的嵌套循环,并在我的子循环中返回false,并将相同的文本追加到父行。我的代码,

$('#listingProducts ul.msRows li.msFullfillment').each(function(index) {                    
    if(typeof $('#hfOrd'+index).val() != 'undefined'){
        var $this = $(this);
        var orderId = $('#hfOrd'+index).val();                      
        // repainting logic
        $('body').append(data);
        $('#ajaxProducts ul.displayPoints li').each(function(index){
            var $child = $(this);
            if(typeof $('#hfAjaxOrderId'+index).val() != 'undefined'){
                var ajaxOrderId = $('#hfAjaxOrderId'+index).val();
                //alert(orderId+' '+ ' '+ajaxOrderId);
                if(ajaxOrderId === orderId){
                    // replace the div here..
                    var anchorText = $child.find("#pointsLineAjax .redeem").text();     
                    $this.find("#pointsLine .redeem").text(anchorText);
                    return false;
                }
            }
        });

    }
});

在子循环内返回false不会返回到父级。这似乎并没有把它写到相应的行。我在这里缺少什么..

1 个答案:

答案 0 :(得分:1)

返回false只会突破jQuery循环中的内循环,对in this answer的原因有一个很好的解释。

  

这里的问题是,虽然你可以从内部返回false   .each回调,.each函数本身返回jQuery对象。   因此,您必须在两个级别返回false以停止迭代   循环。此外,由于无法知道内部.each是否找到了   是否匹配,我们必须使用闭包来使用共享变量   得到更新。

尝试以下方法:

$('#listingProducts ul.msRows li.msFullfillment').each(function(index) {                    
    var continueLoop = true;
    if($('#hfOrd'+index).length){
        var $this = $(this);
        var orderId = $('#hfOrd'+index).val();                      
        // repainting logic
        $('body').append(data);
        $('#ajaxProducts ul.displayPoints li').each(function(index){
            var $child = $(this);
            if($('#hfAjaxOrderId'+index).length){
                var ajaxOrderId = $('#hfAjaxOrderId'+index).val();
                //alert(orderId+' '+ ' '+ajaxOrderId);
                if(ajaxOrderId === orderId){
                    // replace the div here..
                    var anchorText = $child.find("#pointsLineAjax .redeem").text();     
                    $this.find("#pointsLine .redeem").text(anchorText);
                    continueLoop = false;
                    return false;
                }
            }
        });
    };
    return continueLoop;
});