Mam .submit()
skonfigurowane wydarzenie do przesłania formularza. Mam również wiele formularzy na stronie, ale tylko jeden tutaj dla tego przykładu. Chciałbym wiedzieć, który przycisk przesłania został kliknięty bez przypisania .click()
zdarzenia do każdego z nich.
Oto konfiguracja:
<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>
Czy oprócz zastosowania zdarzenia .click () do każdego przycisku można ustalić, który przycisk przesłania został kliknięty?
name
?Odpowiedzi:
Zadałem to samo pytanie: Jak mogę uzyskać przycisk, który spowodował przesłanie ze zdarzenia przesłania formularza?
W końcu wymyśliłem to rozwiązanie, które zadziałało całkiem nieźle:
W przypadku wielu formularzy może być konieczne trochę poprawienie tego, ale powinno nadal obowiązywać
źródło
Odkryłem, że to zadziałało.
źródło
To działa dla mnie:
źródło
id
zactiveElement
zrobiłem$(document.activeElement).attr('id');
document.activeElement.id
document.activeElement
nie ma danych wejściowych. W moim przypadku jest to modalny div (który zawiera formularz).Po przesłaniu formularza:
document.activeElement
wyświetli kliknięty przycisk Prześlij.document.activeElement.getAttribute('value')
da ci wartość tego przycisku.źródło
Oto podejście, które wydaje się czystsze dla moich celów.
Po pierwsze, dla wszystkich form:
Kiedy to zdarzenie kliknięcia jest uruchamiane dla formularza, po prostu rejestruje docelowy cel (dostępny w obiekcie zdarzenia), aby uzyskać do niego dostęp później. Jest to dość szeroki obrys, ponieważ będzie uruchamiany za każde kliknięcie w dowolnym miejscu formularza. Komentarze dotyczące optymalizacji są mile widziane, ale podejrzewam, że nigdy nie spowoduje to zauważalnych problemów.
Następnie
$('form').submit()
możesz zapytać o to, co zostało ostatnio kliknięte, za pomocą czegoś takiegoźródło
return false
, podczas gdy ta metoda działa poprawnie, ponieważ kliknięcie jest powiązane z formularzem zamiast jego elementów potomnych.... $(event.target))
ale nie można go edytować, ponieważ zmiany muszą zawierać> 6 znakówWow, niektóre rozwiązania mogą się skomplikować! Jeśli nie masz nic przeciwko użyciu prostej globalnej, po prostu skorzystaj z faktu, że zdarzenie kliknięcia przycisku wejściowego uruchamia się jako pierwsze. Można dodatkowo przefiltrować selektor $ („input”) pod kątem jednej z wielu form, używając $ („# myForm input”).
źródło
Znalazłem najlepsze rozwiązanie
Działa to nie tylko na wejściach, ale także na znacznikach przycisków. Pobiera także identyfikator przycisku.
źródło
$(document.activeElement).attr('id')
zwrotów zwracaundefined
Innym możliwym rozwiązaniem jest dodanie ukrytego pola w formularzu:
Następnie w funkcji gotowości dodaj funkcje, aby zapisać, który klawisz został naciśnięty:
Teraz w formularzu procedury obsługi przesyłania odczytaj ukrytą zmienną i zdecyduj na jej podstawie:
źródło
Opierając się na tym, co zrobili Stan i yann-h, ale domyślnie jest to pierwszy przycisk. Piękno tego ogólnego podejścia polega na tym, że podnosi zarówno kliknięcie, jak i klawisz enter (nawet jeśli fokus nie był na przycisku. Jeśli musisz zezwolić na enter w formularzu, po prostu odpowiedz na to, gdy przycisk jest aktywny ( tj. odpowiedź Stana). W moim przypadku chciałem pozwolić Enter na przesłanie formularza, nawet jeśli użytkownik aktualnie skupił się na polu tekstowym.
Użyłem również atrybutu „name” zamiast „id”, ale jest to to samo podejście.
źródło
Ten działał dla mnie
źródło
Jeśli masz na myśli to, że nie dodajesz zdarzenia .click, że nie chcesz mieć osobnych modułów obsługi tych zdarzeń, możesz obsłużyć wszystkie kliknięcia (przesłania) w jednej funkcji:
źródło
event.preventDefault
lub zrób coś podobnegoinput.parents("form")[0].submit()
.Ponieważ nie mogę skomentować zaakceptowanej odpowiedzi, wprowadzam tutaj zmodyfikowaną wersję, która powinna uwzględniać elementy spoza formularza (tj. Dołączone do formularza za pomocą
form
atrybutu). Dotyczy to nowoczesnej przeglądarki: http://caniuse.com/#feat=form-attribute .closest('form')
Jest użyta w niewspieranychform
atrybutuźródło
"button,[type=submit]"
dodaj ukryte pole
źródło
button[type=submit]
iinput[type=image]
.Dla mnie najlepsze rozwiązania były następujące:
źródło
Pracując z tą doskonałą odpowiedzią , możesz sprawdzić aktywny element (przycisk), dołączyć ukryte dane wejściowe do formularza i opcjonalnie usunąć je na końcu procedury obsługi przesyłania.
Uwaga dodatkowa: Osobiście dodaję klasę
form-js
do wszystkich formularzy przesyłanych przez JavaScript.źródło
Podobna do odpowiedzi Stana, ale:
źródło
Oto rozwiązanie, z którego korzystam i działa bardzo dobrze:
źródło
Pomogło mi https://stackoverflow.com/a/17805011/1029257
Formularz przesłany dopiero po kliknięciu przycisku Prześlij.
źródło
Oto moje rozwiązanie:
źródło
Stworzyłem również rozwiązanie, które działa całkiem dobrze:
używa jQuery i CSS
Najpierw stworzyłem szybką klasę CSS, którą można osadzić lub w osobnym pliku.
Następnie w przypadku zdarzenia kliknięcia przycisku w formularzu dodaj klasę CSS do przycisku. Jeśli przycisk ma już klasę CSS, usuń ją. (Nie chcemy dwóch klas CSS [na wszelki wypadek]).
Teraz przetestuj przycisk, aby zobaczyć, że ma klasę CSS, jeśli testowany przycisk nie ma CSS, to zrobi to drugi przycisk.
Mam nadzieję że to pomoże! Twoje zdrowie!
źródło
button[type=submit]
iinput[type=image]
.hasClass()
iremoveClass()
są nadmiarowe, ponieważaddClass()
nie dodają dwukrotnie tej samej klasy.Możesz utworzyć typ danych wejściowych = „ukryty” jako uchwyt informacji o identyfikatorze przycisku.
W takim przypadku formularz przekazuje wartość „1” (identyfikator przycisku). Działa to, jeśli onClick występuje przed przesłaniem (?), Czego nie jestem pewien, czy zawsze jest to prawda.
źródło
Prostym sposobem na rozróżnienie, który przycisk <lub przycisk <typ wejścia = „przycisk” ...> jest wciśnięty, jest sprawdzenie jego „id”:
źródło
Oto przykład, który używa this.form, aby uzyskać prawidłową formę, w której jest przesyłane, oraz pola danych do przechowywania ostatniego klikniętego / skupionego elementu. Owinąłem również kod wysyłania w ramach limitu czasu, aby mieć pewność, że zdarzenie kliknięcia nastąpi przed jego wykonaniem (niektórzy użytkownicy zgłaszali w komentarzach, że w Chrome czasami zdarzenie kliknięcia jest uruchamiane po przesłaniu).
Działa podczas nawigacji zarówno za pomocą klawiszy, jak i myszy / palców, nie licząc na przeglądarki, aby wysłać zdarzenie kliknięcia na klawisz RETURN (choć nie boli), dodałem moduł obsługi zdarzeń dla zdarzeń fokusa dla przycisków i pól.
Możesz dodać przyciski typu = "prześlij" do elementów, które oszczędzają się po kliknięciu.
W wersji demo ustawiłem czerwoną ramkę, aby pokazać wybrany element oraz alert pokazujący nazwę i wartość / etykietę.
Oto FIDDLE
A oto (ten sam) kod:
JavaScript:
DUMMY HTML:
DUMB CSS:
źródło
Piszę tę funkcję, która mi pomaga
a następnie użyj
źródło
źródło
Chcesz użyć window.event.srcElement.id w następujący sposób:
dla przycisku, który wygląda następująco:
otrzymasz ostrzeżenie o treści: „kliknięty element to myButton.
W ulepszonym przykładzie możesz dodać window.event.srcElement do process_form_submission, a będziesz mieć odniesienie do dowolnego elementu, który wywołał proces.
źródło