MSIE และ addEventListener Problem ใน Javascript?


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

ใน Chrome / Safari ข้างต้นจะเรียกใช้ฟังก์ชัน "beforecopy" เมื่อมีการคัดลอกเนื้อหาในหน้า MSIE ควรจะรองรับฟังก์ชันนี้เช่นกัน แต่ด้วยเหตุผลบางประการฉันได้รับข้อผิดพลาดนี้:

"วัตถุไม่รองรับคุณสมบัติหรือวิธีการนี้"

ตอนนี้ฉันเข้าใจว่า Internet Explorer จะไม่เล่นกับ body node แต่ฉันคิดว่าการให้ node by ID จะทำงานได้ดี ใครมีความคิดเกี่ยวกับสิ่งที่ฉันทำผิด? ขอบคุณล่วงหน้า.

** คะแนนโบนัสสำหรับทุกคนที่สามารถบอกได้ว่าพารามิเตอร์ที่ 3 "False" มีประโยชน์อย่างไร


นี่คือบทความดีๆที่อธิบายขั้นตอนการจับภาพได้useCaptureเป็นอย่างดี: coding.smashingmagazine.com/2013/11/12/…
feeela

คำตอบ:


186

ใน IE ที่คุณต้องใช้มากกว่ามาตรฐานattachEventaddEventListener

แนวทางปฏิบัติทั่วไปคือตรวจสอบว่ามี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; ถ้าเป็นจริงก็แสดงว่าผู้ใช้ต้องการที่จะเริ่มต้นการจับภาพเหตุการณ์


1
ขอขอบคุณสำหรับการตอบกลับของคุณ ฉันเพิ่งลองสิ่งที่คุณโพสต์และมันได้ผล สิ่งที่ทำให้ฉันผิดหวังตอนนี้คือเหตุการณ์ "คัดลอก" ไม่ทำงาน แต่เหตุการณ์ "onclick" คือ โดยเฉพาะสิ่งนี้แปลกเพราะ quirksmode ระบุว่าควรใช้งานได้: quirksmode.org/dom/events/cutcopypaste.html ความคิดใด ๆ
Matrym

เกาความคิดเห็นนั้น ฉันเพิ่งแยกและลองสิ่งที่คุณส่งและการเปลี่ยนคลิกเพื่อคัดลอกก็ใช้ได้ผล ขอบคุณอีกครั้ง.
Matrym

1
เหตุใดเอกสารของไมโครซอฟท์จึงแสดงโดยใช้addEventListenerแล้ว msdn.microsoft.com/en-us/library/ie/cc197015(v=vs.85).aspx
wmarbut

1
@wmarbut addEventListener ถูกเพิ่มเข้ามาฉันเชื่อว่า IE9 attachEvent ถูกลบออกใน IE 11 คำถามเดิมมาจากปี 2009 CMS ได้จัดเตรียมวิธีการที่ถูกต้องและมีประสิทธิภาพซึ่งยังคงใช้งานได้แม้กับ IE 11
Colin Young

นั่นอธิบายว่าเหตุใดจึงใช้งานได้บนอินเทอร์เน็ต แต่ไม่สามารถใช้กับอินทราเน็ตสำหรับฉันได้เนื่องจากฉันมีการตั้งค่าสำหรับไซต์อินทราเน็ตที่ตั้งค่าเป็นโหมดความเข้ากัน
Roger Perkins

32

ในกรณีที่คุณใช้ JQuery 2.x โปรดเพิ่มสิ่งต่อไปนี้ในไฟล์

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

สิ่งนี้ได้ผลสำหรับฉัน


4
สำหรับผู้ที่ใช้ IE เวอร์ชัน <= 8 สิ่งนี้จะไม่สามารถแก้ไขปัญหาได้
ninjaneer

5

ลองเพิ่ม

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

หลังแท็กเปิดหัว


3
สำหรับผู้ที่ใช้ IE เวอร์ชัน <= 8 สิ่งนี้จะไม่สามารถแก้ไขปัญหาได้
ninjaneer

5

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

แม้ว่าฉันจะแนะนำให้หลีกเลี่ยงการเขียน wrapper การจัดการเหตุการณ์ของคุณเองและใช้เฟรมเวิร์ก JavaScript แทน (เช่นjQuery , Dojo , MooTools , YUI , Prototypeฯลฯ ) และหลีกเลี่ยงการสร้างการแก้ไขสำหรับสิ่งนี้ด้วยตัวคุณเอง

โดยวิธีการที่อาร์กิวเมนต์ที่สามในรูปแบบ W3C ของเหตุการณ์ที่มีจะทำอย่างไรกับความแตกต่างระหว่างเดือดปุด ๆ และจับเหตุการณ์ ในเกือบทุกสถานการณ์คุณจะต้องการจัดการกับเหตุการณ์ที่เกิดขึ้นไม่ใช่เมื่อถูกจับ จะมีประโยชน์เมื่อใช้การมอบหมายเหตุการณ์กับสิ่งต่างๆเช่นเหตุการณ์ "โฟกัส" สำหรับกล่องข้อความซึ่งจะไม่เกิดฟอง




0

การใช้<meta http-equiv="X-UA-Compatible" content="IE=9">IE9 + รองรับaddEventListenerโดยการลบ "on" ในชื่อเหตุการณ์เช่นนี้:

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

0

ปัญหาคือ IE ไม่มีaddEventListenerวิธีการมาตรฐาน IE ใช้ของตัวเองattachEventซึ่งก็ทำได้เหมือนกัน

คำอธิบายที่ดีของความแตกต่างและยังเกี่ยวกับพารามิเตอร์ที่ 3 ที่สามารถพบได้ที่ quirksmode

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.