2010-08-21 19 views

Respuesta

5

El evento "enviar" no se activa con el botón, pero se dispara con el "formulario". Una prueba rápida prueba esto:

<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> 

Aunque en Firefox, puede utilizar event.explicitOriginalTarget propiedad en caso de conseguir la entrada (enviar) que se hizo clic provocando que el evento Enviar a ser despedido. (Si usted quiere saber)

Así mejores opciones para usted son:

  • tener un valor diferente a los botones de envío O
  • Tener aquellos como botones normales y haga clic en los manipuladores a ellos a través de JavaScript.
+0

Gracias. Pensé en los manejadores onclick. Parece que no hay una manera limpia (al menos no entre navegadores) – GetFree

+0

Estoy realmente sorprendido de que esta funcionalidad esté disponible, pero después de encontrar esta pregunta (y varias similares), parece que simplemente no está allí. Cojo. – MandM

1

Hay un par de formas en que puedo pensar.

Puede usar diferentes valores, y su javascript discreto puede ayudarlo.

Una discusión sobre este enfoque (utilizando diferentes valores para cada botón) está aquí:

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

que tienden a ir con el uso de diferentes name atributos para cada botón.

Un blog sobre el que está aquí: http://www.codetoad.com/javascript/multiple.asp

no sigo ninguno de estos, qué enfoque funciona mejor va a depender de diferentes factores, como por ejemplo, estás manejando los botones submit en javascript, o el servidor obtendrá el formulario, luego tendrá que averiguar qué quería el usuario.

Personalmente, prefiero usar el enfoque ajax, ahora, cuando solo adjunto eventos a los botones después de cargar la página, usando javascript discreto y luego, según la elección del usuario, llamo a la función correcta, pero eso depende de si puede agregar un enlace de script a la página html.

ACTUALIZACIÓN:

Con el fin de hacer esto con javascript, la forma más sencilla es conectar un evento en el clic del botón, y luego ver el nombre de decidir cómo manejar la situación.

En realidad, el formulario nunca debe enviarse al servidor, pero puede manejar todo en segundo plano al cerrar los parámetros (opciones) y enviarlos al servidor, y dejar que el usuario conozca los resultados.

+0

Sí, diferentes nombres es el camino a seguir. Basar el control en los valores es conceptualmente incorrecto ya que esos valores son parte de la GUI. – GetFree

1

¿Tener un detector de eventos en cada botón cuenta como agregar código? De lo contrario, no hay forma de ver qué botón desencadenó el evento de envío, a menos que desee bajar y ensuciar, calcular la posición del mouse durante el evento y compararlo con las posiciones de los botones.

De lo contrario, lo mejor sería asignar un controlador de eventos para el evento de clic del botón y asignar el nombre de ese botón a una variable que puede verificar en el evento de envío del formulario.

+1

Tenía miedo de eso. Qué lástima. – GetFree

1

Perdón por calentar este viejo hilo. La pregunta no había sido respondida aquí, pero antes solo se han presentado enfoques para soluciones prácticas.

Pero el objeto-evento lleva lleva información sobre qué objeto lo ha iniciado. En un controlador de b4submit (e) se puede obtener el botón de enviar la siguiente manera:

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

Y aunque es un objeto HTML con todos los atributos que ha asignado con, como nombre, id, valor, etc.

Me encontré con esto después de algunas depuraciones, y pensé que podría ser de mayor interés como una solución limpia para este problema.

+0

La respuesta aceptada ya menciona 'explicitOriginalTarget'. Es una propiedad específica de mozilla. – GetFree

Cuestiones relacionadas