Hej
Chcę sprawdzić poprawność adresu IP.
Chcę wykorzystać do tego metodę charAt, ale jak wiadomo IP może się zawierać w 1 do 3 znaków na każde pole,
czy to jest poprawnie napisane do ustawienia zmiennej, bo wydaje mi się, że nie. A jeśli nie to jak powinno to wyglądać
var delimiter = input.charAt(1) || input.charAt(2) || input.charAt(3);
http://php.net/manual/en/function.filter-var.php
http://php.net/manual/en/filter.filters.validate.php
Oj.
https://www.w3resource.com/javascript/form/ip-address-validation.php
Zrobiłem Tak
if ( $("#dvr_wan_ip_adress").parents("#dvr_register_form").length == 1 ) { if ( $('#dvr_wan_ip_adress').val().length == 0 ) { setTimeout(function() { $('#message').addClass('error');}, 500); setTimeout(function() { $('#message').attr( 'style', 'color: rgba(220,20,60,1)' );}, 500); $( '#message' ).html("Należy Podać Adres IP WAN Rejestratora !!!"); $( '#dvr_wan_ip_adress' ).prop('required', true).addClass( 'error' ).attr( 'onmouseover', 'return Remove_Required()' ); ValidatorID = $( '#dvr_wan_ip_adress' ); return false; } if ( $('#dvr_wan_ip_adress').val().length != 0 ) { var validChars = "0123456789"; var input = $( '#dvr_wan_ip_adress' ).val(); var ip_address = input.length >= 7 && input.length <= 16; if(ip_address) { var dot_count = 0; for ( var i=0; i < input.length; i++ ) { if (input[i]=='.') { dot_count++; } } if (dot_count === 3) { var delimiter_1 = input.indexOf( ".", 0 ); var delimiter_2 = input.indexOf( ".", delimiter_1 + 1); var delimiter_3 = input.indexOf( ".", delimiter_2 + 1); var delimiter_4 = input.length; var section_1 = delimiter_1; var section_1_length = section_1 >= 1 && section_1 <= 3; if (section_1 >= 1 && section_1 <= 3) { var section_2 = delimiter_2 - delimiter_1 - 1; if (section_2 >= 1 && section_2 <= 3) { var section_3 = delimiter_3 - delimiter_2 - 1; if (section_3 >= 1 && section_3 <= 3) { var section_4 = delimiter_4 - delimiter_3 - 1; if (section_4 >= 1 && section_4 <= 3) { var pairs = input.http://www.php.net/split("."); for ( var i=0, psl = pairs.length, pair, j; i < psl; i++ ) { pair = pairs[i]; for ( j = 0; j < pair.length; j++) { if ( validChars.indexOf( pair.charAt(j) ) === -1 ) { return false; } } if ( pair > 255) { info() ; return false; } } } } else { info() ; return false; } } else { info() ; return false; } } else { info() ; return false; } } else { info() ; return false; } } else { info() ; return false; } } }; function info() { setTimeout(function() { $('#message').addClass('error');}, 500); setTimeout(function() { $('#message').attr( 'style', 'color: rgba(220,20,60,1)' );}, 500); $( '#message' ).html("Adres IP ma Niepopraewną Wartość !!!"); $( '#dvr_wan_ip_adress' ).prop('required', true).addClass( 'error' ).attr( 'onmouseover', 'return Remove_Required()' ); ValidatorID = $( '#dvr_wan_ip_adress' ); return false; };
Cieszę się, bo siedziałem nad tym pół nocy. Tamte linki co mi podałeś trochę mnie nakierowaly, ale musiałem sam coś naskrobać bo nie do końca spełniały moje oczekiwania.
Przyszła mi ochota na kuchnię włoską.
Oj tak, szczególnie tego długiego cienkiego
A mówiąc poważnie, Twój kod to koszmar. Zupełnie nieczytelny i bez sensu rozlazły. Dlaczego nie ułatwisz sobie życia i nie użyjesz wyrażenia regularnego? Całą sprawę ze sprawdzaniem IP mógłbyś załatwić jedną linijką, choć lepiej moim zdaniem sprawdzić wyrażeniem regularnym ogólną strukturę: ^\d{1,3}(?:\.\d{1,3}){3}$ i potem posprawdzać elegancko czy te liczby nie przekraczają 255.
Jest jeszcze ipv6
if ( $("#dvr_wan_ip_adress").parents("#dvr_register_form").length == 1 ) { if ( $('#dvr_wan_ip_adress').val().length == 0 ) { ValidatorID = $( '#dvr_wan_ip_adress' ); Info_Message = "Należy Podać Adres IP WAN Rejestratora !!!"; Error_Message(); return false; }; if ( $('#dvr_wan_ip_adress').val().length != 0 ) { var validChars = "0123456789"; var input = $( '#dvr_wan_ip_adress' ).val(); var ip_address = input.length >= 7 && input.length <= 16; ValidatorID = "Adres IP ma Niepoprawną Wartość !!!"; if(ip_address) { var dot_count = 0; for ( var i = 0; i < input.length; i++ ) { if (input[i]=='.') { dot_count++; } } if (dot_count === 3) { var delimiter_1 = input.indexOf( ".", 0 ); var delimiter_2 = input.indexOf( ".", delimiter_1 + 1); var delimiter_3 = input.indexOf( ".", delimiter_2 + 1); var delimiter_4 = input.length; var section_1 = delimiter_1; if (section_1 >= 1 && section_1 <= 3) { var section_2 = delimiter_2 - delimiter_1 - 1; if (section_2 >= 1 && section_2 <= 3) { var section_3 = delimiter_3 - delimiter_2 - 1; if (section_3 >= 1 && section_3 <= 3) { var section_4 = delimiter_4 - delimiter_3 - 1; if (section_4 >= 1 && section_4 <= 3) { var pairs = input.http://www.php.net/split("."); for ( var i=0, psl = pairs.length, pair, j; i < psl; i++ ) { pair = pairs[i]; for ( j = 0; j < pair.length; j++) { if ( validChars.indexOf( pair.charAt(j) ) === -1 ) { Error_Message(); return false; } } if ( pair > 255 ) { Error_Message(); return false; } } } } else { Error_Message(); return false; } } else { Error_Message(); return false; } } else { Error_Message(); return false; } } else { Error_Message(); return false; } } else { Error_Message(); return false; } } };
To jest typowy kod spaghetti. Masz osobne zmienne dla poszczególnych części tej samej rzeczy, wielkie zagnieżdżenia, milion razy powtarzasz tę samą linijkę dla różnych etapów kodu. Tak można wymieniać.
Całe sprawdzanie poprawności adresu IP v4 możesz załatwić tak:
function isIPv4(string) { return string.match(/^\d{1,3}(?:\.\d{1,3}){3}$/) !== null && string.split(".").filter(number => number >= 256).length === 0; } // Testy: isIPv4("1.2.3.4"); // true isIPv4("LOL"); // false isIPv4("255.255.255.255"); // true isIPv4("255.256.255.255"); // false
Wiesz, uczę się i wg mnie myślę że dobrze mi idzie, choć mój kod to spaghetti wykonuje to co Twój. Może jak będę miał taką wiedzę jak Ty nie będę tak pisał tylko skracał do jednej linijki. Dla mnie liczy się to że do czegoś doszedłem sam. Nie mniej dziękuję za pomoc, ale uwierz mi napisanie komuś na forum (gdzie oczekuje się nakierowania czy pomocy) że jego kod jest do d. itp itp nie jest motywujące.
To tak jakby w szkole nauczycielka dziecku powiedziała, że niczego się w życiu nie nauczy. Zastanów się nad tym.
Ale od tego są kursy, a nie forum. Jeśli wchodzę na forum dla myśliwych i zadaję pytanie "jak ustrzelić dzika pistoletem na wodę", to nie mogę oczekiwać odpowiedzi jak to faktycznie zrobić. Ucz się i zadawaj konkretne pytania, a nie jak sprzątać śmietnik.
a powiedz mi proszę, czy poniższy kod też byś jakoś uprościł
if ( $("#dvr_wan_tcp_port").parents("#dvr_register_form").length == 1 ) { if ( $('#dvr_wan_tcp_port').val().length == 0 ) { ValidatorID = $( '#dvr_wan_tcp_port' ); Info_Message = "Należy Podać WAN TCP Port Rejestratora !!!"; Error_Message(); return false; } if ( $('#dvr_wan_tcp_port').val().length != 0 ) { ValidatorID = $( '#dvr_wan_tcp_port' ); var validChars = "0123456789"; var input = $( '#dvr_wan_tcp_port' ).val(); for ( j = 0; j < input.length; j++) { if ( validChars.indexOf( input.charAt(j) ) === -1 ) { Info_Message = "WAN TCP Port - Użyto Niepoprawnych Znaków !!!"; Error_Message(); return false; } else { if ( ValidatorID.val() > 65535 ) { Info_Message = "WAN TCP Port - Wartość Spoza Zakresu !!!"; Error_Message(); return false; } } } } };
Tak, ten kod też bym uprościł. Kilka uwag na początek:
Ok dzięki.
1. Sprawdzam czy formularz istnieje bo napisane jest to w jednej funkcji dla wielu formularzy.
2. Chodzi np o to
return false; } else { if ( ValidatorID.val() > 65535 ) {
Możesz to uprościć w tym stylu:
if ( $("#dvr_register_form").length == 1 ) { let port = $('#dvr_wan_tcp_port').val(); try { if ( port === "" ) { throw "Należy Podać WAN TCP Port Rejestratora !!!"; } if ( /^\d+$/.match(port) === null ) { throw "WAN TCP Port - Użyto Niepoprawnych Znaków !!!"; } if ( port > 65535 ) { throw "WAN TCP Port - Wartość Spoza Zakresu !!!"; } } catch (exception) { Info_Message = exception; Error_Message(); return false; } };
nie znałem jeszcze takiego sposobu, ale wygląda znacznie lepiej dla oka niż mój
początek pliku ze skryptem
var ValidatorID = ''; var Info_Message = ''; function Remove_Required() { $('.error').removeClass("error"); $("input").prop('required',false); setTimeout(function() { $('#message').removeAttr( 'style' );}, 1000); ValidatorID.removeAttr( 'onmouseover' ); } function Error_Message() { ValidatorID.prop('required', true).addClass( 'error' ).attr( 'onmouseover', 'return Remove_Required()' ); setTimeout(function() { $('#message').addClass('error');}, 500); setTimeout(function() { $('#message').attr( 'style', 'color: rgba(220,20,60,1)' );}, 500); $( '#message' ).html(Info_Message); ValidatorID.prop('required', true); return false; }
Ten kod mógłby być poprawiony w prawie każdej linijce, ale najważniejsze na ten moment jest to, że Info_Message chyba nie musi być globalną zmienną?
mam w panelu klient diva o id message i do tego diva chce pakować wszystkie informacje nie tylko z formularzy, dlatego ustawiłem zmienną Info_Message jako globalną i oddzielną funkcję Error_Message, która będzie ją przechwytywała.
możesz zerknąć jak to wygląda
topcio.pl
login: test
hasło: test1234
to czego dotyczy w/w skrypt jest w Dodaj Rejestrator
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)