Próbuję znaleźć wartość przycisku przesyłania, który spowodował przesłanie formularza
$("form").submit(function() {
});
Mógłbym prawdopodobnie uruchomić zdarzenie $ ("input [type = submit]"). Click () dla każdego przycisku i ustawić jakąś zmienną, ale wydaje się to mniej eleganckie niż wyciągnięcie przycisku z formularza podczas przesyłania.
formobj.submit()
. Myślę, że zdarzenia związane z kliknięciami są do zrobienia.event.submitter
który daje kliknięcie<button>
lub<input type="submit">
.Odpowiedzi:
Wykorzystałem,
document.activeElement
jak naszkicowałem w tej odpowiedzi: Jak uzyskać skoncentrowany element za pomocą jQuery?Korzystam z tego, że przycisk jest zawsze aktywnym elementem po kliknięciu. To nie zadziała, jeśli zrobisz to
blur()
zaraz po kliknięciu.@Doin zauważył kolejną wadę. Jeśli użytkownik prześle formularz
enter
w polu tekstowym,document.activeElement
opcja nie jest ustawiona. Musisz sam na to uważać, obsługująckeypress
zdarzenia w programieinput[type="text"]
i tym podobne.Aktualizacja 2017-01: W mojej bibliotece Hyperform zdecydowałem się nie używać,
activeElement
ale przechwytywać wszystkie zdarzenia, które prowadzą do przesłania formularza. Kod do tego znajduje się na Github.Jeśli zdarzy ci się użyć Hyperform, w ten sposób uzyskasz dostęp do przycisku, który uruchomił przesyłanie:
źródło
activeElement
, ponieważ „przesyłającego” można zdefiniować: A. Poprzez autentyczną aktywację kliknięciem (kliknięcie bezpośrednio myszą lub klawiaturą Spacja / Enter); B. Poprzez aktywację kliknięciem syntetycznym (buttonElement.click()
lubbuttonElement.dispatch(new MouseEvent(...))
bez sprawdzania ostrości); C. niejawne poddanie się przez formularz (interakcja klawiatury z polem innego formularza) D. do żadnego, kiedyformElement.submit()
Wdrożyłem to i przypuszczam, że to wystarczy.
i to jest zdarzenie przycisku przesyłania, które go konfiguruje
Dzięki za odpowiedzi, ale to nie jest strasznie nieeleganckie ...
źródło
doNotSubmit
klasę, wewnątrz funkcji przesyłania sprawdzić, czy klasa nie istnieje (w przeciwnym razie nie przesyłaj), wewnątrz zdarzenia click usuń klasę formularzadoNotSubmit
i wykonaj $ (''. MyForm '). Trigger ('Zatwierdź'); po dodaniu wartości przycisku przesyłania jako ukrytego polaStworzyłem formularz testowy i używając Firebuga znalazłem w ten sposób, aby uzyskać wartość;
Niestety tylko Firefox obsługuje to zdarzenie.
źródło
submitter
Zdarzenie przesyłania zawiera teraz standardową właściwość.Już zaimplementowano w Firefoksie 75 !
W przypadku przeglądarek, które go nie obsługują, użyj tego wypełnienia :
źródło
Oto podejście, które wydaje się czystsze dla moich celów.
Po pierwsze, dla wszystkich formularzy:
Gdy to zdarzenie kliknięcia jest uruchamiane dla formularza, po prostu rejestruje pierwotny cel (dostępny w obiekcie zdarzenia), aby uzyskać do niego dostęp później. To dość szerokie pociągnięcie, ponieważ będzie uruchamiane po każdym kliknięciu w dowolnym miejscu formularza. Komentarze dotyczące optymalizacji są mile widziane, ale podejrzewam, że nigdy nie spowoduje to zauważalnych problemów.
Następnie w $ ('form'). Submit (), możesz zapytać, co zostało ostatnio kliknięte, na przykład
źródło
Zgodnie z tym linkiem obiekt Event zawiera pole
Event.target
, które:Zwraca ciąg znaków reprezentujący obiekt, który zainicjował zdarzenie.
Właśnie utworzyłem stronę sprawdzającą, jaka jest ta wartość i wygląda na to, że reprezentacja dotyczy samego formularza, a nie klikniętego przycisku. Innymi słowy, JavaScript nie zapewnia możliwości określenia klikniętego przycisku.
Jeśli chodzi o rozwiązanie Dave'a Andersona , dobrym pomysłem może być przetestowanie go w wielu przeglądarkach przed użyciem. Możliwe, że to zadziała, ale nie mogę powiedzieć ani jednej drogi.
źródło
target
Powraca cały formularz. Dlatego niestety nie pomaga wykryć właściwego przycisku przesyłania.Event.target
nie jest ciągiem. Jest toEventTarget
obiekt, który w tym przypadku jest samym przesłanym formularzem.Jednym prostym podejściem jest użycie zdarzenia click na każdym przycisku formularza. Poniżej znajduje się formularz html z przyciskami Zapisz, Anuluj i Usuń:
Poniżej znajduje się jQuery. Wysyłam odpowiednią „akcję” do tej samej funkcji serwera w zależności od tego, który przycisk został kliknięty („zapisz” lub „usuń”). Po kliknięciu przycisku „anuluj” po prostu ponownie ładuję stronę.
źródło
Szukałem i znalazłem kilka sposobów na otrzymanie przycisku przesyłania
name
+value
wysłanego do serwera za pomocą jQuery + AJAX. Nie bardzo mi się podobały ...Jednym z najlepszych było zaprezentowane tutaj rozwiązanie myśliwskie!
Ale sam napisałem inny.
Chcę się udostępnić, ponieważ jest dobry i, jak potrzebowałem, działa również z formularzami ładowanymi przez ajax (po document.ready):
Prosty! Po kliknięciu przycisku przesyłania ukryte pole jest dodawane do formularza za pomocą tego samego przycisku
name
ivalue
przycisku przesyłania.EDYCJA: Poniższa wersja jest bardziej czytelna. Dba również o usunięcie dołączonych wcześniej pól ukrytych (w przypadku dwukrotnego przesłania tego samego formularza, co jest doskonale możliwe przy wykorzystaniu AJAX).
Ulepszony kod:
źródło
<button/>
mają ten samname
atrybut. Użyłbym klasy i odniósłbym się do tego w twoim.remove()
.name
atrybutu. Jeśli formularz jest używany ponownie i zawiera dane wejściowe przesyłania z różnymi nazwami, stare dane wejściowe mogą zaśmiecać formularz.<button/>
elemencie, podczas gdy<input type="submit" />
jest on używany w kodzie ...)Wypróbowałem niektóre z podanych przykładów, ale nie działały one dla naszych celów.
Oto skrzypce do pokazania: http://jsfiddle.net/7a8qhofo/1/
Miałem podobny problem i tak rozwiązaliśmy ten problem w naszych formularzach.
źródło
(wydarzenie)
źródło
możesz spróbować w ten sposób z „event.originalEvent.x” i „event.originalEvent.y”:
źródło
Wydaje się, że jQuery nie dostarcza tych danych w zdarzeniu przesyłania. Wygląda na to, że zaproponowana przez Ciebie metoda jest najlepszym rozwiązaniem.
źródło
Po prostu inne rozwiązanie, ponieważ żadne inne nie spełniało moich wymagań. Zaletą jest to, że wykrywane są kliknięcia i naciśnięcia klawiszy (enter i spacja) .
To działało najlepiej dla mnie.
źródło
W przypadku bardziej szczegółowej procedury obsługi zdarzeń i JQuery, obiekt zdarzenia jest klikany. W razie potrzeby możesz również pobrać formularz delegowania z tego wydarzenia.
Ten dokument zawiera wszystko, czego potrzebujesz, aby rozpocząć. JQuery Doc .
źródło
Piszę tę funkcję, która mi pomaga
a następnie Użyj
źródło
Istnieje właściwość przesyłającego dla SubmitEvent formularza . Jednak w chwili obecnej nie działa to w przeglądarce Safari.
Inne podejście, które działa w różnych przeglądarkach. Musisz jednak polegać na
form
elemencie zamiast naevent
obiekcie. Zasadniczo dodaje to właściwość „przesyłający” do obiektu elementu formularza, do którego można się później odwołać podczas przesyłania formularza.źródło