Javascript: IE event.preventDefault имеет значение null или не является объектом - PullRequest
2 голосов
/ 09 сентября 2010

Мой код работает хорошо в FF / Chrome / Все, кроме IE (не удалось в обоих 7/8, не потрудившись продолжить). Из-за ограничений я не могу использовать jQuery и жестко программирую Javascript. Проблема с IE, я получаю: «protectDefault - ноль или не объект». Надеюсь, у одного из вас есть ответ, и вот соответствующий код:

Метод 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-странице. Любые идеи были бы хорошы. Ошибка выдается в операторе if для метода mousedown.

EDIT:

Из-за того, что захват window.event «исправил» основную проблему, я обнаружил, что проблема в другом разделе кода. По сути, я добавляю элемент поверх предварительно размещенного элемента, а затем регистрирую события 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 ]

6 голосов
/ 09 сентября 2010

В IE объект события не передается в качестве первого аргумента обработчику события. Вместо этого это глобальная переменная:

function mousedown(e){
 var evt = e || window.event; // IE compatibility
 if(evt.preventDefault){  
  evt.preventDefault();  
 }else{  
  evt.returnValue = false;  
  evt.cancelBubble=true;  
 }
 //Processing   
};
0 голосов
/ 09 сентября 2010

IE имеет другую модель событий, чем другие браузеры (даже IE8). В IE вы бы назвали это, чтобы сделать то же самое:

event.returnValue = false;

Вам необходимо определить, что поддерживает браузер, и вызвать правильный метод. Поэтому сначала проверьте, установлено ли event.returnValue, если это так, затем вызовите его, в противном случае вызовите предотвратите работу ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...