2013-08-19 18 views
5

ho letto la maggior parte degli articoli rilevanti in quirksmode.org ma ancora non sono sicuro di questo:IE8 onclick evento gestore

Rendere la mia app compatibile con IE8 (fun fun fun) ho incontrato questo problema quando si cerca di impostare un evento onclick a un link:

function myClickHandler(event) 
{ 
    alert(event); 
} 

var link = document.getElementById("myLink"); 
link.onclick = myClickHandler; //first option 

al contrario:

function myClickHandler(event) 
{ 
    alert(event); 
} 

var link = document.getElementById("myLink"); 
link.onclick = function() { 
    myClickHandler(event); //second option 
} 

Utilizzando la prima opzione, myClickHandler avvisa undefined. L'utilizzo della seconda opzione avvisa [object Event] che mi fa credere che l'oggetto evento non sia passato dalla prima opzione al gestore. Perché è così così su IE8?

Nota: non voglio utilizzare attachEvent poiché voglio sovrascrivere un singolo listener durante l'esecuzione e onclick sembra adattarsi bene.

risposta

9

Sì, l'oggetto evento non viene passato come parametro ai gestori di eventi in stile DOM0 in IE < = 8. È necessario ottenerlo dal numero window.event. Se aggiungi un parametro chiamato event, in IE < = 8 questo sarà undefined e i riferimenti a event all'interno del gestore eventi verranno risolti al parametro non definito anziché a window.event. Io di solito uso window.event per rendere questo esplicito nel codice:

link.onclick = function(evt) { 
    evt = evt || window.event; 
} 
+0

Grandezza. Grazie per la risposta. – user1555863

0

Una volta che avevo bisogno di gestire cliccare eventi sulla finestra e lavorare con target proprietà in IE8
La soluzione che ho usato nel mio progetto:

document.onclick = function(event) { 
       event = event || fixEvent.call(this, window.event); 
       var target = event.target || event.srcElement; 
       var className = target.className; 
       // .... 
      }; 




//For IE8 
// source: https://learn.javascript.ru/fixevent 
    function fixEvent(e) { 

     e.currentTarget = this; 
     e.target = e.srcElement; 

     if (e.type == 'mouseover' || e.type == 'mouseenter') e.relatedTarget = e.fromElement; 
     if (e.type == 'mouseout' || e.type == 'mouseleave') e.relatedTarget = e.toElement; 

     if (e.pageX == null && e.clientX != null) { 
      var html = document.documentElement; 
      var body = document.body; 

      e.pageX = e.clientX + (html.scrollLeft || body && body.scrollLeft || 0); 
      e.pageX -= html.clientLeft || 0; 

      e.pageY = e.clientY + (html.scrollTop || body && body.scrollTop || 0); 
      e.pageY -= html.clientTop || 0; 
     } 

     if (!e.which && e.button) { 
      e.which = e.button & 1 ? 1 : (e.button & 2 ? 3 : (e.button & 4 ? 2 : 0)); 
     } 

     return e; 
    } 
Problemi correlati