Javascript:IE event.preventDefault为null或不是对象

时间:2010-09-09 14:53:37

标签: javascript internet-explorer

我的代码在除了IE之外的FF / Chrome / Everything中工作正常(7/8都失败了,没有打算继续下去)。由于限制,我不能使用jQuery并且硬编码Javascript。问题出在IE上,我得到“preventDefault为null或者不是对象”。希望你们中的一个有答案,这里有相关的代码:

AddEvent方法:

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 );  
};

事件处理程序抛出错误:

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

DOCTYPE和charset也在调用HTML页面上设置。任何想法,将不胜感激。在mousedown方法的if语句中抛出错误。

编辑:

由于抓住window.event确实“修复”了主要问题,我发现问题是代码的不同部分。基本上我在预先放置的元素的ontop上添加一个元素,然后将mousedown / mousemove事件注册到该div。在<div>上触发事件时,会发生错误。

这可能是因为我已将事件注册到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);  

2 个答案:

答案 0 :(得分:6)

在IE中,事件对象不作为事件处理程序的第一个参数传递。相反,它是一个全局变量:

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

答案 1 :(得分:0)

IE与其他浏览器(甚至是IE8)有不同的事件模型。在IE中你会称之为做同样的事情:

event.returnValue = false;

您需要确定浏览器支持的内容并调用正确的方法。首先检查是否设置了event.returnValue,如果是,则调用它,否则调用preventDefault()。