jquery each loop return false not end the function

允我心安 提交于 2019-12-01 04:58:33

Returning from one function doesn't magically make the one that called it end, much less use a specific return value.

If you want to do that, you have to set a variable that the outer function will use:

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
}

Side note: Your function will happily allow IP strings like "0.-234343.-1.0" and "1foo.2foo.3foo.4foo". You might consider:

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
}

That's a bit better, but it also doesn't check whether there are exactly four parts to the IP, and allows values like "1.1e2.3.4" (exponent notation). And all of this is, of course, specific to IPv4, whereas we're entering an IPv6 world...

Sticking with IPv4, though, if your goal is to ensure that it's a four-part IPv4 address in normal form, I'd plump for regex:

checkipAddress = function(value){
    var rv;
    var match = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,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;
}

Or on modern browsers (or using a decent Array#every shim):

checkipAddress = function(value){
    var match = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!