2010-09-09 9 views
2

Mon code fonctionne très bien dans FF/Chrome/Tout sauf IE (échoué à la fois dans 7/8, n'a pas pris la peine d'aller plus bas). En raison de restrictions, je ne peux pas utiliser jQuery et je suis en train de coder en dur le Javascript. Le problème est avec IE, je reçois "preventDefault est nul ou pas un objet". Dans l'espoir de vous a la réponse, et voici le code pertinent:Javascript: IE event.preventDefault est nul ou pas un objet

AddEvent Méthode:

function addEvent(obj, type, fn) { 
    if (obj.attachEvent) { 
    obj['e'+type+fn] = fn; 
    obj[type+fn] = function(){obj['e'+type+fn](window.event);} 
    obj.attachEvent('on'+type, obj[type+fn]); 
    } else 
    obj.addEventListener(type, fn, false); 
}; 

Gestionnaire d'événements lancer erreur:

function mousedown(e){ 
    if(e.preventDefault){ 
    e.preventDefault(); 
    } else { 
    e.returnValue = false; 
    e.cancelBubble=true; 
    } 
    //Processing 
}; 

DOCTYPE aussi et charset sont tous deux sur l'appelant HTML page. Toute idée serait appréciée. L'erreur est renvoyée dans l'instruction if de la méthode mousedown.

EDIT:

En raison du fait que l'accaparement window.event ne « fixer » la question principale, j'ai découvert le problème était une autre section de code. Fondamentalement, j'ajoute un élément sur un élément pré-placé, puis en enregistrant les événements mousedown/mousemove dans ce div. Lors du déclenchement de l'événement sur le <div>, c'est là que l'erreur est levée.

Serait-ce quelque chose en raison du fait que j'ai des événements enregistrés à 2

rect = document.createElement('div'); 
rect.className='square'; 
rect.id='chooser_rectangle'; 
rect.style.left=initx+'px'; 
rect.style.top=inity+'px'; 

addEvent(rect,"mousemove",mousemove); 
addEvent(rect,"mousedown",mousedown); 
+1

Il doit y avoir autre chose ici. vos deux méthodes js fonctionnent bien pour une démo rapide que j'ai mis en place et essayé avec IE8. Pouvez-vous le plus un exemple plus complet avec erreur reproductible? – lincolnk

+0

Avez-vous essayé de vérifier 'typeof e' et' typeof e.preventDefault'? –

+0

L'exemple de code tel quel ne provoquerait pas l'erreur "event.preventDefault est null ou un objet". Pour un, vous ne référencez pas "événement" dans votre gestionnaire, mais plutôt "e". –

Répondre

6

Dans IE l'objet événement n'est pas adopté le premier argument à un gestionnaire d'événements. Au lieu de cela, il s'agit d'une variable globale:

function mousedown(e){ 
var evt = e || window.event; // IE compatibility 
if(evt.preventDefault){ 
    evt.preventDefault(); 
}else{ 
    evt.returnValue = false; 
    evt.cancelBubble=true; 
} 
//Processing 
}; 
+0

c'est quand vous utilisez 'attachEvent'. – lincolnk

+0

OP passe déjà 'window.event'. –

+0

Figuré c'était quelque chose dans le sens de passer dans le mauvais événement. Merci, cela me tue depuis une bonne heure maintenant – avrx

0

IE a un modèle d'événement différent des autres navigateurs (même IE8). Dans Internet Explorer, vous appelez cela pour faire la même chose:

event.returnValue = false; 

Vous devez déterminer ce que le navigateur prend en charge et appeler la bonne méthode. Donc, vérifiez d'abord si event.returnValue est défini, si c'est le cas, appelez-le, sinon appelez preventDefault().

+0

OP fait déjà cela. –

Questions connexes