2009-02-25 9 views
19

mam rozwijana, które wyzwala wywołanie ajax po jego zmianie:jQuery zmiana() na <select> i firefox

$('.travel-to').change(function(){ 
    $.ajax({ 
     type: "GET", 
     url: "/inc/rates/rates-viewer.php", 
     data: "shtech=y&c_name="+escape($(this).val()), 
     success: function(html){ 
      $(".rates-viewer").html(html); 
      $(".rates-viewer tr.numbers td").css({ opacity: 0 }).fadeTo("slow",1); 
     } 
    }); 
}); 

Mój problem jest w Firefoksie, używając klawiszy góra/dół strzałek, aby przechodzić na liście rozwijanej Opcje, nie uruchamia zdarzenia js onChange(). W IE jest OK.

Jak ustawić przeglądarkę Firefox jako kursory góra/dół jako onChange? Czy mogę zrobić jedno z tych wydarzeń lub wydarzenie, aby wywołać jedno lub więcej naciśnięć klawisza?

Dzięki.

Odpowiedz

26

W rzeczywistości korzystasz z błędu w IE. Firefox obsługuje onChange poprawnie, ponieważ nie powinien być uruchamiany, dopóki przeglądarka nie straci fokusu w polu wyboru. (I answered a question wczoraj o tym problemie w rzeczywistości.) To jest naprawdę niebezpieczne przy użyciu opcji Zmień z wybranym, zwłaszcza, że ​​nie ma sposobu, aby użytkownicy klawiatur tylko pomijali niektóre opcje. (Na początku, że kółka myszy wydaje spin przez wiele odpowiedzi, ale faktycznie pożary onChange dla każdego wpisu przechodzi przez na IE.)

Jeśli naprawdę chcesz zdarzenia na ogień, gdy ktoś naciśnie się lub w dół, chciałbym podłączyć się do zdarzeń onKeyPress lub onKeyDown, aby strzelać po naciśnięciu klawisza "w górę" lub "w dół".

+3

to dzieje się do mnie było dobrze. Wydarzenie "Zmiana" uruchamia się poprawnie w Safari, Chrome i IE. Wygląda na to, że stanie się standardową funkcjonalnością tego wydarzenia, gdy ogień się zmieni, nie po tym, jak straci ostrość; po to jest właśnie "focusout". Znowu może to zostać wprowadzone niedawno w nowoczesnych przeglądarkach, tak czy inaczej FF powinna przyjąć tę zmianę. – russjman

+0

Rozwiązuję ten problem, dodając po prostu przycisk "Przejdź" obok pola wyboru, aby użytkownik miał pełną kontrolę. – BradGreens

2

Może zamiast używać zdarzenia change() należy użyć zdarzenia blur() i sprawdzić, czy zmieniono wartość?

FYI, nie testowałem tego, tylko pomysł, który miałem. i nie jestem pewien, czy jest to pożądany efekt, ponieważ spowodowałoby to utratę skupienia, ale sugeruję, aby zachować efekt spójny w różnych przeglądarkach.

var currentValue; 

$('.travel-to').blur(function(){ 
    var val = $(this).val(); 
    if (currentValue != val) { 
     currentValue = val; 
     $.ajax({ 
      type: "GET", 
      url: "/inc/rates/rates-viewer.php", 
      data: "shtech=y&c_name="+escape(currentValue), 
      success: function(html){ 
       $(".rates-viewer").html(html); 
       $(".rates-viewer tr.numbers td").css({ opacity: 0 }).fadeTo("slow",1); 
      } 
     }); 
    } 
}); 
+0

to nie działa dobrze, ponieważ musisz kliknąć coś jeszcze przed pożarem (najmniej w Chrome i FF3.6) - po prostu wypróbowałem tę metodę – Evgeny

1

Właśnie doświadczyłem niektóre dziwne zachowanie w Firefox, który umożliwia użytkownikowi wybrać, aby otworzyć listę rozwijaną, nawigować za pomocą strzałek, a następnie zamiast tabbing się lub kliknięcie na stronie użytkownik może kliknąć kolejny element, który będzie w wyniku zmiany wybranej wartości bez wystrzeliwania zdarzenia change.

Aby obejść ten problem, można wywołać change, gdy zdarzenie keyup (proszę również zasugerować inne zdarzenia?) Zostanie uruchomione, a wybór ma inną wartość niż poprzednia.

var selectRegistry = {}, 
    $selects = $('select'); 

$selects.bind('change', function() { 
    var $this = $(this); 
    selectRegistry[$this.attr('id')] = $this.val(); 
}); 

$selects.bind('keyup scroll select', function() { 
    var $this = $(this); 
    if ($this.val()!=selectRegistry[$this.attr('id')]) 
    { 
     $this.trigger('change'); 
    } 
}); 

Można użyć .live() funkcję, jeśli będziesz musiał dinamically stworzony wybierz elementy wzdłuż wykonywania strony internetowej.

+0

lub nawet lepiej (jeśli używasz jQuery> = 1.7) użyj '' Metoda .on() 'zamiast' .live() '. Zobacz http://www.jqapi.com/#p=on –

8

lepszym rozwiązaniem jest użyć .on() do funkcji wiązania jak wiele zdarzeń

$("#member").on("change keyup", function(){ 
    ----- 
}); 
+2

Uwielbiam to. Ścisłe zachowanie przeglądarki krzyżowej – htmldrum

+1

Niesamowite! Dziękuję :) –

+2

Wspaniale, to musi być najlepsza odpowiedź tutaj. Dziękuję Ci. –

Powiązane problemy