2011-11-18 14 views
10

Mam element <button> wewnątrz którego mam 2 <span> elementów. Mam 2 dołączone moduły obsługi zdarzeń kliknięcia jquery dla każdego z elementów zakresu, dzięki czemu mogę robić, co mi się podoba przy każdym kliknięciu. Oto krótkie spojrzenie kodu podstawowego:Zdarzenie jQuery bulgotanie na przycisku nie działa zgodnie z oczekiwaniami w przeglądarce Firefox

HTML

<button> 
    <span>Text1</span> 
    <span>Text2</span> 
</button> 

JavaScript

$(function() { 
    $('button').bind('click', function() { 
     console.log('button clicked'); 
    }); 
    $('button > span:eq(0)').bind('click', function() { 
     console.log('text1 span clicked'); 
    }); 
    $('button > span:eq(1)').bind('click', function() { 
     console.log('text2 span clicked'); 
    }); 
}); 

To wszystko działa dobrze w Chrome i zdarzenie click jest ujęte w odpowiedniej kolejności : najpierw na dowolnym z elementów span, a następnie bąbelki zdarzeń do elementu przycisku nadrzędnego.

Problem polega na tym, że w programie Firefox zdarzenie click nie uruchamia się dla żadnego z elementów span, tylko procedura obsługi zdarzeń przycisku rejestruje zdarzenie jako wyrzucone.

Oto skrzypce, dzięki czemu można zobaczyć, co mam na myśli: http://jsfiddle.net/spider/RGL7a/2/

Dzięki

+0

Zgaduję, że to nigdy nie zostało rozwiązane? – Shane

+0

@Shane Niestety nie i z tego, co widziałem, może nigdy nie być, ponieważ nadal nie działa w najnowszej wersji Firefoksa. Ramy takie jak Bootstrap robią to za pomocą [dwóch oddzielnych przycisków] (http://getbootstrap.com/components/#btn-dropdowns-split). Inne frameworki, jak Fundacja czy YUI, używają zupełnie innych znaczników do symulacji ** funkcji podzielonego przycisku ** ([Przykład Foundation] (http://foundation.zurb.com/docs/components/split_buttons.html) i [YUI Example ] (http://yuilibrary.com/yui/docs/node-menunav/node-menunav-4.html)). – Bogdan

+0

Zwykle używam Boostrap dla tego rodzaju funkcjonalności i tam, gdzie to nie jest opcja, używam ich strategii, ponieważ wydaje się ona najlepsza pod względem semantycznego znacznika. – Bogdan

Odpowiedz

3

Prostym rozwiązaniem byłoby wykorzystanie elementu <div> zamiast elementu przycisku. Umieść wspólny kod, który chcesz wypalić, w funkcję, a następnie uruchom funkcję po kliknięciu jednego z zakresów oraz unikalnym kodzie. Jeśli chcesz być bardziej 508 zgodny można dokonać przęseł do <a> tagów (lub nawet <button> tagów.

Oczywiście, że nie wyjaśnia obsługi zdarzeń FF, ale to może być szybsza droga.

+0

Dziękuję Ben za sugestię. Tak, to, co mówisz, jest alternatywnym rozwiązaniem problemu, którego mam świadomość i działa. Wciąż wolałabym (jeśli to możliwe) używać "przycisku" zamiast "div" jako elementu nadrzędnego, ponieważ wydaje się bardziej czytelny i semantycznie poprawny, aby mieć przycisk z 2 akcjami (jeden podstawowy i jeden wtórny), a nie mający div z 2 przyciskami w środku. Zwłaszcza, że ​​moje reguły css stylizują go jako dowolny z moich zwykłych przycisków (pojedynczej akcji), podzielonych przez pionowy separator. Jeśli nie znajdę żadnego rozwiązania, będę musiał zrobić ten kompromis i pójść z divami. Jeszcze raz dziękuję – Bogdan

-1

Spróbuj zmienić

<button> to <button type="button"> 

to powinno rozwiązać problem nietoperza. powodem jej nie działa dlatego, że jej po drodze z domyślnym działaniem przycisku, który ma przedłożyć tj. BUTTON musiałby return false w javascript aby odczytał twoje kliknięcie, tak jakbyś próbował kliknąć link out ustawia domyślną akcję, aby zwrócić false.

Po dodaniu następującego kodu jQuery do pliku js powinno to również rozwiązać problem. Pamiętaj, aby dodać kod przed przyciskiem> Span click bind.

 <script type="text/javascript"> 
     $(function() { 
      $('button').click(function(){ 
       return false 
      }); 
     }); 
    </script>   

Mam nadzieję, że to pomoże.

-D

+0

Dziękuję za sugestie, ale żadna z nich nie rozwiązuje problemu (zanim napisałem pytanie, spróbowałem "type =" button "", ale nie włączyłem go do mojego przykładu, ponieważ nie miało to znaczenia). Wydaje się, że problem w Firefoksie polega na tym, że zdarzenie click jest przechwytywane tylko przez element 'button', a nie przez elementy potomne. – Bogdan

Powiązane problemy