Perché questa separazione non funziona?
-
03-07-2019 - |
Domanda
Provo a rispondere questa domanda alcuni minuti fa e ho preparato questo esempio per me stesso:
<script>
function trialMethod()
{
alert('On Submit Run!'); return true;
}
function trialMethod2()
{
alert('On Submit Run trialMethod2!'); return true;
}
</script>
<form id="aspnetForm" onsubmit="trialMethod();">
<input type="submit">
</form>
Perché il primo unbind non funziona:
<input type="button" id="btnTrial1" value="UNBIND 1"
onclick="$('#aspnetForm').unbind('submit', trialMethod);">
Ma questo funziona per il metodo trialMethod2:
<input type="button" id="btnTrial2" value="UNBIND 2"
onclick="$('#aspnetForm').bind('submit', trialMethod2).unbind('submit', trialMethod2);">
Soluzione
Il primo scenario non risolto non funziona, a causa del modello di eventi di jQuery. jQuery memorizza tutte le funzioni del gestore di eventi in un array a cui è possibile accedere tramite $ (" # foo "). data ('events')
. La funzione unbind
cerca solo la funzione data in questo array. Quindi, puoi solo unbind ()
gestori di eventi che sono stati aggiunti con bind()
Altri suggerimenti
Nessuno dovrebbe mai mescolare il proprio markup con il proprio codice di interazione se usano jQuery.
Aggiungi un po 'di javascript alla pagina in questo modo:
$(function() {
$('#aspnetForm').bind('submit',function() {
trialMethod();
});
$('#btnTrial2').bind('click',function() {
$('#aspnetForm').unbind('submit');
});
$('#btnTrial2').bind('click',function() {
$('#aspnetForm').bind('submit', trialMethod2).unbind('submit');
});
});
Ora, con quello fuori mano ... Tutto dovrebbe funzionare ora (anche se ora legherai il #aspnetForm
prima di separarlo completamente quando viene premuto il secondo pulsante). Il problema era che la forma non era mai veramente "vincolata" all'inizio. Puoi separare i parametri onsubmit
nel markup.
Puoi separare rimuovendo l'attributo corrispondente:
$('#aspnetForm').removeAttr('onsubmit');
Ho riscontrato un problema simile in precedenza. Ciò che ho concluso è che puoi solo sciogliere un metodo che hai vincolato. Poiché trialmethod () NON è stato associato tramite jquery, la chiamata di unbind sul metodo non funzionerebbe.
Facci sapere se lo capisci per caso.
Grazie.
Esiste un bug relativo all'azione bind, unbind e form submit:
Se si esegue il bind e quindi si sblocca e si desidera inviare il modulo, non è possibile utilizzare $ (form) .submit ()
, MA $ (form INPUT [type = submit]) .click ()
!