Estou tentando encontrar o valor do botão de envio que acionou o formulário de envio
$("form").submit(function() {
});
Eu poderia disparar um evento $ ("input [type = submit]"). Click () para cada botão e definir alguma variável, mas isso parece menos elegante do que puxar o botão do formulário ao enviar.
formobj.submit()
. Acho que os eventos de clique são o caminho a percorrer.event.submitter
que mostra o<button>
ou<input type="submit">
que foi clicado.Respostas:
Eu aproveitei
document.activeElement
conforme esboçado nesta resposta: Como obter o elemento focado com jQuery?Aproveito o fato de que o botão é sempre o elemento em foco depois de clicar nele. Isso não funcionará se você fizer um
blur()
clique logo após o clique.@Doin identificou outra desvantagem. Se um usuário enviar o formulário por meio
enter
de um campo de texto, odocument.activeElement
não será definido. Você precisa ficar atento a isso sozinho, ao lidar comkeypress
eventos eminput[type="text"]
e semelhantes.Atualização 2017-01: Para minha biblioteca Hyperform , optei por não usar,
activeElement
mas capturar todos os eventos que levam ao envio do formulário. O código para isso está no Github.Se acontecer de você usar o Hyperform, é assim que você acessaria o botão que acionou o envio:
fonte
activeElement
, porque o "solicitante" pode ser definido: A. Via ativação de clique autêntico (clicado diretamente com o mouse ou teclado Espaço / Enter); B. Via ativação de clique sintético (buttonElement.click()
oubuttonElement.dispatch(new MouseEvent(...))
, sem alterar o foco); C. via submissão implícita do formulário (interação do teclado com o campo de outro formulário) D. para nenhum, quandoformElement.submit()
Eu implementei isso e suponho que funcionará.
e este é o evento do botão de envio que o configura
Obrigado pelas respostas, mas isso não é terrivelmente deselegante ...
fonte
doNotSubmit
classe, dentro da função submit, verifique se a classe não existe (caso contrário, não envie), dentro do evento click remova a classe do formuláriodoNotSubmit
e faça um $ (''. MyForm '). ('enviar'); após adicionar o valor do botão de envio como um campo ocultoCriei um formulário de teste e usando o Firebug encontrei essa forma de obter o valor;
Infelizmente, apenas o Firefox oferece suporte a este evento.
fonte
Aqui está uma abordagem que parece mais limpa para meus propósitos.
Primeiro, para todo e qualquer formulário:
Quando este evento de clique é disparado para um formulário, ele simplesmente registra o destino de origem (disponível no objeto de evento) para ser acessado posteriormente. Este é um traço bastante amplo, já que disparará com qualquer clique em qualquer lugar do formulário. Comentários de otimização são bem-vindos, mas suspeito que isso nunca causará problemas perceptíveis.
Então, em $ ('form'). Submit (), você pode consultar o que foi clicado por último, com algo como
fonte
Agora existe uma
submitter
propriedade padrão no evento de envio.Já implementado no Firefox 75 !
Para navegadores que não o suportam, use este polyfill :
fonte
De acordo com este link , o objeto Event contém um campo
Event.target
, que:Retorna uma string que representa o objeto que iniciou o evento.
Acabei de criar uma página testando qual é esse valor e parece que essa representação é para o formulário em si, não para o botão clicado. Em outras palavras, o Javascript não fornece a facilidade de determinar o botão clicado.
No que diz respeito à solução de Dave Anderson , pode ser uma boa ideia testar isso em vários navegadores antes de usá-lo. É possível que funcione bem, mas não posso dizer de nenhuma maneira.
fonte
target
retorna o formulário completo. Portanto, infelizmente não é útil detectar o botão de envio correto.Event.target
não é uma string. É umEventTarget
objeto, que neste caso é o próprio formulário enviado.Uma abordagem limpa é usar o evento click em cada botão do formulário. A seguir está um formulário html com botões para salvar, cancelar e excluir:
A seguir está o jquery. Eu envio a 'ação' apropriada para a mesma função do servidor dependendo de qual botão foi clicado ('salvar' ou 'excluir'). Se 'cancelar' for clicado, eu simplesmente recarrego a página.
fonte
Eu pesquisei e encontrei várias maneiras de obter o botão de envio
name
+value
enviado para o servidor usando jQuery + AJAX. Não gostei muito deles ...Um dos melhores foi a solução de hunter apresentada aqui!
Mas eu mesmo escrevi outro.
Quero compartilhar, porque é bom, e como precisei funciona também com forms carregados via ajax (após document.ready):
Simples! Quando o botão enviar é clicado, um campo oculto é adicionado ao formulário, usando o mesmo
name
evalue
do botão enviar.EDIT: A versão abaixo é mais fácil de ler. Além disso, ele se encarrega de remover campos ocultos anexados anteriormente (no caso de enviar o mesmo formulário duas vezes, o que é perfeitamente possível quando se usa AJAX).
Código aprimorado:
fonte
<button/>
s compartilharem o mesmoname
atributo. Eu usaria uma classe e me referiria a ela na sua.remove()
.name
atributo. Se o formulário for reutilizado e contiver entradas de envio com nomes diferentes, as entradas antigas podem confundir o formulário.<button/>
elemento, enquanto ele<input type="submit" />
é usado no código ...)Tentei alguns dos exemplos fornecidos, mas eles não funcionaram para nossos objetivos.
Aqui está um violino para mostrar: http://jsfiddle.net/7a8qhofo/1/
Eu me deparei com um problema semelhante e foi assim que resolvemos o problema em nossos formulários.
fonte
(evento)
fonte
você pode tentar desta forma com "event.originalEvent.x" e "event.originalEvent.y":
fonte
jQuery não parece fornecer esses dados no evento de envio. Parece que o método que você propôs é sua melhor aposta.
fonte
Apenas outra solução, já que nenhuma outra atendeu aos meus requisitos. A vantagem é que o clique e o pressionamento de tecla (enter e espaço) são detectados.
Isso funcionou melhor para mim.
fonte
Com um manipulador de eventos mais específico e JQuery, seu objeto de evento é o botão clicado. Você também pode obter o formulário de delegação deste evento, se necessário.
Este documento tem tudo que você precisa para começar. JQuery Doc .
fonte
Eu escrevo esta função que me ajuda
e então use
fonte