eu tenho um .submit()
evento configurado para envio de formulários. Também tenho vários formulários na página, mas apenas um aqui para este exemplo. Gostaria de saber em qual botão enviar foi clicado sem aplicar um .click()
evento a cada um.
Aqui está a configuração:
<html>
<head>
<title>jQuery research: forms</title>
<script type='text/javascript' src='../jquery-1.5.2.min.js'></script>
<script type='text/javascript' language='javascript'>
$(document).ready(function(){
$('form[name="testform"]').submit( function(event){ process_form_submission(event); } );
});
function process_form_submission( event ) {
event.preventDefault();
//var target = $(event.target);
var me = event.currentTarget;
var data = me.data.value;
var which_button = '?'; // <-- this is what I want to know
alert( 'data: ' + data + ', button: ' + which_button );
}
</script>
</head>
<body>
<h2>Here's my form:</h2>
<form action='nothing' method='post' name='testform'>
<input type='hidden' name='data' value='blahdatayadda' />
<input type='submit' name='name1' value='value1' />
<input type='submit' name='name2' value='value2' />
</form>
</body>
</html>
Além de aplicar um evento .click () em cada botão, existe uma maneira de determinar qual botão de envio foi clicado?
name
?Respostas:
Fiz a mesma pergunta: Como posso obter o botão que causou o envio no evento de envio do formulário?
Acabei criando esta solução e funcionou muito bem:
No seu caso, com vários formulários, você pode precisar ajustar um pouco, mas ainda deve aplicar
fonte
Eu achei que isso funcionou.
fonte
Isso funciona para mim:
fonte
id
doactiveElement
, eu fiz$(document.activeElement).attr('id');
document.activeElement.id
document.activeElement
não é a entrada. No meu caso, é uma div modal (que contém o formulário).Quando o formulário é enviado:
document.activeElement
fornecerá o botão de envio que foi clicado.document.activeElement.getAttribute('value')
fornecerá o valor desse botão.fonte
Aqui está a abordagem que parece mais limpa para meus propósitos.
Primeiro, para toda e qualquer forma:
Quando esse evento de clique é acionado para um formulário, ele simplesmente registra o destino de origem (disponível no objeto de evento) para ser acessado posteriormente. É um traço bastante amplo, pois dispara para qualquer clique em qualquer lugar do formulário. Comentários de otimização são bem-vindos, mas suspeito que nunca causará problemas visíveis.
Em seguida,
$('form').submit()
você pode perguntar o que foi clicado pela última vez, com algo comofonte
return false
, enquanto esse método funciona corretamente, pois o clique é vinculado ao formulário em vez de seus filhos.... $(event.target))
, mas não pode editar porque edições deve ser> 6 caracteresUau, algumas soluções podem ficar complicadas! Se você não se importa em usar um global simples, aproveite o fato de o evento de clique no botão de entrada ser acionado primeiro. Pode-se filtrar ainda mais o seletor $ ('input') para um dos muitos formulários usando $ ('# myForm input').
fonte
Eu encontrei a melhor solução é
Isso não funciona apenas em entradas, mas também em tags de botão. Também obtém o ID do botão.
fonte
$(document.activeElement).attr('id')
retorno do manipulador de envioundefined
Outra solução possível é adicionar um campo oculto no seu formulário:
Em seguida, na função ready, adicione funções para registrar qual tecla foi pressionada:
Agora, no manipulador de envio de formulários, leia a variável oculta e decida com base nela:
fonte
Com base no que Stan e yann-h fizeram, esse padrão é o primeiro botão. A vantagem dessa abordagem geral é que ela captura o clique e a tecla Enter (mesmo que o foco não estivesse no botão. Se você precisar permitir a inserção no formulário, basta responder quando o botão estiver focado ( ou seja, a resposta de Stan.) No meu caso, eu queria permitir que o enter enviasse o formulário, mesmo que o foco atual do usuário estivesse na caixa de texto.
Eu também estava usando um atributo 'name' em vez de 'id', mas esta é a mesma abordagem.
fonte
Este funcionou para mim
fonte
Se o que você quer dizer com não adicionar um evento .click é que não deseja ter manipuladores separados para esses eventos, você pode manipular todos os cliques (envios) em uma função:
fonte
event.preventDefault
ou faça algo parecidoinput.parents("form")[0].submit()
.Como não posso comentar sobre a resposta aceita, trago aqui uma versão modificada que deve levar em conta elementos que estão fora do formulário (ou seja: anexados ao formulário usando o
form
atributo). Isso é para o navegador moderno: http://caniuse.com/#feat=form-attribute . Oclosest('form')
é usado como um substituto para oform
atributo não suportadofonte
"button,[type=submit]"
adicionar campo oculto
fonte
button[type=submit]
einput[type=image]
.Para mim, as melhores soluções foram estas:
fonte
Trabalhando com esta excelente resposta , você pode verificar o elemento ativo (o botão), anexar uma entrada oculta ao formulário e, opcionalmente, removê-la no final do manipulador de envio.
Nota lateral: eu adiciono pessoalmente a turma
form-js
em todos os formulários enviados via JavaScript.fonte
Semelhante à resposta de Stan, mas:
fonte
Esta é a solução usada por mim e funciona muito bem:
fonte
Isso me ajudou a https://stackoverflow.com/a/17805011/1029257
Formulário enviado somente após o clique no botão Enviar.
fonte
Aqui está a minha solução:
fonte
Também fiz uma solução e funciona muito bem:
usa jQuery e CSS
Primeiro, criei uma classe CSS rápida, que pode ser incorporada ou em um arquivo separado.
Em seguida, no evento de clique de um botão no formulário, adicione a classe CSS ao botão. Se o botão já tiver a classe CSS, remova-o. (Não queremos duas classes CSS [apenas no caso]).
Agora, teste o botão para ver se ele tem a classe CSS; se o botão testado não tiver o CSS, o outro botão terá.
Espero que isto ajude! Felicidades!
fonte
button[type=submit]
einput[type=image]
.hasClass()
eremoveClass()
são redundantes, poisaddClass()
não adicionarão a mesma classe duas vezes.Você pode criar o tipo de entrada = "oculto" como titular das informações de identificação do botão.
Nesse caso, o formulário passa o valor "1" (id do seu botão) ao enviar. Isso funciona se onClick ocorrer antes de enviar (?), O que não tenho certeza se é sempre verdade.
fonte
Uma maneira simples de distinguir qual <button> ou <input type = "button" ...> é pressionado é verificando seu 'id':
fonte
Aqui está uma amostra que usa this.form para obter o formulário correto no qual o envio está inserido e campos de dados para armazenar o último elemento clicado / focado. Também agrupei o código de envio dentro de um tempo limite para garantir que os eventos de clique aconteçam antes de serem executados (alguns usuários relataram nos comentários que no Chrome algumas vezes um evento de clique é acionado após o envio).
Funciona ao navegar com as teclas e com o mouse / dedos sem contar com os navegadores para enviar um evento de clique na tecla RETURN (embora não doa), adicionei um manipulador de eventos para eventos de foco de botões e campos.
Você pode adicionar botões do tipo = "enviar" aos itens que se salvam quando clicados.
Na demonstração, defino uma borda vermelha para mostrar o item selecionado e um alerta que mostra nome e valor / rótulo.
Aqui está o FIDDLE
E aqui está o (mesmo) código:
Javascript:
DUMMY HTML:
DUMB CSS:
fonte
Eu escrevo esta função que me ajuda
e depois use
fonte
fonte
Você deseja usar window.event.srcElement.id assim:
para um botão parecido com:
você receberá um alerta que diz: "o item clicado era myButton.
No seu exemplo aprimorado, você pode adicionar window.event.srcElement a process_form_submission e terá uma referência a qualquer elemento que invocou o processo.
fonte