EventListenerを置くこの試みの両方のバージョンで_Uncaught TypeError: Illegal invocation
_を取得します:(ターゲットをクリックしたときではなく、リスナーを追加する必要があるときにエラーが発生します)
ronan.addEventListener("click", alert, false);
addEventListener.apply(ronan, ["click", alert, false]);
ronan
はコンソールから正常に返されるdiv
要素なので、それが問題だとは思いません。このエラーが発生する理由はありますか? this スレッドを読みましたが、それからは理解できませんでした。
alert
を関数でラップする必要があります。これは機能します:
ronan.addEventListener("click", function() { alert('Hi'); }, false);
これが証明のための フィドル です。リスナーが実行されると、その関数内のalert
の値が、それがリッスンしているオブジェクトに設定されるため、this
を単独で使用することは機能しません。たとえば、リスナーをronan
に設定すると、そのリスナー内でthis === ronan
になります。この関数はalert
がthis
と等しいことを期待しているため、これはwindow
に問題をもたらします。関数を別の関数でラップするか、this
が期待するものにバインドすることで、これを回避できます(しゃれは意図されていません)。
document.body.addEventListener('click', alert.bind(window), false);
IE <9では、attachEvent
ではなくaddEventListener
を使用する必要があることを忘れないでください。
apply
/call
とaddEventListener
まったく別の関数であるwindow.addEventListener
とは対照的に、引数をHTMLElement.prototype.addEventListener
に適用しようとしているため、2回目の試行は機能しません。
// This won't work
addEventListener.apply(ronan, ["click", alert.bind(window), false]);
// This will work
HTMLElement.prototype.addEventListener.apply(ronan, ['click', alert.bind(window), false]);