Właśnie przetestowany to zachowanie w różnych przeglądarkach, wszystkie przeglądarki dał takie same wyniki, oto moja konkluzja:
<!-- 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 -->
Jak wiadomo, JavaScript jest liniowy, to wykonuje linię kodu, który nastąpi wcześniej. Powiedzmy, że mamy taką postać:
<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>
Na kliknięcie przycisku, zdarzenia związane z przyciskiem następuje pierwszy (zdarzenia „click”), to wydarzenia związane z formą występuje obok (zdarzenia „Wyślij”). Wynik jest następujący:
- alert: onclick
- Alert: wiążą kliknij
- Alert: onsubmit
- Alert: wiążą złożyć
- składania forma
Jeśli uwzględni dowolny kod przekierowania w którejkolwiek z funkcji, przekierowanie zostanie zignorowane, a przesłanie wystąpi, wierzę, że javascript nadpisuje kod document.location.href
z procesem "post-post", "przesłanie formularza" jest jak ukryta/ukryta linia kodu na końcu skryptu, jeśli w pewnym momencie nie zostanie wykonana return false;
, ta niejawna/ukryta linia zostanie wykonana.
Nie jestem ekspertem, ale zrozumiałem to po kilku testach. Proszę popraw mnie jeżeli się mylę.
EDYCJA: A co, jeśli uwzględnimy w każdej funkcji document.location.href
?tak:
<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>
Stan wartości ciąg zmian „href” w następujący sposób (ale wykonuje przekierowanie na końcu skryptu):
- document.location.href = „http://www.onclick.com” ;
- document.location.href = 'http://www.bindclick.com';
- document.location.href = 'http://www.onsubmit.com';
- document.location.href = 'http://www.bindsubmit.com';
- document.location.href = '/'; // złożenie formularza
- javascript, należy przekierować na podstawie "href" wartość ciągu
ale mamy return false;
po # 2, co oznacza, że nie będzie przekierować do "http://www.bindclick.com"
Zobacz [Zapobiegaj domyślnym jQuery Wyślij formularz] (http://stackoverflow.com/q/6462143/11683) i [event.preventDefault() vs. return false] (http://stackoverflow.com/q/ 1357118/11683). – GSerg
Wiem, że zwracanie wartości false uniemożliwi przesłanie, w takim przypadku nastąpi przekierowanie. Ale dlaczego przekierowanie nie występuje w tym przypadku? Co to powstrzymuje? – GendoIkari
Czy możesz powtórzyć to w [jsfiddle] (http://jsfiddle.net/), a także powiedzieć nam, z której przeglądarki korzystasz? –