MSIE và addEventListener Sự cố trong Javascript?


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

Trong Chrome / Safari, phần trên sẽ chạy chức năng "beforecopy" khi nội dung trên trang đang được sao chép. MSIE cũng phải hỗ trợ chức năng này, nhưng vì lý do nào đó mà tôi gặp lỗi này:

"Đối tượng không hỗ trợ thuộc tính hoặc phương pháp này"

Bây giờ, tôi hiểu rằng Internet Explorer sẽ không chơi với nút body, nhưng tôi đã nghĩ rằng việc cung cấp một nút theo ID sẽ hoạt động tốt. Có ai có bất kỳ ý kiến ​​về những gì tôi đang làm sai? Cảm ơn trước.

** Điểm thưởng cho bất kỳ ai có thể cho tôi biết tham số thứ 3 "Sai" là tốt cho điều gì.


Đây là một bài viết hay giải thích về giai đoạn nắm bắt và useCapturerất hay: coding.smashingmagazine.com/2013/11/12/…
feeela 19/1113

Câu trả lời:


185

Trong IE, bạn phải sử dụng attachEventchứ không phải là tiêu chuẩn addEventListener.

Một thực tế phổ biến là kiểm tra xem addEventListenerphương pháp có sẵn không và sử dụng nó, nếu không, hãy sử dụng attachEvent:

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

Bạn có thể tạo một hàm để làm điều đó:

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

Bạn có thể chạy một ví dụ về đoạn mã trên tại đây .

Đối số thứ ba addEventListeneruseCapture; nếu đúng, nó chỉ ra rằng người dùng muốn bắt đầu chụp sự kiện .


1
Tôi đánh giá cao phản ứng của bạn. Tôi chỉ thử những gì bạn đã đăng, và nó đã hoạt động. Điều khiến tôi khó chịu bây giờ là sự kiện "copy" không hoạt động nhưng sự kiện "onclick" thì có. Cụ thể, điều này thật kỳ lạ vì quirksmode nói rằng nó sẽ hoạt động: quirksmode.org/dom/events/cutcopypaste.html Có ý kiến ​​gì không?
Matrym

Cào bình luận đó. Tôi chỉ cô lập và thử những gì bạn đã gửi và thay đổi nhấp để sao chép hoạt động. Cảm ơn một lần nữa.
Matrym

1
tại sao tài liệu riêng của microsoft hiển thị bằng cách sử dụng addEventListenersau đó? msdn.microsoft.com/en-us/library/ie/cc197015(v=vs.85).aspx
wmarbut

@wmarbut addEventListener đã được thêm vào, tôi tin là IE9. attachEvent đã được gỡ bỏ trong IE 11. Các câu hỏi ban đầu là từ năm 2009. CMS đã cung cấp đúng, phương pháp mạnh mẽ mà tiếp tục làm việc ngay cả với IE 11.
Colin trẻ

Điều đó giải thích tại sao nó hoạt động trên internet nhưng không hoạt động trên mạng nội bộ đối với tôi, bởi vì tôi đã đặt cài đặt của mình cho các trang web mạng nội bộ ở chế độ tương thích.
Roger Perkins

32

Trong trường hợp bạn đang sử dụng JQuery 2.x, hãy thêm thông tin sau vào

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

Điều này đã làm việc cho tôi.


3
đối với những người chạy phiên bản IE <= 8, điều này sẽ không khắc phục được sự cố.
ninjaneer

5

thử thêm

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

ngay sau thẻ mở đầu


2
đối với những người chạy phiên bản IE <= 8, điều này sẽ không khắc phục được sự cố.
ninjaneer

5

Internet Explorer (IE8 trở xuống) không hỗ trợ addEventListener(...). Nó có mô hình sự kiện của riêng nó bằng cách sử dụng attachEventphương pháp. Bạn có thể sử dụng một số mã như sau:

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

Mặc dù tôi khuyên bạn nên tránh viết trình bao bọc xử lý sự kiện của riêng mình và thay vào đó hãy sử dụng khung JavaScript (chẳng hạn như jQuery , Dojo , MooTools , YUI , Prototype , v.v.) và tránh phải tự tạo bản sửa lỗi cho điều này.

Nhân tiện, đối số thứ ba trong mô hình sự kiện W3C liên quan đến sự khác biệt giữa sự kiện sôi sục và sự kiện bắt giữ . Trong hầu hết mọi tình huống, bạn sẽ muốn xử lý các sự kiện khi chúng nổi bong bóng chứ không phải khi chúng bị bắt. Nó hữu ích khi sử dụng ủy quyền sự kiện cho những thứ như sự kiện "tiêu điểm" cho hộp văn bản, không bong bóng.


2

Đối với IE11, bạn cần sử dụng addEventListener. attachEventkhông được dùng nữa và gây ra lỗi.



0

Khi sử dụng <meta http-equiv="X-UA-Compatible" content="IE=9">, IE9 + không hỗ trợ addEventListenerbằng cách loại bỏ "bật" trong tên sự kiện, như sau:

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

0

Vấn đề là IE không có addEventListenerphương thức chuẩn . IE sử dụng cái riêng của attachEventnó cũng giống như vậy.

Có thể tìm thấy lời giải thích tốt về sự khác biệt và tham số thứ 3 tại quirksmode .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.