2015-05-06 12 views
6

Ich habe eine Funktion, die einen Punkt getrennten String und parse es Array zu bekommen. Und ich möchte diese Array-Elemente Schleife und überprüfen Sie einen Wert ist größer als 255 und Rückgabe false, wenn nicht weiter zu Funktionsanweisungen und Rückgabe True als Ende der Funktion. Aber es stoppt nie die Schleife .. und immer wieder wahr.JQuery jede Schleife zurück false nicht beenden Sie die Funktion

Hier Code:

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; 
    } 
+3

Wenn Sie 'zurückkehren sagen false;' im '$ .each' Anweisung, Sie kommen nur von dieser Funktion zurück und nicht 'checkipAddress'. – jrad

+0

@jrad Ich habe den Punkt jetzt :) danke –

Antwort

10

von einer Funktion zurückkehrend nicht auf magische Weise das machen, dass es Ende genannt wird, viel weniger einen bestimmten Rückgabewert verwenden.

Wenn Sie das tun wollen, haben Sie eine Variable setzen, dass die äußere Funktion verwenden:

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 
} 

Randbemerkung: Ihre Funktion wird gerne IP Strings wie "0.-234343.-1.0" und "1foo.2foo.3foo.4foo" ermöglichen. Sie sollten erwägen:

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 
} 

Das ist ein bisschen besser, aber es ist auch prüfen nicht, ob es genau vier Teile der IP und ermöglicht Werte wie "1.1e2.3.4" (Exponenten-Darstellung). Und all dies ist natürlich spezifisch für IPv4, während wir in eine IPv6-Welt eintreten ...

Bleibt bei IPv4, wenn es Ihr Ziel ist sicherzustellen, dass es sich um eine vierteilige IPv4-Adresse handelt Form, würde ich für regex plump:

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; 
} 

oder auf modernen Browsern (oder ein anständiges Array#every Shim verwenden):

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; 
} 
+1

Warum würden Sie 'Return' in den Rückruf von jedem verwenden? Es macht keinen Sinn ... – devnull69

+6

@ devnull69: Es stoppt die '$ .Each'-Schleife. –

+2

@ T.J.Crowder Ich habe das versucht und funktioniert gut .. Danke. –

Verwandte Themen