2010-08-21 20 views

risposta

5

L'evento "invia" non viene attivato dal pulsante, ma viene attivato dal "modulo". Un test rapido lo dimostra:

<form id="myform"> 
    <input id="email" type="text" value="1st Email" /> 
    <input id="action1" type="submit" value="Action 1" /> 
    <input id="action2" type="submit" value="Action 2" /> 
    </form> 

    <script type="text/javascript"> 

    document.getElementById("myform").onsubmit = function(evt) { 
     var event = evt || window.event; 
     alert(event.target.id); // myform 
     alert(event.explicitOriginalTarget.id); // action2 (if action2 was clicked) 
               // but only works in firefox! 
    } 

    </script> 

Anche se in Firefox, è possibile utilizzare event.explicitOriginalTarget proprietà su evento per ottenere l'ingresso (presentare) che è stato cliccato causando l'evento Invia per essere licenziato. (Se volete sapere)

Quindi migliori opzioni per voi sono:

  • hanno un valore diverso per i pulsanti presentare o
  • avere quelle come normali pulsanti e fare clic su gestori ad esse tramite JavaScript.
+0

Grazie. Ho pensato ai gestori onclick. Sembra che non ci sia un modo pulito (almeno non cross-browser) – GetFree

+0

Sono davvero sorpreso che questa funzionalità sia disponibile, ma dopo aver trovato questa domanda (e molte altre simili), sembra semplicemente che non ci sia. Noioso. – MandM

1

Ci sono un paio di modi che posso pensare.

È possibile utilizzare valori diversi e il tuo discreto javascript può esserti d'aiuto.

Una discussione su questo approccio (usando valori diversi per ogni tasto) è qui:

http://www.chami.com/tips/internet/042599I.html

tendo ad andare con l'utilizzo di diversi name attributi per ogni pulsante.

un blog su che è qui: http://www.codetoad.com/javascript/multiple.asp

non seguo uno di questi, quale approccio funziona meglio sta andando a dipendere da diversi fattori, come ad esempio, stai gestendo i pulsanti presentare in javascript, o il server otterrà il modulo, quindi dovrà capire cosa l'utente desiderava.

Personalmente, preferisco utilizzare l'approccio ajax, ora, in cui basta associare eventi ai pulsanti dopo che la pagina è stata caricata, utilizzando javascript non invadente, e quindi in base alla scelta dell'utente che richiama la funzione corretta, ma che dipende dalla possibilità di aggiungere un link di script alla pagina html.

UPDATE:

Per fare questo con javascript, il modo più semplice è quello di collegare un evento sul click del pulsante, e poi guardare il nome di decidere come gestirlo.

In realtà, il modulo non deve mai essere inviato al server, ma è possibile gestire tutto in background completando i parametri (opzioni) e inviandoli al server e informando l'utente sui risultati.

+0

Sì, i nomi diversi sono la strada da percorrere. Basare il controllo sui valori è concettualmente sbagliato poiché tali valori fanno parte della GUI. – GetFree

1

La presenza di un listener di eventi su ciascun pulsante è considerata come aggiunta di codice? Altrimenti, non c'è modo di vedere quale pulsante ha attivato l'evento di invio, a meno che non si voglia scendere e sporcare e calcolare la posizione del mouse durante l'evento e confrontarlo con le posizioni dei pulsanti.

In caso contrario, la cosa migliore sarebbe assegnare un gestore di eventi per l'evento click del pulsante e assegnare il nome di quel pulsante a una variabile che è possibile controllare nell'evento di invio del modulo.

+1

Avevo paura di ciò. Che peccato. – GetFree

1

Mi dispiace scaldare questo thread molto vecchio. Qui non è stata data risposta alla domanda, ma in passato sono stati forniti solo approcci per soluzioni pratiche.

Ma l'oggetto evento fa portare informazioni su quale oggetto l'ha avviato. In un gestore b4submit (e) è possibile ottenere il pulsante di invio, in questo modo:

function b4submit(e) { 
    var but = e.originalEvent.explicitOriginalTarget; 
    ... 
} 

E, ma è un oggetto HTML con tutti gli attributi che hai assegnato con, come il nome, l'ID, il valore ecc

Mi sono imbattuto in questo dopo un po 'di debug, e ho pensato che potrebbe essere di un interesse più ampio come una soluzione pulita per questo problema.

+0

La risposta accettata cita già 'explicitOriginalTarget'. È una proprietà specifica di Mozilla. – GetFree