2010-09-07 12 views
5

Mam funkcji, które używam, aby zapobiec wielu postbacks o postaci:Jak mogę znaleźć przycisk, który został kliknięty w zdarzeniu przesyłania formularza w jquery?

var submitted = false; 
$(function() { 
    $('form').bind('submit', function(e) { 
     if (!submitted && CanSubmit(e)) { 
      submitted = true; 
      return true; 
     } else { 
      return false; 
     } 
    }); 
}); 

W metodzie CanSubmit muszę przesłuchać przycisk, który został kliknięty w celu ustalenia, czy powinienem pozwolić złożyć lub nie .

Należy pamiętać, że nie można powiązać z konkretnymi zdarzeniami kliknięcia - więcej szczegółów w artykule this previous question.

W przeglądarce Firefox mogę używać e.originalEvent.explicitOriginalTarget, ale najwyraźniej nie jest to dostępne w IE.

Jak uzyskać tę wartość z parametru e w trybie przeglądarki?

+0

Czy funkcja CanSubmit jest funkcją sprawdzania poprawności? Dlaczego obchodzi cię, jaki przycisk został naciśnięty? Czy masz więcej niż jeden przycisk w danym formularzu? – Scott

+0

Nie, to ostatecznie funkcja określenia, który przycisk został naciśnięty. Dbam o to, ponieważ niektóre przyciski powodują, że posty są w porządku (anuluj, dom itp.), Podczas gdy inne powodują, że posty nie są (przesyłaj, edytuj itp.). Tak, mam więcej niż jeden przycisk w formularzu. – Damovisa

Odpowiedz

2

Właściwie można po prostu zamienić $('form').bind('submit' na $(':submit').bind('click', a Twój kod będzie działał równie dobrze (możesz użyć this, aby zobaczyć, co zostało kliknięte).

+0

Pytanie brzmi: * "Zauważ, że nie mogę powiązać z konkretnymi zdarzeniami kliknięcia" * – user113716

+0

To prawda - powiązanie z przyciskiem zakłada, że ​​tylko przyciski powodują przesłanie formularza – Damovisa

+0

@Damovisa, tak, i to jest poprawne założenie . Tylko przesyłaj przyciski mogą spowodować wysłanie formularza (lub wywołania javascript submit(), ale prawdopodobnie masz pod kontrolą). Prawidłowym selektorem dla nich jest ': submit', a nie': button', jednak - naprawiłem to. – Tgr

2

Użyj e.target - jQuery normalizes it dla spójności krzyżowej przeglądarki.

Najbliższą rzeczą, jaką mogłem znaleźć dla explicitOriginalTarget był document.activeElement (dla IE) - jest to element, który miał fokus podczas imprezy. Nie ma odpowiednika dla przeglądarek opartych na webkitach. Więc nie, nie ma prawdziwego sposobu krzyżowej przeglądarki, aby to zrobić tylko z obiektem zdarzenia.

+0

W procedurze 'submit()' 'e.target' będzie odnosić się do'

'nawet po kliknięciu przycisku wysyłania. Oto przykład: http://jsfiddle.net/zHbrC/ – user113716

+0

@patrick dw: Dziękuję, właśnie to testowałem.Przypuszczam, że zdarzenie nie zostało faktycznie wyrzucone z przycisku przesyłania. –

2

Dlaczego nie anulujesz powiązania funkcji przesyłania, gdy przesyłasz? Będzie to gwarantuje tylko jedno zgłoszenie:

$(function() { 
    $('form').bind('submit', function(event) { 
      // regular submit form stuff here 
     ... 
      // and unbind it 
     $('this').unbind(event);  
    }); 
}); 

Zamówienie .unbind() pod „Używanie obiekt zdarzenia”

lub, jak Matt Ball zauważył w komentarzach, można użyć .one(), który jest odpowiednik powyższego.

$(function() { 
    $('form').one('submit', function(event) {   // <== Only executed once 
      // regular submit form stuff here 
     ... 
    }); 
}); 

Jeśli masz przedstawienie postaci związanej z wielu zdarzeń/elementów z $.post() lub $.get(), a potem po prostu trzeba upewnić się rozpiąć handler że kończy się stosować od wewnątrz siebie przy użyciu obiektu event i następnie usuń wszystkie pozostałe programy obsługi i na odwrót dla każdej z tych innych procedur obsługi. Możesz rozpiąć pozostałe moduły obsługi, używając one of about four methods to unbind event handlers.

+0

Lepszy sposób zagwarantowania wykonania pojedynczego zdarzenia obsługi zdarzenia: ['jQuery.one()'] (http://api.jquery.com/one). –

+0

@Matt - Ładna sugestia. Nie wiem, jak jest lepiej, są one równoważne zgodnie z dokumentacją '.one()'. –

+0

Oczywiście, są one równoważne, dlaczego nie zastosować specjalnie skonstruowanej metody? Jest jaśniejszy (IMO) i bardziej zwięzły. W każdym razie, nie zamierzałem wdawać się w debatę na ten temat - po prostu zwykłe "używaj tego, co zostało już stworzone". –

0

Dlaczego nie używać funkcji .one, gwarantuje, że wystrzeliwuje tylko jeden raz.

$(function() { 
    $('form').one('submit', function(event) { 
     // regular submit form stuff here  
    }); 
}); 
+0

Hmm, fajny pomysł, ale myślę, że to może być przeciwieństwo tego, czego potrzebuję - formularz zostanie przesłany, chyba że go zatrzymam, więc będę musiał uruchomić tę funkcję za każdym razem * oprócz * za pierwszym razem. – Damovisa

Powiązane problemy