2013-07-30 9 views
14

HTML5 fornisce per la validazione automatica URL: -Con validazione dell'input url HTML5 assumere URL inizia con http: //

<form> 
    <input type="url" name="someUrl"> 
</form> 

Questo fallirà convalida per URL che non hanno un prefisso di protocollo - ad esempio stackoverflow.com avrà esito negativo mentre passerà http://stackoverflow.com.

Come posso aggiungere http: // automaticamente a un URL se non esiste già un protocollo?

Potrei aggiungere un gestore di eventi onblur ma esiste un modo migliore come alcuni prima dell'evento di convalida?

+6

Forse un po 'pendantic ma 'stackoverflow.com' in realtà non è un URL. È solo un nome host ... –

+7

Vero - ma pedante;) La persona media che vede un modulo con l'etichetta "Sito web" non può essere infastidita dalla differenza tra stackoverflow.com e http: // stackoverflow.com – Ryan

+6

In difesa del sig. Persona media: la maggior parte dei browser in realtà nasconde la parte "http: //" dell'URL. – frnhr

risposta

14

Il co de per questo non dovrebbe interrompere l'azione dell'utente, ma dovrebbe invece attendere fino a quando l'utente lascia il campo modulo per controllare il testo di input per "http". Quindi usa "onblur" invece di "onkeyup".

Quindi, basta vedere se la stringa contiene "http" usando indexOf. In caso contrario, restituirà -1, che è falso.

function checkURL (abc) { 
 
    var string = abc.value; 
 
    if (!~string.indexOf("http")) { 
 
    string = "http://" + string; 
 
    } 
 
    abc.value = string; 
 
    return abc 
 
}
<form> 
 
    <input type="url" name="someUrl" onblur="checkURL(this)" /> 
 
    <input type="text"/> 
 
</form>

Fiddle

+8

Non funziona per es. 'Example.com/http'. Dovresti usare un controllo più severo, come '(string.indexOf (" http: ") === 0)' ... o in realtà, questo renderà antefatto 'http: //' a 'https: //' urls , quindi piuttosto '(string.match (/^https?: /))' Ovviamente, verrà anteposto a validi 'ftp: //' urls, ecc. quindi se si vuole consentire qualsiasi protocollo allora sarebbe be '(string.match (/^\ w +: /))' – 1j01

+0

questo codice è inoltre errato nel caso in cui qualcuno inserisca semplicemente l'input senza inserire nulla. Basta usare la linguetta per passare al campo successivo, ora hai uno stupido 'http: //' nel campo dell'URL che non volevi lì – Toskan

6

se non si desidera che la convalida del browser (che può variare tra i browser), è possibile aggiungere il seguente attributo novalidate

<input type="url" name="someUrl" formnovalidate="formnovalidate"> 

altro si potrebbe desiderare di essere più trasparenti circa prefisso http: // aggiungendo semplicemente una volta che qualcuno inizia a digitare o addirittura a http: // già digitato nella casella nella pagina caricata

(credito a editore che giustamente sottolinea che il novalidato si applica alla forma, mentre sopra sovrascrive quello, addebito al creditore per l'approccio modificare;)

3

è possibile utilizzare

HTML:

<form> 
    <input type="url" name="someUrl" onkeyup="checkUR(this)" > 
</form> 

SCRIPT:

function checkUR(abc){ 
    string = abc.value 
    if(!(/^http:\/\//.test(string))){ 
     string = "http://" + string; 
    } 
    abc.value=string 
} 

example

Spero che vi aiuterà

+3

Ciò non consente a qualcuno di inserire https: // – Ryan

+0

sì, è necessario aggiungere un'altra condizione per https –

+1

Tutto ciò che serve è '/^https?: /' – 1j01

3

Si può provare a forzare gli utenti immettono URL valido, fornendo valore iniziale e segnaposto.

<label for="some-url">Some url:</label> 
 
<input id="some-url" type="url" placeholder="http://example.com" value="http://">

1

Questo sarà anteporre l'URL prima presentata, se non dispone di un http o https nell'URL.È anche senza distinzione tra maiuscole e minuscole (lo i alla fine). Sto anche usando onchange invece degli altri eventi per tenere conto degli utenti che premono il tasto invio e inviano il modulo in questo modo.

SCRIPT:

function checkURL(o) { 
    if (!/^https?:\/\//i.test(o.value)) { 
     o.value = "http://" + o.value; 
    } 
} 

SUPPLENTE SCRIPT: (sempre corretto "http: //")

function checkURL(o) { 
    o.value = o.value.replace(/^(https?:\/\/)?/i, "http://"); 
} 

HTML:

<form> 
    <input type="url" name="someUrl" onchange="checkURL(this)" > 
</form> 
0

ciò che voi ragazzi probabilmente desidera utilizzare è questo:

$(function(){ 
     $('input[type="url"]').on('blur', function(){ 
      var string = $(this).val(); 
      if (!string.match(/^https?:/) && string.length) { 
      string = "http://" + string; 
       $(this).val(string) 
      } 
     }); 
}); 

questo gira su documento pronto

controlli se il valore è vuoto o è mancante http all'inizio

inserti in quel caso sulla sfocatura

grazie @ 1j01