Câu hỏi Vấn đề MSIE và addEventListener trong Javascript?


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

Trong Chrome / Safari, ở trên sẽ chạy hàm "beforecopy" khi nội dung trên trang đang được sao chép. MSIE là nghĩa vụ phải hỗ trợ chức năng này là tốt, nhưng đối với một số lý do tôi nhận được lỗi này:

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

Bây giờ, đó là sự hiểu biết của tôi rằng Internet Explorer sẽ không chơi với các nút cơ thể, nhưng tôi đã có thể nghĩ rằng cung cấp một nút bằng ID sẽ làm việc tốt. Có ai có bất kỳ ý tưởng 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 thông số thứ 3 "False" là tốt cho điều gì.


76
2017-11-08 04:35


gốc


Dưới đây là một bài viết hay giải thích về giai đoạn chụp và useCapture rất tốt: coding.smashingmagazine.com/2013/11/12/… - feeela


Các câu trả lời:


Trong IE bạn phải sử dụng attachEvent thay vì tiêu chuẩn addEventListener.

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

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

Bạn có thể thực hiện một chức năng để 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ề mã trên đây.

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


175
2017-11-08 04:40



Tôi đánh giá cao phản ứng của bạn. Tôi vừa thử những gì bạn đã đăng và nó đã hoạt động. Điều mà ném tôi ra bây giờ là sự kiện "sao chép" không hoạt động nhưng sự kiện "onclick" là. Cụ thể, điều này là lạ vì quirksmode nói rằng nó sẽ hoạt động: quirksmode.org/dom/events/cutcopypaste.html  Bất kỳ ý tưởng? - Matrym
Gãi nhận xét đó. Tôi chỉ bị cô lập và thử những gì bạn đã gửi và việc thay đổi nhấp để sao chép không hoạt động. Cảm ơn một lần nữa. - Matrym
Không có gì! - CMS
Bạn vừa lưu sự tỉnh táo của tôi, CMS. Cảm ơn cảm ơn! - CodeMouse92
tại sao tài liệu của riêng microsoft hiển thị bằng addEventListener sau đó? msdn.microsoft.com/en-us/library/ie/cc197015(v=vs.85).aspx - wmarbut


Trong trường hợp bạn đang sử dụng JQuery 2.x thì hãy thêm phần 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.


28
2017-08-19 15:05



đố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


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

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 đó sử dụng khung JavaScript (chẳng hạn như jQuery, Dojo, MooTools, YUI, Prototype, vv) và tránh phải tự khắc phục sự cố này.

Nhân tiện, lập luận thứ ba trong mô hình các sự kiện của W3C phải làm với sự khác biệt giữa sự kiện bubbling và capturing. 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 bong bóng, không phải khi chúng bị bắt. Nó rất hữu ích khi sử dụng tổ chức sự kiện về những thứ như sự kiện "tập trung" cho các hộp văn bản, không bong bóng.


4
2017-11-08 04:45





thử thêm

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

ngay sau thẻ mở đầu


3
2017-08-19 07:55



đố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


Theo IE11, bạn cần sử dụng addEventListener. attachEvent không được chấp nhận và ném lỗi.


1
2017-11-19 09:32



Bạn có thể tiếp tục sử dụng nó nếu bạn chèn thẻ meta tương thích x-ua không? - Vincent


Như PPK chỉ ra đây, trong IE bạn cũng có thể sử dụng

e.cancelBubble = true;

0
2017-10-10 13:47





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

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

0
2017-11-16 21:44