Javascript'te MSIE ve addEventListener Problemi?


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

Chrome / Safari'de, sayfanın içeriği kopyalanırken yukarıdakiler "kopyalama öncesi" işlevini çalıştıracaktır. MSIE'nin de bu işlevi desteklemesi gerekiyor, ancak nedense bu hatayı alıyorum:

"Nesne bu özelliği veya yöntemi desteklemiyor"

Şimdi, anladığım kadarıyla, Internet Explorer vücut düğümüyle oynamayacak, ancak kimliğe göre bir düğüm sağlamanın iyi çalışacağını düşünürdüm. Neyi yanlış yaptığım hakkında herhangi bir fikri olan var mı? Şimdiden teşekkürler.

** 3. parametre olan "Yanlış" ın ne işe yaradığını bana söyleyebilen herkese bonus puan.


Yakalama aşamasını useCaptureçok iyi açıklayan güzel bir makale : coding.smashingmagazine.com/2013/11/12/…
Feeela

Yanıtlar:


186

IE'de attachEventstandart yerine kullanmanız gerekir addEventListener.

Yaygın bir uygulama, addEventListeneryöntemin mevcut olup olmadığını kontrol etmek ve kullanmaktır, aksi takdirde kullanın attachEvent:

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

Bunu yapmak için bir işlev yapabilirsiniz:

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

Yukarıdaki kodun bir örneğini burada çalıştırabilirsiniz .

Üçüncü argüman addEventListenerise useCapture; doğruysa, kullanıcının olay yakalamayı başlatmak istediğini belirtir .


1
Cevabınızı takdir ediyorum. Gönderdiğin şeyi denedim ve işe yaradı. Beni şu anda kaçıran şey, "copy" olayının çalışmaması, ancak "onclick" olayının olmasıdır. Spesifik olarak, bu garip çünkü quirksmode çalışması gerektiğini belirtir: quirksmode.org/dom/events/cutcopypaste.html Herhangi bir fikriniz var mı?
Matrym

O yorumu kaşı. Gönderdiğiniz şeyi izole ettim ve denedim ve kopyalamak için tıklamayı değiştirmek işe yarıyor. Tekrar teşekkürler.
Matrym

1
microsoft'un kendi belgeleri neden addEventListenero zaman kullanmayı gösteriyor ? msdn.microsoft.com/en-us/library/ie/cc197015(v=vs.85).aspx
wmarbut

1
@wmarbut addEventListener eklendi, inanıyorum ki IE9. attachEvent, IE 11'de kaldırıldı. Asıl soru 2009'dan geliyor. CMS, IE 11 ile bile çalışmaya devam eden doğru ve sağlam yöntemi sağladı.
Colin Young

Bu, intranet siteleri için ayarlarım uyumluluk moduna ayarlandığından, neden internette çalıştığını ancak benim için intranette çalışmadığını açıklıyor.
Roger Perkins

32

JQuery 2.x kullanıyorsanız, lütfen aşağıdakileri ekleyin:

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

Bu benim için çalıştı.


4
IE sürümlerini <= 8 çalıştıranlar için bu sorunu çözmeyecektir.
ninjaneer

5

eklemeyi dene

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

head açılış etiketinden hemen sonra


3
IE sürümlerini <= 8 çalıştıranlar için bu sorunu çözmeyecektir.
ninjaneer

5

Internet Explorer (IE8 ve altı) desteklemez addEventListener(...). attachEventYöntemi kullanarak kendi olay modeline sahiptir . Bunun gibi bir kod kullanabilirsiniz:

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

Kendi olay işleme sarmalayıcınızı yazmaktan kaçınmanızı ve bunun yerine bir JavaScript çerçevesi ( jQuery , Dojo , MooTools , YUI , Prototype vb.) Kullanmanızı ve bunun için düzeltmeyi kendi başınıza oluşturmaktan kaçınmanızı öneririm .

Bu arada, W3C olay modelindeki üçüncü argüman, köpürme ve yakalama olayları arasındaki farkla ilgilidir . Neredeyse her durumda, olayları yakalandıklarında değil, kabarcık halindeyken ele almak isteyeceksiniz. Kabarcık oluşturmayan metin kutuları için "odak" olayları gibi şeylerde olay yetkilendirmesini kullanırken kullanışlıdır .


2

IE11'den itibaren kullanmanız gerekir addEventListener. attachEventkullanımdan kaldırıldı ve bir hata veriyor.



0

Kullanıldığında <meta http-equiv="X-UA-Compatible" content="IE=9">, IE9 + addEventListener, aşağıdaki gibi olay adındaki "açık" seçeneğini kaldırarak destekler :

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

0

Sorun, IE'nin standart addEventListeneryönteme sahip olmamasıdır . IE attachEvent, hemen hemen aynı şeyi yapan kendi özelliğini kullanır .

Farklılıkların iyi bir açıklaması ve ayrıca 3. parametre hakkında tuhaf modda bulunabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.