2009-09-02 16 views
17

Sto tentando di impedire ad A HREF di aprire effettivamente il collegamento, ma di eseguire uno script. Ho avuto la parte di lavoro sceneggiatura, ma sembra Firefox sarebbe solo ignorare questo:preventDefault non funziona su Firefox

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

Qualcuno può suggerire uno script cross-browser per la prevenzione di default?

risposta

28

La soluzione standard a questo è return false dal gestore click(). return false equivale a chiamare preventDefault() e stopPropagation() sull'evento. preventDefault() è sufficiente per questa attività, quindi o funzionerà o return false.

Il tuo problema sembra essere un errore di sintassi e parametri errati. Vedo:

  • fadeToggle non ha parentesi;
  • il parametro funzione si chiama id eppure si chiama event.preventDefault(); e
  • Stai sbiadendo il post e quindi lo mostri immediatamente? Questo accoderà due animazioni ma non ha molto senso. Probabilmente vorrai mettere insieme queste due cose e lo load() in modo razionale.

Quindi questo dovrebbe funzionare:

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

Potete liberamente sostituire return false con event.preventDefault() in questo caso, ma la moltiplicazione click() evento potrebbe o potrebbe causare altri problemi a seconda di cosa gli altri gestori di eventi che avete.

+0

Grazie per il vostro aiuto. –

+0

"Ehi cosa sta succedendo da questa parte?" – Steerpike

+10

Questo non è il problema qui. Il problema è .click (function (id) {dovrebbe essere .click (function (event) {. – karim79

-1

Si dovrebbe solo essere in grado di return false;

+3

"Back you go answer, to wait for a questioner con gusti meno esigenti." – Steerpike

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

dovrebbe essere

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

Poi

var id=event.target; 

vi darà l'oggetto che si sta lavorando, e event.preventDefault() interromperà l'azione predefinita.

In genere restituisco false; me stesso, ma questo impedisce entrambi l'azione predefinita e interrompe la propagazione dell'evento, che potrebbe avere effetti che non ti aspettavi con altri gestori di eventi.

+0

... in realtà, noto che si passa 'id' ma è sovrascritto dal proprio attributo-fetch. Ancora meglio, la variabile 'id' non è un id quando viene passata (è un evento obj anche se ho pensato che lo avessi pensato era l'oggetto DOM) né quando si ottiene l'attr (quindi, si tratta di un URI) .Questo più le parentesi mancanti sulla tua chiamata fadeToggle mi dice che devi leggere il codice che hai scritto un po 'più attentamente prima di iniziare a puntare dita alla libreria jQuery. – ijw

+0

Vorrei davvero che questa fosse la risposta corretta scelta: '( – Cassie

19

Funziona sempre: Firefox ha bisogno del "gestore di eventi", Chrome no. Quindi questo funziona su tutti i browser:

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

event.preventDefault (event) dovrebbe essere event.preventDefault() - né il riferimento jquery né il riferimento dom suggeriscono che il metodo preventDefault accetti i parametri. Il primo è probabilmente irrilevante perché è l'evento dom che viene sparato alla fine – B5A7

+0

Questo ha funzionato per me. –

+0

Per me, era che l'evento non veniva passato alla funzione click, quindi basta cambiarlo da '$ ('id_obj'). click (function() {' a '$ ('# id_obj'). click (function (event) {' ha fatto il trucco. Passare 'event' nel metodo' preventDefault' non ha cambiato nulla. –