2010-09-18 10 views
12

Ho problemi a far funzionare attachEvent. In tutti i browser che supportano il gestore addEventListener il codice seguente funziona come un incantesimo, ma in IE è un disastro completo. Hanno una loro variazione (incompleta) chiamata attachEvent.attachEvent rispetto addEventListener

Ora ecco l'affare. Come faccio a far funzionare attachEvent allo stesso modo di addEventListener?

Ecco il codice:

function aFunction(idname) 
{ 
    document.writeln('<iframe id="'+idname+'"></iframe>'); 
    var Editor = document.getElementById(idname).contentWindow.document; 

    /* Some other code */ 

    if (Editor.attachEvent) 
    { 
     document.writeln('<textarea id="'+this.idname+'" name="' + this.idname + '" style="display:none">'+this.html+'</textarea>'); 
     Editor.attachEvent("onkeyup", KeyBoardHandler); 
    } 
    else 
    { 
     document.writeln('<textarea id="hdn'+this.idname+'" name="' + this.idname + '" style="display:block">'+this.html+'</textarea>'); 
     Editor.addEventListener("keyup", KeyBoardHandler, true); 
    } 
} 

Questa chiama la funzione KeyBoardHandler che assomiglia a questo:

function KeyBoardHandler(Event, keyEventArgs) { 
    if (Event.keyCode == 13) { 
     Event.target.ownerDocument.execCommand("inserthtml",false,'<br />'); 
     Event.returnValue = false; 
    } 

    /* more code */ 
} 

Non voglio usare qualsiasi framework perché a) sto cercando di imparare e capire qualcosa, e B) qualsiasi struttura è solo un sovraccarico di codice che userò.

Qualsiasi aiuto è molto apprezzato!

+0

Hai un buon punto nel provare a imparare senza usare un framework per capire il funzionamento interno del JavaScript basato su browser. Tuttavia, ti suggerisco di passare all'utilizzo di framework per il codice di produzione una volta che hai padroneggiato JavaScript di basso livello, non ha molto senso reinventare la ruota (i framework sono ampiamente testati con una varietà di browser e una volta fai girare il tuo framework, diventerà sempre più grande per aggirare le stranezze del browser ed evitare il codice boilerplate in altre parti del tuo codice). Inoltre, JavaScript esterno può essere memorizzato nella cache dal browser una volta per più richieste. – Archimedix

+0

cosa stai cercando di fare e cosa sta succedendo ora che è sbagliato? – lincolnk

+0

I framework come jquery sono più simili a uno standard oggi, cercano di rendere la compatibilità cross-browser una cosa reale, usano javascript quando in realtà vuoi fare qualcosa di specifico e vuoi un controllo completo. –

risposta

0

È preferibile utilizzare un framework JavaScript come MooTools o jQuery di propria scelta per facilitare il supporto di più browser. Per maggiori dettagli, si veda anche

porto MooTools di parti del codice di esempio:

var Editor = $(idname).contentWindow.document; 
... 
$(document.body).grab(new Element('textarea', { 
    'id' : this.idname, 
    'name' : this.idname, 
    'style': 'display:none;', 
    'html' : this.html 
}); 
Editor.addEvent('keyup', KeyBoardHandler); 

Tra l'altro, è apposta che si utilizza sia idname e this.idname nel codice sopra?

+3

Grazie ragazzi, ma no grazie. ;-) Prima di tutto sto cercando di imparare qualcosa qui, in secondo luogo non voglio un sovraccarico di codice che non userò. Quindi, per favore, nessun consiglio quadro esterno, anche se capisco l'idea che sta dietro. –

+1

Intendo questo con le migliori intenzioni - forse sarebbe meglio imparare non le stranezze dei browser sottostanti, ma invece spendere il tuo tempo ad imparare concetti di livello superiore come callback, promesse, pattern del modulo, curry, ecc. i browser diventano più standardizzati, il ROI sull'apprendimento di tali specifiche diminuirà, mentre l'apprendimento di idee Javascript più astratte è altrettanto soddisfacente da apprendere mentre allo stesso tempo ti equipaggia per altre lingue e cose diverse in pista. – iono

3

Basta usare un framework come jQuery o prototipo. Ecco a cosa servono, questo preciso motivo: essere in grado di fare questo genere di cose senza preoccuparsi della compatibilità cross-browser. E 'super facile da installare ... basta includere uno script js e aggiungere una riga di codice ...

(a cura solo per voi Crescent Fresh)

Con un quadro, il codice è semplice come. ..

<script type='text/javascript' src='jquery.js'></script> 
$('element').keyup(function() { 
    // stuff to happen on event here 
}); 
+0

seriamente però ... vai a prendere jQuery o qualcosa del genere ... ero abituato a resistere per il tempo più lungo ... un giorno sono stato costretto a impararlo fino al punto di aggiustare del codice che lo utilizzava ... da allora ... mi calcio costantemente nel culo per non usarlo prima. La più grande invenzione dal pane a fette. –

+11

Perché non mostri all'OP quanto sia pazzo facile farlo con jQuery o Prototype! "Basta usare jQuery" non è un tipo di risposta. –

+1

felice? Non pensavo che qualcosa di "pazzo facile" servisse a spiegare, ma dal momento che vuoi essere un asino come se fossi una specie di poliziotta interweb ... p.s. - Grazie per il downvote, felice di aver reso la tua giornata di auto-giustizia un po 'più luminosa. –

2

Ecco una funzione che uso per entrambi i browser:

function eventListen(t, fn, o) { 
    o = o || window; 
    var e = t+Math.round(Math.random()*99999999); 
    if (o.attachEvent) { 
     o['e'+e] = fn; 
     o[e] = function(){ 
      o['e'+e](window.event); 
     }; 
     o.attachEvent('on'+t, o[e]); 
    }else{ 
     o.addEventListener(t, fn, false); 
    } 
} 

E si può utilizzare come:

eventListen('keyup', function(ev){ 
    if (ev.keyCode === 13){ 
    ... 
    } 
    ... 
}, Editor) 
+1

Come sarebbe il contrario 'detachEvent' /' removeEventListener'? (lo sai, per simmetria). –

+0

Quindi come utilizzerei il codice qui sopra in questo caso? Scusa, un po 'di JOB noob. :/ –

+0

Stranamente non ho mai dovuto staccare nella nostra app. Nessun codice disponibile quindi ... – Mic

2

Diversi browser elaboreranno gli eventi in modo diverso. Alcuni browser hanno bolle di eventi su come lanciare i controlli dove alcuni vanno in alto. Per ulteriori informazioni su che dare un'occhiata a questo documento W3C: http://www.w3.org/TR/DOM-Level-3-Events/#event-flow

Per quanto riguarda questa impostazione del parametro "userCapture" false per addEventListener problema specifico farà eventi comportano allo stesso modo di Internet Explorer: https://developer.mozilla.org/en/DOM/element.addEventListener#Internet_Explorer

+0

'useCapture' determina solo se l'evento si attiva durante la sequenza di cattura o la sequenza di bolle. IE esegue solo la sequenza delle bolle, quindi 'false' viene utilizzato per la compatibilità. non cambierà il processo del gestore. – lincolnk

7

Il la fonte dei tuoi problemi è la funzione KeyBoardHandler.Nello specifico, in IE Event gli oggetti non hanno una proprietà target: l'equivalente è srcElement. Inoltre, la proprietà returnValue degli oggetti Event è solo IE. Vuoi il metodo preventDefault() in altri browser.

function KeyBoardHandler(evt, keyEventArgs) { 
    if (evt.keyCode == 13) { 
     var target = evt.target || evt.srcElement; 
     target.ownerDocument.execCommand("inserthtml",false,'<br />'); 
     if (typeof evt.preventDefault != "undefined") { 
      evt.preventDefault(); 
     } else { 
      evt.returnValue = false; 
     } 
    } 

    /* more code */ 
} 
14

Ecco come fare questo lavoro cross-browser, solo per riferimento però.

var myFunction=function(){ 
    //do something here 
} 
var el=document.getElementById('myId'); 

if (el.addEventListener) { 
    el.addEventListener('mouseover',myFunction,false); 
    el.addEventListener('mouseout',myFunction,false); 
} else if(el.attachEvent) { 
    el.attachEvent('onmouseover',myFunction); 
    el.attachEvent('onmouseout',myFunction); 
} else { 
    el.onmouseover = myFunction; 
    el.onmouseout = myFunction; 
} 

ref: http://jquerydojo.blogspot.com/2012/12/javascript-dom-addeventlistener-and.html

0

Qualcuno di cui sopra che ".. in oggetti evento IE non hanno una proprietà target: l'equivalente è srcElement ..." Beh, in IE11 non v'è tale destinazione.

Problemi correlati