Tengo una entrada de botón FAPI básica que está habilitada para #ajax y está funcionando bien, pero quiero agregar un JS "¿Estás seguro?" ventana emergente de confirmación al hacer clic en el botón antes de que el código realmente se ejecute, y no estoy seguro de cómo hacerlo porque JS de FAPI parece estar comiendo el clic antes de que pueda acceder a él sin importar lo que haga.
Intenté agregar un controlador onclick en línea, así:
$form['search_filters']['channels']['channel_delete_' . $channel->nid] = array(
'#type' => 'button',
'#name' => 'channel_delete_' . $channel->nid,
'#value' => 'Delete',
'#attributes' => array(
'class' => array('confirm'),
'onclick' => "return confirm('Are you sure you want to delete that?')"
),
'#button_type' => 'no-submit',
'#ajax' => array(
'callback' => 'delete_channel_callback',
'wrapper' => 'channel_container_' . $channel->nid
),
);
... lo que no ayuda, y también he intentado agregar:
$('.confirm').click(function(e) {
e.preventDefault();
alert('Is this recognized')? // never runs
});
en JS de mi módulo que también se ignora.
¿Alguna otra idea? ¿Hay alguna manera de agregar un controlador de envío a la parte superior de la pila que Drupal #ajax reconocerá?
fuente
$('.confirm').unbind('click');
) ... ¿o lo estoy leyendo mal? lo siento, no estoy familiarizado conunbind
confirmando que Jeroen está arreglando el código de googletorp.
Sin embargo, yo mismo descubrí que las coincidencias del tipo "mousedown" tienen que volver a estar libres y vinculadas. Entonces, el código que funcionó para mí es el siguiente:
fuente
La pregunta es antigua, pero también me interesó. En mi opinión, la forma más fácil es usar el evento click en su definición de Ajax, porque Drupal usa el evento mousedown de manera predeterminada:
Luego solo necesita agregar un
.mousedown()
evento a su botón en su archivo Javascript, porque se activa antes del evento de clic:Si aún desea que se llame a su Solicitud de Ajax con el evento mousedown, puede usar un evento personalizado:
Luego puede activar este evento en el
.mousedown()
caso de su archivo Javascript:Ambas versiones funcionan!
fuente
preventDefault
controlador de clics para evitar el envío normal (no js) del formulario.¿Has intentado ejecutar tu JS dentro de un comportamiento de Drupal? Podría ser que su controlador de clics se adjunte después de Drupal.
De cualquier manera, debería poder desvincular el controlador de clics de Drupal en el botón para que se le llame primero y pueda llamar al controlador de clics Ajax de Drupal manualmente (y condicionalmente).
fuente
Respondiendo para notar que el código de googletorp no es 100% correcto.
Debe cambiar la línea donde se almacenan los eventos para esto:
De esta forma elimina cualquier problema de referencia de objetos, por lo que al desenlazar los eventos de clic, no se desenlaza también en su var;)
Además, tenga en cuenta que desde jQuery 1.8 el método .data () ha quedado en desuso. La obtención de datos de eventos ahora se realiza a través de una estructura de datos interna:
Fuente: http://blog.jquery.com/2011/11/08/building-a-slimmer-jquery/
fuente
Encontré muchas respuestas útiles arriba y pude hacer que mi formulario funcionara. En conjunto, esto es lo que funcionó para mi aplicación: un botón de formulario de eliminación con un cuadro de diálogo de confirmación y devolución de llamada AJAX para modificar el contenido de una lista de selección.
El javascript:
El elemento de formulario (lista de selección) a modificar:
El botón:
Y finalmente, la devolución de llamada AJAX:
fuente
He solucionado esto modificando el archivo drupal misc / ajax.jx.
Cree una copia del archivo ajax.js y colóquelo en cualquier módulo personalizado y modifique la
Drupal.ajax = function (base, element, element_settings) {
función en beforeSend:esta trabajando bien para mi.
fuente
Tal vez un poco viejo, pero me pregunto por qué no podemos usar:
fuente