2012-09-07 17 views
99

Ta logika uruchamia się po naciśnięciu "Enter" na wejściu "Ilość" i nie wierzę, że powinna (nie ma w Chrome) . Jak mogę temu zapobiec, a jeśli nie, to zapobiec w IE, obsłużyć go tak, aby logika w zdarzeniu kliknięcia nie uruchomi się.Przycisk Zdarzenie uruchamia się po naciśnięciu klawisza Enter na różnych wejściach (bez formularzy).

<html> 
<body> 
    <div id="page"> 
    <div id="financed_amount"> 
     <h1>Financed Amount:</h1> 
     <input type="text" id="amount" value="" /> 
    </div> 
    <h1>Finance Options</h1> 
    <div> 
     <a id="shareLink" rel="leanModal" name="email" href="#email"></a> 
     <button id="btnShare" class="share">Share this report</button> 
    </div> 
    </div> 
    </body> 
</html> 

Script

$("#btnShare").click(function (e) { 
    // This logic is firing when pressing "Enter" in the "Amount" input 
}); 
  • Jquery: 1.7.2
  • IE 9
  • (działa w Chrome)
+1

Wbrew pozorom przydarzyło mi się to w Chrome i Firefoksie. Ta sama poprawka (typ przycisku). –

Odpowiedz

287

miałem ten sam problem i rozwiązać go dodając type="button" atrybut elementu <button>, przez który IE myśli przycisk jako prosty przycisk zamiast przycisku przedstawienia (co jest domyślne zachowanie elementu <button>).

+5

Miałem ten sam problem z Firefoksem. atrybut type = "button" również rozwiązał go dla mnie. –

+94

Obyś żył tysiąc lat. – TheBrain

+4

Doskonała poprawka. Myślałem, że przeglądarki będą automatycznie przesyłać na "Enter", gdy wewnątrz tagów

. Ale widzę, że się myliłem. –

2

IE myśli każdy element jest buttonPrześlij przycisk (niezależnie od tego, czy masz numer form, czy nie). Obsługuje także naciśnięcie klawisza Enter w elemencie formularza jako niejawne przesłanie formularza. Tak więc, ponieważ sądzi, że próbujesz przesłać formularz, oznacza to, że pomoże Ci wydarzenie i wystrzelenie z niego (prawdopodobnie jest) przycisku przesyłania.

Możesz dołączyć zdarzenie keyup albo do input lub button i sprawdzić klucza Enter (e.which === 13) i return false;

27

wpadłem na ten problem dzisiaj. IE zakłada, że ​​jeśli naciśniesz klawisz Enter w dowolnym z pól tekstowych, chcesz przesłać formularz - nawet jeśli pola nie są częścią formularza, a nawet jeśli przycisk nie jest typu "prześlij".

Musisz zastąpić domyślne zachowanie IE za pomocą funkcji preventDefault(). W selektorze jQuery wstaw div, który zawiera pola tekstowe, które chcesz zignorować klawiszem Enter - w Twoim przypadku div strony. Zamiast wybierać cały dział, możesz również określić pola tekstowe, które chcesz zignorować.

$('#page').keypress(function(e) { 
    if(e.which == 13) { // Checks for the enter key 
     e.preventDefault(); // Stops IE from triggering the button to be clicked 
    } 
}); 
+0

Najlepsze rozwiązanie, gdy musisz używać niestandardowych componetów i nie możesz dodać typu = "button". – FireZenk

+0

Dzięki Clinton, to działało dla mnie. Najpierw próbowałem zrobić cały przycisk typu "przycisk", ale nadal nie działa. Potem musiałem wyłączyć bulgotanie zdarzenia po naciśnięciu klawisza Enter. –

+0

Dziękuję bardzo. Szaleję na moim komputerze przez ostatnie 2 godziny. – Edwin

1

jQuery rozwiązanie oparte że robi to dla każdego przycisku to:

$('button').prop('type', 'button'); // To prevent IE from treating every button as a submit and firing a click() event 

Jednak zdarzenie click będzie nadal bubble do elementów nadrzędnych dla jakiegoś powodu ...

3

miałem ten problem z ASP.NET WebForms:

<asp:Button /> 

ten może być rozwiązany przez nie tylko dodanie type = „przycisk”, ponieważ ASP.NET zastępuje go type = „submit” (widać to zachowanie w przeglądarce jeśli skontrolować th Element e.)

Poprawny sposób to zrobić w ASP.NET jest dodanie

<asp:Button UseSubmitBehavior="false" /> 

przycisku. ASP automatycznie doda atrybut type = "button".

Powiązane problemy