Проблема MSIE и addEventListener в Javascript?

document.getElementById('container').addEventListener('copy',beforecopy,false );

В Chrome/Safari выше будет выполняться функция "beforecopy" при копировании содержимого на странице. MSIE также должна поддерживать эту функциональность, но по какой-то причине я получаю эту ошибку:

"Объект не поддерживает это свойство или метод"

Теперь я понимаю, что Internet Explorer не будет играть с телом node, но я думал, что предоставление node по ID будет работать нормально. Есть ли у кого-нибудь идеи о том, что я делаю неправильно? Спасибо заранее.

** Бонусные баллы для всех, кто может сказать мне, что подходит для 3-го параметра "False".

Ответ 1

В IE вы должны использовать attachEvent, а не стандартный addEventListener.

Общей практикой является проверка доступности метода addEventListener и его использования, в противном случае используйте attachEvent:

if (el.addEventListener){
  el.addEventListener('click', modifyText, false); 
} else if (el.attachEvent){
  el.attachEvent('onclick', modifyText);
}

Вы можете сделать функцию:

function bindEvent(el, eventName, eventHandler) {
  if (el.addEventListener){
    el.addEventListener(eventName, eventHandler, false); 
  } else if (el.attachEvent){
    el.attachEvent('on'+eventName, eventHandler);
  }
}
// ...
bindEvent(document.getElementById('myElement'), 'click', function () {
  alert('element clicked');
});

Вы можете запустить пример приведенного выше кода здесь.

Третий аргумент addEventListener равен useCapture; если true, это означает, что пользователь желает инициировать захват событий.

Ответ 2

Если вы используете JQuery 2.x, добавьте следующее в

<html>
   <head>
      <meta http-equiv="X-UA-Compatible" content="IE=edge;" />
   </head>
   <body>
    ...
   </body>
</html>

Это сработало для меня.

Ответ 3

Internet Explorer (IE8 и ниже) не поддерживает addEventListener(...). Он имеет собственную модель событий, используя метод attachEvent. Вы можете использовать такой код:

var element = document.getElementById('container');
if (document.addEventListener){
    element .addEventListener('copy', beforeCopy, false); 
} else if (el.attachEvent){
    element .attachEvent('oncopy', beforeCopy);
}

Хотя я рекомендую избегать написания собственной оболочки обработки событий и вместо этого использовать фреймворк JavaScript (например, jQuery, Dojo, MooTools, YUI, Prototype и т.д.) и не создавать исправить это самостоятельно.

Кстати, третий аргумент в модели событий W3C связан с различием между событиями барботажа и захвата. Почти в каждой ситуации вы хотите обрабатывать события, когда они пузырятся, а не когда они захвачены. Это полезно при использовании делегирования событий в таких вещах, как "фокус" событий для текстовых полей, которые не пузырятся.

Ответ 4

попробуйте добавить

<meta http-equiv="X-UA-Compatible" content="IE=edge"> 

сразу после тега с открывающейся головой

Ответ 5

Как и в IE11, вам нужно использовать addEventListener. attachEvent устарел и выдает ошибку.

Ответ 6

Проблема в том, что IE не имеет стандартного метода addEventListener. IE использует свой собственный attachEvent, который делает почти то же самое.

Хорошее объяснение различий, а также о третьем параметре можно найти в quirksmode.

Ответ 7

Поскольку PPK указывает здесь, в IE вы также можете использовать

e.cancelBubble = true;

Ответ 8

Используя <meta http-equiv="X-UA-Compatible" content="IE=9">, IE9 + поддерживает addEventListener, удалив "on" в имени события, например:

 var btn1 = document.getElementById('btn1');
 btn1.addEventListener('mousedown', function() {
   console.log('mousedown');
 });