Pregunta

Estoy usando YUI 2.7.0 y Struts para mi proyecto y tengo un formulario con dos botones de envío.Uno es para Guardar y el otro es para Eliminar.El formulario se envía a DispatchAction.Agregué los oyentes onclick con éxito, pero el problema es que el formulario se envía antes de que se ejecuten los oyentes.Necesito configurar el parámetro de envío antes de enviar el formulario.¿Cómo hago esto?A continuación se muestra lo que tengo hasta ahora:

<form name="adminUserForm" method="post" action="manage_user.do">
  <input type="hidden" id="dispatch" name="dispatch" value="unspecified"/>
  <!-- other form fields here -->
  <input type="submit" value="Save User" id="saveUser">
  <input type="submit" value="Delete User" id="deleteUser">
</form>
<script type="text/javascript"> 
  function confirmDelete(msg)
  {
    if (confirm(msg))
    {
      return setDispatchMethod("delete");
    }
    else
      return false;
  }
  function setDispatchMethod(methodName)
  {
    dispatchField = document.getElementById("dispatch");
    dispatchField.value = methodName
    return true;
  }
  var onClickSaveUser = function (e)
  {
    return setDispatchMethod('save');
  };
  var onClickDeleteUser = function (e)
  {
    return confirmDelete('Are you sure you want to delete the user?');
  };
  new YAHOO.widget.Button("deleteUser",   {onclick: {fn: onClickDeleteUser }});
  new YAHOO.widget.Button("saveUser",     {onclick: {fn: onClickSaveUser   }});
</script>
¿Fue útil?

Solución

El problema es el código de Yahoo para el widget botón controla el evento clic, y en él, que programáticamente enviar el formulario. Su controlador de eventos se llama antes de la suya, por lo que el formulario se envía antes de que su controlador de eventos, incluso se llama.

Aquí están algunas ideas (todos ellos trabajan):

MÉTODO 1

Controle el evento MouseDown lugar del evento click (incendios mousedown antes de clic).

var deleteUserButton = new YAHOO.widget.Button("deleteUser");
deleteUserButton.on("mousedown", onClickDeleteUser);

var deleteUserButton = new YAHOO.widget.Button("saveUser");
deleteUserButton.on("mousedown", onClickSaveUser);

//Using this, you can easily stop the form from submitting
//by using YAHOO's event utility (by adding this code, you
//will prevent the click event from firing as well).

YAHOO.util.Event.preventDefault(e); 

MÉTODO 2

Uso type = enlace en lugar de presentar type = (por defecto). Sólo enviar el formulario si el type = submit (no he probado esto suficiente para ver si la forma todavía presenta por sí mismo - puede que tenga que llamar manualmente form.submit ())

new YAHOO.widget.Button("deleteUser", { type: 'link', onclick: { fn: onClickDeleteUser} });
new YAHOO.widget.Button("saveUser", { type: 'link', onclick: { fn: onClickSaveUser} });

MÉTODO 3

En cuanto a su código, me di cuenta de que crean un campo oculto con el nombre del botón que se ha hecho clic para enviar el formulario (SÓLO ese botón). La etiqueta de entrada tiene que tener un atributo de nombre, y los suyos no, por lo que habría que sumar uno. A continuación, en el servidor, que sólo comprueban el valor de ese campo oculto (el atributo de valor).

No importa cuál de estos métodos que utiliza, usted debe utilizar para detener esta forma de presentación:

YAHOO.util.Event.preventDefault(e); 

Otros consejos

aquí tienes una solución fácil

<form>
    <input type="submit" name='dispatch' value="Save User" id="saveUser">
    <input type="submit" name='dispatch' value="Delete User" id="deleteUser">
</form>

puedes eliminar la entrada oculta

y su variable de solicitud de envío se establecerá en "Guardar usuario" si se hace clic en el primer botón

o "Eliminar usuario" es el segundo en el que se hace clic

Esta pregunta es de varios años, pero todavía tengo un proyecto utilizando YUI 2.9.0 y me acabo de encontrar con el mismo problema, así que voy a compartir mi solución en caso de que otra persona se encuentra en la misma mermelada.

Hay varias cosas que vale la pena destacar acerca de esta cuestión. En primer lugar, el problema describe Gabriel, donde el YUI 2.9.0 Botón clic manejador envía el formulario antes de que su controlador de clic obtiene la llamada no es un problema en IE, al menos a través de IE9. En FireFox a través de al menos FF12, el problema se produce. Sospecho que también sería un problema en Chrome, Safari, y la mayoría si no todos los otros navegadores, así como veo lo que parece ser un caso especial para el IE en el controlador de botón YUI clic.

Además, no me gusta ninguna de las soluciones Gabriel sugirió. El uso de un botón de enlace invalidado todo el estilo a medida que había aplicado a mi botón de enviar, mediante el manejador mousedown pierde parte de la semántica de la interfaz de usuario de un clic, y por alguna botón razón YUI estaba perdiendo la pista del nombre original le di al botón de enviar o, al menos, no fue apareciendo en los valores publicados en el lado del servidor. En el espíritu de botón de enlace de Gabriel, sin embargo, he sustituido el botón de enviar con un botón de entrada, que no se somete de forma predeterminada, a continuación, añade un campo oculto y enviado el formulario a mí mismo:

...

<form id='form'>
    <input type="button" value="&gt;" id="start_survey">

...

function start_survey (p_oEvent, p_aArgs) {
    var input = document.createElement ('input');
    input.type = 'hidden';
    input.name = this.get ('name');
    input.value = '&gt;'

    var form = YAHOO.Dom.get ('form');
    form.appendChild (input);
    form.submit();
}

new YAHOO.widget.Button ("start_survey", {onclick: {fn: start_survey}});

...

Finalmente, dado que YUI es la presentación de la forma de clic, sin embargo, otra solución debe ser sólo para atrapar de forma Envía una prueba y comprobar si el destino del evento es su botón, hacer lo que tiene que hacer, entonces deja que los someta ir o detener que, según sea necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top