2009-09-28 8 views
9

ho notato uno strano comportamento della funzione live() in jQuery:jQuery vivo ('click') licenziamento per giusta clic

<a href="#" id="normal">normal</a> 
<a href="#" id="live">live</a> 

$('#normal').click(clickHandler); 
$('#live').live('click', clickHandler); 

function clickHandler() { 
    alert("Clicked"); 
    return false; 
} 

Questo è bene e dandy fino a fare clic destro sul "live" link e avvia il gestore e quindi non mostra il menu di scelta rapida. Il gestore eventi non attiva affatto (come previsto) sul collegamento "normale".

Sono stato in grado di lavorare intorno ad esso cambiando il gestore per questo:

function clickHandler(e) { 
    if (e.button != 0) return true; 
    // normal handler code here 
    return false; 
} 

ma questo è davvero fastidioso dover aggiungere che a tutti i gestori di eventi. C'è un modo migliore per fare in modo che i gestori di eventi si attivino come normali gestori di clic?

+1

Come si fa a fare una domanda in futuro? – PetersenDidIt

+0

Sono stato felice di vedere qui la tua soluzione alternativa, e l'ho provato prontamente sulla mia app, e anche se i link su cui faccio clic con il pulsante destro del mouse ora possono essere scoperti e ignorati, non riesco ancora a visualizzare il mio menu di scelta rapida queste. Inoltre, il mio clic del tasto centrale del mouse (aperto in una nuova scheda) non funziona neanche. Ma almeno il conduttore può tornare presto! – Funka

+0

In realtà, sembra che se faccio clic con il pulsante destro ripetutamente, rapidamente, riesco a visualizzare occasionalmente il menu di scelta rapida .... Hmmm. – Funka

risposta

9

E 'un known issue:

Sembra che Firefox non viene generato un evento click per l'elemento su un pulsante destro del mouse, anche se spara un mousedown e MouseUp. Tuttavia, lo fa attiva un evento click su document! Poiché .live rileva gli eventi a livello di documento, vede l'evento click per l'elemento anche sebbene l'elemento stesso non lo faccia. Se si utilizza un evento come mouseup, sia l'elemento p e lo document vedrà l'evento.

La tua soluzione è il meglio che puoi fare per ora. Sembra incide solo su Firefox (credo che sia in realtà un bug in Firefox, non jQuery di per sé).

Vedere anche this question chiesto ieri.

0

Questa è una sfortunata conseguenza dell'implementazione di live. In realtà utilizza il bubbling degli eventi, quindi non sei vincolato all'evento click dell'elemento anchor, sei vincolato all'evento click del documento.

+0

No, c'è un difetto nel modo in cui Firefox fa clic con il pulsante destro del mouse. Vedi http://unixpapa.com/js/mouse.html –

+0

@crescentfresh: Non sono sicuro di quanto sia importante inserire un articolo in cui si dice "Le versioni Macintosh di Safari, ovviamente, sono immuni a questi problemi, perché i Macintoshes solo un pulsante del mouse "- l'ultima volta che ho usato un Mac con un mouse a pulsante singolo era qualche tempo prima che TBL inventasse il Web ;-) – NickFitz

+0

@NickFitz: touché. –

4

Ho trovato una soluzione - "correggere" il codice live() stesso.

Nella sorgente non terminata di jQuery 1.3.2 attorno alla riga 2989 esiste una funzione denominata liveHandler(). Modificare il codice per aggiungere una riga:

2989: function liveHandler(event) { 
2990:  if (event.type == 'click' && event.button != 0) return true; 

Questo fermerà gli eventi click di sparare su qualsiasi cosa, ma il tasto sinistro del mouse. Se volessi particolarmente, potresti facilmente modificare il codice per consentire anche gli eventi di "rightclick", ma questo funziona per me, quindi è per questo.

3

Si può effettivamente riscrivere come:

function reattachEvents(){ 
    $(element).unbind('click').click(function(){ 
     //do something 
    }); 
} 

e chiamarlo quando si aggiunge un nuovo elemento DOM, dovrebbe avere il risultato atteso (senza cottura l'evento del tasto destro).

+1

sì, ma ciò sconfigge lo scopo di 'live()' no? – nickf

+0

true, ma live (clic) si comporta in modo diverso dal normale click() che può essere corretto se si rileva il pulsante premuto, ma è necessario sapere esattamente quale browser è stato utilizzato (IE si comporta in modo diverso nelle versioni precedenti rispetto alle versioni più recenti e tutte altri browser agiscono in modo "corretto"). Questa è una soluzione molto più elegante per il momento. – SeanJA

0

Ho risolto questo utilizzando eventi di mouse. Nella mia situazione la distinzione tra mousedown e click non aveva importanza.