Eu tenho uma entrada básica do botão FAPI que está #ajax ativada e está funcionando bem, mas quero adicionar uma JS "Tem certeza?" pop-up de confirmação ao clicar no botão antes da execução do código, e não sei como fazer isso porque o JS da FAPI parece estar consumindo o clique antes que eu possa acessá-lo, não importa o que eu faça.
Eu tentei adicionar um manipulador on-line on-line, assim:
$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
),
);
... o que não ajuda, e eu também tentei adicionar:
$('.confirm').click(function(e) {
e.preventDefault();
alert('Is this recognized')? // never runs
});
no JS do meu módulo, que também é ignorado.
Alguma outra ideia? Existe uma maneira de adicionar um manipulador de envio ao topo da pilha que o Drupal #ajax reconhecerá?
fonte
$('.confirm').unbind('click');
) ... ou estou lendo errado? desculpe não familiarizado comunbind
confirmando que Jeroen está corrigindo o código do googletorp.
No entanto, eu mesmo descobri que os pares do tipo "mousedown" precisam ser abertos e ligados novamente. Portanto, o trecho de código que funcionou para mim é o seguinte:
fonte
A pergunta é antiga, mas eu também estava interessado nela. Na minha opinião, a maneira mais fácil é usar o evento click na sua definição de Ajax, porque o Drupal usa o evento mousedown como padrão:
Depois, basta adicionar um
.mousedown()
evento ao seu botão no seu arquivo Javascript, pois ele é acionado antes do evento click:Se você ainda deseja que sua solicitação do Ajax seja chamada com o evento mousedown, é possível usar um evento personalizado:
Em seguida, você pode acionar esse evento no
.mousedown()
evento do seu arquivo Javascript:Ambas as versões funcionam!
fonte
preventDefault
no meu manipulador de cliques para impedir o envio normal (não-js) de formulário.Você já tentou executar seu JS dentro de um comportamento do Drupal? Pode ser que o seu manipulador de cliques esteja sendo anexado após o Drupal.
De qualquer forma, você deve conseguir desvincular o manipulador de cliques do Drupal no botão para ser chamado primeiro e poder chamar o manipulador de cliques do Ajax do Drupal manualmente (e condicionalmente).
fonte
Responder para observar que o código do googletorp não está 100% correto.
Você precisa alterar a linha em que os eventos são armazenados para isso:
Dessa forma, você elimina quaisquer problemas de referência de objeto; portanto, ao desvincular os eventos de clique, eles também não são desvinculados no seu var;)
Além disso, lembre-se de que, desde o jQuery 1.8, o método .data () ficou obsoleto. A obtenção de dados do evento agora é feita por meio de uma estrutura de dados interna:
Fonte: http://blog.jquery.com/2011/11/08/building-a-slimmer-jquery/
fonte
Encontrei muitas respostas úteis acima e consegui que meu formulário funcionasse. Juntando tudo, foi o que funcionou para o meu aplicativo: um botão de exclusão de formulário com uma caixa de diálogo de confirmação e retorno de chamada AJAX para modificar o conteúdo de uma lista de seleção.
O javascript:
O elemento do formulário (lista de seleção) a ser modificado:
O botão:
E, finalmente, o retorno de chamada AJAX:
fonte
Corrigi isso modificando o arquivo drupal misc / ajax.jx.
Crie uma cópia do arquivo ajax.js e coloque-o em qualquer módulo personalizado e modifiquei a
Drupal.ajax = function (base, element, element_settings) {
função antes deEstá funcionando bem para mim.
fonte
Talvez um pouco velho, mas estou me perguntando por que não podemos simplesmente usar:
fonte