jquery每个循环都返回false而不是结束函数

Posted

技术标签:

【中文标题】jquery每个循环都返回false而不是结束函数【英文标题】:jquery each loop return false not end the function 【发布时间】:2015-07-16 13:27:53 【问题描述】:

我有一个函数,它获取一个点分隔的字符串并将其解析为数组。 我想循环这些数组元素并检查一个值是否大于 255 并返回 false,如果不是继续函数语句并返回 true 作为函数结束。但它永远不会停止循环......并且总是返回 true。

代码如下:

checkipAddress = function(value)//instance value: 999.999.999.999 result:true
        debugger
        var array = value.split('.');
        $.each(array, function(index,val)
            debugger
            if(parseInt(val)>255)
                return false; // it should end the loop and exit function with return false.
        );
        return true;
    

【问题讨论】:

当你在$.each 语句中说return false; 时,你只是从那个函数返回而不是checkipAddress @jrad 我现在明白了 :) 谢谢 【参考方案1】:

从一个函数返回并不会神奇地使调用它的函数结束,更不用说使用特定的返回值了。

如果你想这样做,你必须设置一个外部函数将使用的变量:

checkipAddress = function(value)
    var rv = true; // <=== Default return value
    var array = value.split('.');
    $.each(array, function(index,val)
        if(parseInt(val)>255)
            return rv = false; // <=== Assigns false to `rv` and returns it
    );
    return rv; // <=== Use rv here


旁注:您的函数将很高兴地允许 IP 字符串,如 "0.-234343.-1.0""1foo.2foo.3foo.4foo"。您可以考虑:

checkipAddress = function(value)
    var rv = true; // <=== Default return value
    var array = value.split('.');
    $.each(array, function(index,str)
        str = $.trim(str);
        var val = +str;
        if(!str || val < 0 || val > 255)
            return rv = false; // <=== Assigns false to `rv` and returns it
    );
    return rv; // <=== Use rv here

这有点好,但它也不会检查 IP 是否正好有四个部分,并允许像 "1.1e2.3.4" (指数表示法)这样的值。当然,所有这些都是 IPv4 特有的,而我们正在进入 IPv6 世界……

不过,如果您的目标是确保它是正常形式的四部分 IPv4 地址,那么坚持使用 IPv4,我会为正则表达式感到满意:

checkipAddress = function(value)
    var rv;
    var match = /^(\d1,3)\.(\d1,3)\.(\d1,3)\.(\d1,3)$/.exec(value);
    var n, part;
    if (match) 
        rv = true;
        for (n = 1; rv && n < 5; ++n) 
            part = +match[n]; // We know it's not blank from the regex
            if (part > 255)  // We know it's not negative or fractional from the regex
                rv = false;
            
        
     else 
        rv = false;
    
    return rv;

或在现代浏览器上(或使用像样的Array#every shim):

checkipAddress = function(value)
    var match = /^(\d1,3)\.(\d1,3)\.(\d1,3)\.(\d1,3)$/.exec(value);
    rv = !match ? false : Array.prototype.slice.call(match, 1).every(function(entry) 
        // We know it's not blank, negative, or fractional from the regex
        return +entry <= 255;
    );
    return rv;

【讨论】:

为什么要在每个回调中使用return?这没有意义...... @devnull69:它会停止$.each 循环。 @T.J.Crowder 我试过了,效果很好。谢谢。

以上是关于jquery每个循环都返回false而不是结束函数的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Ajax每个函数检查返回ID是不是与上一个相同

jQuery框架结构简析

jQuery循环之each()

jquery中.map与each的区别?

具有嵌套 forEach 和 for 循环的函数不会返回 false

如何让 jQuery 执行同步而不是异步的 Ajax 请求?