JavascriptのMSIEとaddEventListenerの問題?


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

Chrome / Safariでは、ページのコンテンツがコピーされているときに、上記で「beforecopy」機能が実行されます。MSIEはこの機能もサポートすることになっていますが、何らかの理由で次のエラーが発生します。

「オブジェクトはこのプロパティまたはメソッドをサポートしていません」

さて、Internet Explorerはbodyノードで動作しないことは理解していますが、IDでノードを提供することは問題なく機能すると思いました。私が間違っていることについて誰かが何か考えを持っていますか?前もって感謝します。

** 3番目のパラメータ「False」が何に適しているかを教えてくれる人にはボーナスポイント。


ここでは、キャプチャフェーズを説明し、良い記事でuseCapture非常によくは:coding.smashingmagazine.com/2013/11/12/...
feeela

回答:


185

IEattachEventでは、標準ではなくを使用する必要があります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');
});

上記のコードの例をここで実行できます

の3番目の引数addEventListeneruseCapture;です。trueの場合、ユーザーがイベントキャプチャを開始したいことを示します。


1
ご回答ありがとうございます。私はあなたが投稿したものを試したところ、うまくいきました。今私を失望させているのは、「コピー」イベントは機能していないが、「オンクリック」イベントは機能しているということです。具体的には、quirksmodeが機能するはずだと述べているため、これは奇妙です。quirksmode.org/ dom / events / cutcopypaste.html何か アイデアはありますか?
Matrym 2009年

そのコメントをスクラッチします。送信したものを分離して試しましたが、クリックをコピーに変更しても機能します。再度、感謝します。
Matrym 2009年

1
なぜマイクロソフト自身のドキュメントはaddEventListenerそれを使用して示しているのですか?msdn.microsoft.com/en-us/library/ie/cc197015(v=vs.85).aspx
wmarbut 2013

@wmarbut addEventListenerは、IE9に追加されたと思います。attachEventは、元の質問は、2009年からCMSでもIE 11で作業を続けて正しい、堅牢な方法で提供してきたあるIE 11で削除されました
コリン・ヤング

これは、イントラネットサイトの設定を互換モードに設定しているため、インターネットでは機能するがイントラネットでは機能しない理由を説明しています。
ロジャーパーキンス

32

JQuery 2.xを使用している場合は、以下を追加してください。

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

これは私のために働いた。


3
IEバージョン<= 8を実行している場合、これで問題が解決することはありません。
ninjaneer 2014

5

追加してみてください

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

オープニングヘッドタグの直後


2
IEバージョン<= 8を実行している場合、これで問題が解決することはありません。
ninjaneer 2014

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

独自のイベント処理ラッパーを作成することは避け、代わりにJavaScriptフレームワーク(jQueryDojoMooToolsYUIPrototypeなど)を使用することをお勧めしますが、これに対する修正を自分で作成する必要はありません。

ちなみに、イベントのW3Cモデルの3番目の引数は、バブリングとイベントのキャプチャの違いに関係しています。ほとんどすべての状況で、イベントがキャプチャされたときではなく、バブルしたときにイベントを処理する必要があります。これは、バブルしないテキストボックスの「フォーカス」イベントなどでイベント委任を使用する場合に役立ちます。


2

IE11以降、を使用する必要がありますaddEventListenerattachEventは非推奨であり、エラーをスローします。



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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.