2009-09-02 30 views
17

Estoy intentando evitar que A HREF realmente abra el enlace, pero ejecute un script. Me dieron el papel de trabajo de la escritura, pero parece Firefox sería simplemente ignorar esto:preventDefault no funcionará en Firefox

$("#permalink a").click(function(id){ 
    $("#newPost").fadeToggle; 
    event.preventDefault(); 
    var id = this.getAttribute('href'); 
    $("#newPostContent").load(id); 
    $("#newPost").show("fast"); 
}); 

¿Puede alguien sugerir una secuencia de comandos multi-navegador por defecto para la prevención?

Respuesta

28

La solución estándar para esto es return false del controlador click(). return false es el equivalente a llamar al preventDefault() y stopPropagation() en el evento. preventDefault() es suficiente para esta tarea también, así que o bien return false funcionará.

Parece que su problema son los errores de sintaxis y los parámetros incorrectos. Veo:

  • fadeToggle no tiene paréntesis;
  • el parámetro de función se llama id pero llama al event.preventDefault(); y
  • ¿Estás perdiendo el mensaje y enseguida lo muestras? Eso pondrá en cola dos animaciones pero no tiene mucho sentido. Probablemente quiera encadenar esas dos cosas y el load() de una manera racional.

así que esto debería funcionar:

$("#permalink a").click(function(event) { 
    $("#newPost").fadeToggle(); 
    var id = this.getAttribute('href'); 
    $("#newPostContent").load(id); 
    $("#newPost").show("fast"); 
    return false; 
}); 

Puede sustituir libremente return false con event.preventDefault() en este caso, pero el caso click() propagación puede o causar otros problemas dependiendo de lo que otros controladores de eventos que tiene.

+0

Gracias por su ayuda. –

+0

"Oye, ¿qué está pasando en este lado?" – Steerpike

+10

Ese no es el problema aquí. El problema es .click (función (id) {debe ser .click (función (evento) {. – karim79

-1

Usted sólo debe ser capaz de return false;

+3

"Vuelve a contestar, a la espera de un interrogador con gustos menos exigentes". – Steerpike

12
  $("#permalink a").click(function(id){ 

debe ser

  $("#permalink a").click(function(event){ 

Entonces

var id=event.target; 

le dará el objeto que se está trabajando, y event.preventDefault() detendrá la acción predeterminada.

Normalmente devuelvo falso; yo mismo, pero esto impide que la acción predeterminada y detenga la propagación del evento, lo que podría tener efectos que no esperaba con otros manejadores de eventos.

+0

... de hecho, observo que pasas 'id' pero es reemplazado por tu atributo-fetch. Mejor aún, la variable 'id' no es una identificación cuando se transfiere (es un evento obj aunque supuse que lo pensabas) era el objeto DOM) ni cuando obtienes el attr (entonces, es un URI). Que más los paréntesis faltantes en tu llamada fadeToggle me dicen que necesitas leer el código que has escrito un poco más cuidadosamente antes de comenzar a señalar dedos en la biblioteca jQuery. – ijw

+0

Realmente me gustaría que esta fuera la respuesta correcta elegida: '( – Cassie

19

Esto siempre funciona: Firefox necesita el "controlador de eventos", Chrome no. Así que esto funciona en todos los navegadores:

$('#id_obj').click(function(event) { 
    event.preventDefault(event); 
} 
+1

event.preventDefault (event) debería ser event.preventDefault() - ni la referencia jquery ni la referencia dom sugieren que el método preventDefault acepta parámetros. El primero es probablemente irrelevante porque es el evento dom el que se dispara al final. – B5A7

+0

Esto funcionó para mí. –

+0

Para mí, fue que el 'evento 'no pasaba a la función de clic, así que simplemente cambiándolo de '$ ('id_obj'), haga clic en (función() {' a '$ ('# id_obj'). Haga clic en (función (evento) {' hizo el truco. Pasar 'event' al método' preventDefault' no cambió nada. –