jQuery的each使用陷阱

时间:2023-03-09 06:31:34
jQuery的each使用陷阱

注意:jQuery使用each()函数进行循环时发现return false不能阻止程序继续向下执行

原因如下:

(1)开始还以为是jQuery的each()函数是异步执行的,所以导致出错,其实不是。

(2)后来发现是因为在jQuery的each()函数中return false相当于break, return true相当于continue; 而且在each()函数内部不能使用break和continue关键字,否则报错。

解决方法如下:

使用return false跳出循环前定义一个标志位变量,跳出循环后可以通过这个标志位变量判断是return false还是return true

注意:如果是两层each()循环或者多层each()循环,则层层定义标志位变量并向上传播冒泡即可

代码如下:

var validateResult = validateEachOutWeightAndOutPackageNumber();
        if (!validateResult){
            return false;
        }

//验证每行的出库重量不能为空,出库件数不能为空及不能为负数
    function validateEachOutWeightAndOutPackageNumber() {     //定义最外层循环的标志位变量
        var _outerInvalid = false;
        $("#order_detail_table_list .table_sales_detail").each(function() {       //定义内层循环的标志位变量
            var _innerInvalid = false;
            var relativeThis = $(this);
            $(".wms_in_sheet_tr", relativeThis).each(function(){
                var in_sheet_number = $("#wms_material_in_sheet_number", $(this)).text();
                var out_weight = $("input[name*='wms_out_weight']", $(this)).val();
                var out_package_number = $("input[name*='out_package_number']", $(this)).val();
                if(out_weight.toString() == ''){
                    alert('入库单号' + in_sheet_number + '的出库重量不能为空');            //使用标志位标量代替return false
                    _innerInvalid = true;            //使用return false代替break
                    return false;
                }else if(out_weight <= 0){
                    alert('入库单号' + in_sheet_number + '的出库重量不能为0和负数');
                    _innerInvalid = true;
                    return false;
                }else if(out_package_number.toString() == ''){
                    alert('入库单号' + in_sheet_number + '的出库件数不能为空');
                    _innerInvalid = true;
                    return false;
                }else if(out_package_number < 0){
                    alert('入库单号' + in_sheet_number + '的出库件数不能为负数');
                    _innerInvalid = true;
                    return false;
                }
            });       //向外层标志位变量传播
            if(_innerInvalid){
                _outerInvalid = true;
                return false
            }
        });     //最外层标志位变量判断是否应该return false还是return true
        if(_outerInvalid){
            return false
        }else{
            return true;
        }
    }