intercept - Dovrebbe essere $(form)di jQuery.submit();non attivare onSubmit all'interno del tag form?





document post (9)


This lavoro risolverà il problema riscontrato da @Cletus.

function submitForm(form) {
    //get the form element's document to create the input control with
    //(this way will work across windows in IE8)
    var button = form.ownerDocument.createElement('input');
    //make sure it can't be seen/disrupts layout (even momentarily)
    button.style.display = 'none';
    //make it such that it will invoke submit if clicked
    button.type = 'submit';
    //append it and click it
    form.appendChild(button).click();
    //if it was prevented, make sure we don't get a build up of buttons
    form.removeChild(button);
}

Funzionerà su tutti i browser moderni.
Funzionerà su schede / finestre figlio generate (sì, anche in IE <9).
Ed è in vaniglia!

Passa semplicemente un riferimento DOM a un elemento del modulo e si assicurerà che tutti gli ascoltatori collegati, l'onsubmit e (se non ne viene impedito per allora), infine, invii il modulo.

Ho il seguente:

<script type="text/javascript">
function CancelFormButton(button) {
    $(button.form).submit();
}
</script>

<form onsubmit="alert('here');">
<input type="button" value="Cancel" onClick="CancelFormButton(this);" />
</form>

Quando faccio clic sul pulsante "Annulla", l'onsubmit dal tag form non viene attivato.

Questa riga invia invece il modulo correttamente: $(button.form).submit(); ma salta l' alert('here'); all'interno del onsubmit nel tag form.

È corretto o sto facendo qualcosa di sbagliato?

A proposito, in questo caso, voglio questa funzionalità, ma mi chiedo solo se ho intenzione di imbattermi in un problema in un browser in cui viene attivato l'onsubmit.




Mi dispiace, ho frainteso la tua domanda.

Secondo Javascript - catturando onsubmit quando si chiama form.submit () :

Mi è stato chiesto di recente: "Perché l'evento form.onsubmit non viene attivato quando invio il mio modulo utilizzando javascript?"

La risposta: i browser attuali non aderiscono a questa parte delle specifiche html. L'evento si attiva solo quando viene attivato da un utente e non si attiva se attivato dal codice.

(enfasi aggiunta).

Nota: "attivato da un utente" include anche i pulsanti di invio (probabilmente incluso il comportamento di invio predefinito dal tasto Invio ma non l'ho provato). Né, credo, si innesca se tu (con codice) fai clic su un pulsante di invio.




La soluzione più semplice per ovviare a questo problema è creare un input "temporaneo" con tipo submit e trigger click:

var submitInput = $("<input type='submit' />");
$("#aspnetForm").append(submitInput);
submitInput.trigger("click");



Prova ad attivare l'evento () nella tua funzione:

$("form").trigger('submit'); // and then... do submit()



Suppongo che sia ragionevole volere questo comportamento in alcuni casi, ma direi che il codice che non attiva l'invio di un modulo dovrebbe (sempre) essere il comportamento predefinito. Supponiamo di voler prendere l'invio di un modulo con

$("form").submit(function(e){
    e.preventDefault();
});

e quindi fare qualche convalida sull'input. Se il codice potrebbe attivare l'invio di gestori, non potresti mai includere

$("form").submit()

all'interno di questo gestore perché risulterebbe in un ciclo infinito (verrà chiamato il gestore SAME, impedirà l'invio, la convalida e il nuovo invio). Devi essere in grado di inviare manualmente un modulo all'interno di un gestore di invio senza attivare lo stesso gestore.

Mi rendo conto che questo non risponde alla domanda direttamente, ma ci sono molte altre risposte in questa pagina su come questa funzionalità può essere violato, e ho sentito che questo doveva essere sottolineato (ed è troppo lungo per un commento).




Ho trovato questa domanda serval anni fa.

recentemente ho provato a "riscrivere" il metodo submit. di seguito è il mio codice

window.onload= function (){
for(var i= 0;i<document.forms.length;i++){
    (function (p){
        var form= document.forms[i];
        var originFn= form.submit;
        form.submit=function (){
            //do something you like
            alert("submitting "+form.id+" using submit method !");
            originFn();
        }
        form.onsubmit= function (){
            alert("submitting "+form.id+" with onsubmit event !");
        }
    })(i);


}

}

<form method="get" action="" id="form1">
<input type="submit" value="提交form1" />
<input type="button" name="" id="" value="button模拟提交1" onclick="document.forms[0].submit();" /></form>

Lo ha fatto in IE, ma non è riuscito in altri browser per la stessa ragione del "cletus"




trigger ('submit') non funziona. Il metodo onSubmit non viene attivato. il seguente codice funziona per me, chiama il metodo onSubmit quando si utilizza questo codice:

$("form").find(':submit').click();




Invece di

$("form").submit()

prova questo

 $("<input type='submit' id='btn_tmpSubmit'/>").css('display','none').appendTo('form');
 $("#btn_tmpSubmit").click();



Se Chrome DevTools sta segnalando un 404 per un file .map (forse jquery-1.10.2.min.map , jquery.min.map o jquery-2.0.3.min.map , ma può succedere con qualsiasi cosa) la prima cosa da sapere questo è richiesto solo quando si utilizza DevTools. I tuoi utenti non colpiranno questo 404.

Ora puoi risolvere questo problema o disabilitare la funzionalità di sourcemap.

Correzione: ottieni i file

Successivamente, è una soluzione semplice. http://jquery.com/download/ a http://jquery.com/download/ e fai clic sul link Scarica il file di mappa per la tua versione, e ti consigliamo di scaricare anche il file non compresso.

Avere il file di mappa in posizione consente di eseguire il debug del jQuery minified tramite le origini originali, il che consente di risparmiare un sacco di tempo e frustrazione se non ti piace gestire nomi di variabili come a e c .

Ulteriori informazioni su sourcemaps qui: Introduzione a JavaScript Source Maps

Schiva: disabilita le mappe acide

Invece di ottenere i file, puoi in alternativa disattivare completamente le mappe di origine JavaScript per ora, nelle tue impostazioni. Questa è una scelta eccellente se non si pianifica mai di eseguire il debug di JavaScript in questa pagina. Usa l'icona a forma di ingranaggio in basso a destra di DevTools, per aprire le impostazioni, quindi:





jquery onsubmit