ReferenceError: zdarzenie nie jest zdefiniowane błąd w przeglądarce Firefox

104

Zrobiłem stronę dla klienta i początkowo pracowałem w przeglądarce Chrome i zapomniałem sprawdzić, czy działa w przeglądarce Firefox. Teraz mam duży problem, ponieważ cała strona jest oparta na skrypcie, który nie działa w Firefoksie.

Opiera się na wszystkich „linkach”, które mają reloznaczenie prowadzące do ukrycia i wyświetlenia właściwej strony. Nie rozumiem, dlaczego to nie działa w przeglądarce Firefox.

Dla stron przykład mieć identyfikator #menuPage, #aboutPagei tak dalej. Wszystkie linki mają ten kod:

<a class="menuOption" rel='#homePage' href="#">Velkommen</a> 

Działa doskonale w Chrome i Safari.

Oto kod:

$(document).ready(function(){

//Main Navigation


$('.menuOption').click(function(){

  event.preventDefault();
  var categories = $(this).attr('rel');
  $('.pages').hide();
  $(categories).fadeIn();


});

// HIDES and showes the right starting menu
    $('.all').hide();
    $('.pizza').show();


// Hides and shows using rel tags in the buttons    
    $('.menyCat').click(function(event){
        event.preventDefault();
        var categori = $(this).attr('rel');
        $('.all').hide();
        $(categori).fadeIn();
        $('html,body').scrollTo(0, categori);

    });


}); 
Måns Dahlström
źródło
2
Byłoby naprawdę pomocne, gdybyś dokładnie wyjaśnił, co masz na myśli, mówiąc, że „nie działa”. Co się dzieje? Błędy? Zły układ? Złe zachowanie?
Pointy,

Odpowiedzi:

136

Deklarujesz (niektóre) swoje programy obsługi zdarzeń nieprawidłowo:

$('.menuOption').click(function( event ){ // <---- "event" parameter here

    event.preventDefault();
    var categories = $(this).attr('rel');
    $('.pages').hide();
    $(categories).fadeIn();


});

Musisz „zdarzenie” być parametrem dla programów obsługi. WebKit naśladuje stare zachowanie IE, polegające na używaniu globalnego symbolu dla „zdarzenia”, ale Firefox tego nie robi. Gdy używasz jQuery, ta biblioteka normalizuje zachowanie i zapewnia, że ​​programy obsługi zdarzeń otrzymują parametr zdarzenia.

edytuj - doprecyzuj: musisz podać jakąś nazwę parametru; stosując eventwyjaśnia, co zamierza, ale można to nazwać elub cupcakeczy cokolwiek innego.

Zauważ również, że powodem, dla którego prawdopodobnie powinieneś używać parametru przekazanego z jQuery zamiast „natywnego” (w Chrome, IE i Safari) jest to, że ten parametr (parametr) jest opakowaniem jQuery wokół natywnego obiektu zdarzenia. Opakowanie normalizuje zachowanie zdarzeń w przeglądarkach. Jeśli używasz wersji globalnej, tego nie rozumiesz.

Spiczasty
źródło
Wielkie dzięki. meteor.js używa wielu zmiennych zdarzeń. function () {.... bez podania zdarzenia nadal działa w chrome i safari. jednak firefox zawiedzie.
Jimmy MG Lim
54

To dlatego, że zapomniałeś przejść eventdo clickfunkcji:

$('.menuOption').on('click', function (e) { // <-- the "e" for event

    e.preventDefault(); // now it'll work

    var categories = $(this).attr('rel');
    $('.pages').hide();
    $(categories).fadeIn();
});

Na marginesie, ejest częściej używane w przeciwieństwie do słowa, eventponieważ Eventjest zmienną globalną w większości przeglądarek.

Mark Pieszak - Trilon.io
źródło
3
... oczywiście z wyjątkiem Firefoksa! Używanie nazwy „zdarzenie” dla parametru nie zaszkodzi, ponieważ nie jest to słowo zastrzeżone ani nic takiego.
Pointy,
1
To prawda, chyba właśnie odebrałem ez jQuery! @Pointy
Mark Pieszak - Trilon.io