ReferenceError: error de evento no definido en Firefox

104

Hice una página para un cliente e inicialmente estaba trabajando en Chrome y olvidé verificar si funcionaba en Firefox. Ahora, tengo un gran problema porque toda la página se basa en un script que no funciona en Firefox.

Se basa en todos los "enlaces" que tienen un relque lleva a ocultar y mostrar la página correcta. No entiendo por qué esto no funciona en Firefox.

Por ejemplo, las páginas tienen la identificación #menuPage, #aboutPagey así sucesivamente. Todos los enlaces tienen este código:

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

Funciona perfectamente en Chrome y Safari.

Aquí está el código:

$(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
fuente
2
Sería muy útil si explicaras exactamente a qué te refieres cuando dices que "no funciona". Lo que no sucederá? Errores? ¿Mal diseño? ¿Mal comportamiento?
Puntiagudo

Respuestas:

136

Estás declarando (algunos de) tus controladores de eventos incorrectamente:

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

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


});

Necesita que "evento" sea un parámetro para los controladores. WebKit sigue el antiguo comportamiento de IE de usar un símbolo global para "evento", pero Firefox no. Cuando usa jQuery, esa biblioteca normaliza el comportamiento y garantiza que a sus controladores de eventos se les pase el parámetro de evento.

editar - para aclarar: debe proporcionar algún nombre de parámetro; utilizando eventdeja claro lo que se propone, pero se le puede llamar eo cupcakeo cualquier otra cosa.

Tenga en cuenta también que la razón por la que probablemente debería usar el parámetro pasado de jQuery en lugar del "nativo" (en Chrome, IE y Safari) es que ese (el parámetro) es un contenedor de jQuery alrededor del objeto de evento nativo. El contenedor es lo que normaliza el comportamiento del evento en los navegadores. Si usa la versión global, no lo entiende.

Puntiagudo
fuente
Muchas gracias. meteor.js usa muchas variables de eventos. function () {.... sin pasar el evento todavía funciona en Chrome y Safari. sin embargo, firefox fallaría.
Jimmy MG Lim
54

Es porque olvidó pasar eventa la clickfunción:

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

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

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

En una nota al margen, ese usa más comúnmente en lugar de la palabra, eventya que Eventes una variable global en la mayoría de los navegadores.

Mark Pieszak - Trilon.io
fuente
3
... excepto en Firefox por supuesto! No está de más usar el nombre "evento" para el parámetro, ya que no es una palabra reservada ni nada.
Puntiagudo
1
Muy cierto, supongo que acabo ede aprender de jQuery. @Pointy
Mark Pieszak - Trilon.io