2013-08-16 14 views
5

Mi sono imbattuto in questo strano codice in un sito web su cui sto lavorando e non capisco come o perché sta accadendo il comportamento che sto vedendo.Cosa succede se provi a reindirizzare prima che un modulo venga inviato?

<input type="submit" value="Save" onclick="document.location.href='http://www.google.com'" /> 

(Modificato l'href; in realtà stava puntando allo stesso URL dell'azione del modulo).

Poiché l'evento onclick viene generato prima dell'invio del modulo, mi aspetto che questo codice reindirizzi la pagina a Google.com, quindi interrompe l'esecuzione della pagina e non invia mai il modulo. O eventualmente reindirizzare a Google.com, ma poi ancora finiscono di inviare il modulo.

Ma quello che succede sembra essere che il reindirizzamento è completamente ignorato e il modulo viene comunque inviato. Perché dovrebbe succedere?
Ho confermato che l'evento onclick si attiva correttamente; Ho spostato il reindirizzamento in una funzione e ho chiamato la funzione in onclick. La funzione è stata chiamata bene prima dell'invio, ma il reindirizzamento sembrava essere ignorato.

+1

Vedere [Prevent default su Form Submit jQuery] (http://stackoverflow.com/q/6462143/11683) e [event.preventDefault() vs. return false] (http://stackoverflow.com/q/ 1357118/11683). – GSerg

+0

So che return false impedirebbe l'invio, e in tal caso il reindirizzamento avviene. Ma perché il reindirizzamento non si verifica in questo caso? Cosa lo ferma? – GendoIkari

+0

Puoi ri-produrre questo in un [jsfiddle] (http://jsfiddle.net/) e anche dirci con quale browser stai provando? –

risposta

4

Ho appena testato questo comportamento in diversi browser, tutti i browser hanno dato gli stessi risultati, ecco la mia conclusione:

<!-- submit button inside form --> 
<form method="post"> 
    <input type="submit" value="submit" /> <!-- onclick = submitted to same page --> 
    <input type="submit" value="submitNredirect" onclick="document.location.href='http://www.google.com';" /> <!-- onclick = submitted to same page, ignored redirect --> 
</form> 
<!-- submit button without form --> 
<input type="submit" value="submit" /> <!-- onclick = no submit or redirect occur --> 
<input type="submit" value="submitNredirect" onclick="document.location.href='http://www.google.com';" /> <!-- onclick = redirect --> 

Come sapete, javascript è lineare, esegue la riga di codice che viene prima. Diciamo che abbiamo questa forma:

<form id="myform" method="post" onsubmit="alert('onsubmit');"> 
    <input id="mybtn" type="submit" value="submit" onclick="alert('onclick');" /> 
</form> 
<script> 
    $(document).ready(function() { 
     $('#mybtn').bind('click', function() { 
      alert('bind click'); 
     }); 
     $('#myform').bind('submit', function() { 
      alert('bind submit'); 
     }); 
     // onclick > bind click > onsubmit > bind submit 
    }); 
</script> 

Sul clic sul pulsante, gli eventi legati al pulsante si verifica per primo (gli eventi "click"), poi gli eventi legati alla forma verifica successiva ("Invia" eventi). Il risultato è il seguente:

  1. avviso: onclick
  2. avviso: bind clic
  3. avviso: onSubmit
  4. avviso: bind presentare
  5. modulo di presentazione

Se si include qualsiasi codice di reindirizzamento in una qualsiasi delle funzioni, il reindirizzamento verrà ignorato e si verificherà l'invio, credo che javascript sovrascriva lo document.location.href con il processo di post modulo, la "sottomissione modulo" è come una riga di codice implicita/nascosta alla fine dello script, se non si esegue return false; a un certo punto, questa riga implicita/nascosta viene eseguita.

Non sono un esperto, ma è quello che ho capito dopo alcuni test. Per favore correggimi se sbaglio.

MODIFICA: Che cosa succede se includiamo un document.location.href in ogni funzione?in questo modo:

<form id="myform" method="post" onsubmit="document.location.href='http://www.onsumbit.com';"> 
    <input id="mybtn" type="submit" value="submit" onclick="document.location.href='http://www.onclick.com';" /> 
</form> 
<script> 
    $(document).ready(function() { 
     $('#mybtn').bind('click', function() { 
      document.location.href='http://www.bindclick.com'; 
      return false; 
     }); 
     $('#myform').bind('submit', function() { 
      document.location.href='http://www.bindsumbit.com'; 
     }); 
    }); 
</script> 

Lo stato del valore di stringa di cambiamenti "href" come segue (ma esegue il reindirizzamento al termine dello script):

  1. document.location.href = 'http://www.onclick.com' ;
  2. document.location.href = 'http://www.bindclick.com';
  3. document.location.href = 'http://www.onsubmit.com';
  4. document.location.href = 'http://www.bindsubmit.com';
  5. document.location.href = '/'; // modulo di presentazione
  6. javascript, non reindirizzare sulla base del valore stringa "href"

ma abbiamo return false; dopo # 2, il che significa che farà reindirizzamento per "http://www.bindclick.com"

+0

Buono. GendoIkari non si informava sull'uso di jQuery però ... –

+0

@LoSauer Lo so, sto usando solo jQuery per i test, dal momento che la domanda non riguarda i codici, ma riguarda il comportamento di javascript – evilReiko

+0

Capisco. Ma questo ha poco a che fare con JavaScript o con la sua "linearità". Riguarda il modo in cui i gestori e quindi l'evento che bolle per l'input [type = submit] sono impostati in una particolare implementazione del browser. Un'opzione sta sovrascrivendo questi gestori ... –

0
<form action="http://www.yahoo.com" method="get"> 
<input type="submit" value="Save" onclick="document.location.href='http://www.google.com'" /> 
</form> 

Fare clic sul pulsante Salva e ho trovato a seconda del browser verrai indirizzato a Yahoo (Chrome) a meno che non si aggiunge return false per l'evento onclick. Su IE 10 verrai indirizzato a Google.

Penso che qualcuno che ha codificato i browser dovrà rispondere a questo.

0

Quello che state osservando è il comportamento predefinito e ereditato dei gestori per lo HTMLInputElement, a meno che non venga sottoposto a override.

Soluzione:

Utilizzare il HTML5 button type-submit Element invece, che tutti i browser moderni dovrebbero essere in grado di gestire correttamente.

<form action="/" method="post" onsubmit="alert('submit event')"> 
    <input type="text" name="someinput" value="100"> 
    <button type="submit" onclick="alert('button onclick handled before form-submit')">submit</button> 
</form> 

Spiegazione:

Non hai fornito un browser specifico, ma forse si sta utilizzando WebKit, che ha avuto un problema con il onsubmit/onclick gerarchia degli eventi before.

Sul sito codice del progetto è possibile cercare il codice che implementa i vari HTMLElement.
Ad esempio una ricerca di onsubmit porterà a un Webkit onsubmit-event bubbling test.

Un'opzione per ovviare a questo problema di event-bubbling consiste nell'utilizzare un button e renderlo in un "submit", trovando il suo modulo di inclusione e inviandolo tramite la funzione (HTMLFormElement-instance).submit().

Un altro è modificando il gestore di invio del modulo, che dovrebbe essere quello che stai cercando.

<form action="/" method="post" accept-charset="utf-8" id="myform3" 
    onsubmit="event.stopPropagation(); event.cancelBubble = true;"> 
    A form with the default Browser submit-handler overwritten: 
    <br> 
    <input type="text" name="someinput" value="100"> 
    <input type="submit" name="commit" value="Submit" 
    onclick="alert('will alert first and submit later using the browser default submit handler.');"> 
</form> 

Tutti i casi sono dimostrati in questo fiddle.

Cheers!

0

penso che questa è una domanda discutibile,

Risponderò in termini di comportamento,

Il metodo predefinito di forma è GET così via stampa di presentare il modulo tasto per ottenere i dati. Fonte Old Post

Ma se avete e.preventDefault() incluso con il document.location.href = "http://www.google.com"

Ora, se il collegamento è un index.html la pagina indice locale sarà chiamato con riferimento all'indirizzo del sito web, in quanto hai rimosso il link originale, non è possibile giudicare il motivo per cui originariamente questi sono stati utilizzati !!! ???

che posso dire in tua domanda eseguire questo codice,

<form onsubmit="javascript:alert('Form Submit called '+ this.method);"> 
    <input type=submit value=Submit onclick="javascript:document.location.href='http://www.google.com';alert('Button Submit');" /> 
</form> 

questo cancellerà la chiamata di flusso. come document.location.href non viene mai modificato utilizzando questo ..

utilizzare questo codice dopo aver modificato l'href alert(document.location.href); questo vi darà la posizione che non viene modificata.

Forse prevenire comportamenti di default può cambiare questo, ma che non è parte del codice ..

Spero che questo renderà le cose più chiare.

Problemi correlati