4

jQuery に依存しない Javascript ライブラリに取り組んでいますが、テストでは jQuery と QUnit を使用できます。ライブラリでは、jQuery と同じように要素にイベントをアタッチします。

if (document.addEventListener) {
  tab.addEventListener('click', MyModule.show, false);
} else if (document.attachEvent) {
  tab.attachEvent('click', MyModule.show);
}

QUnit テストで呼び出してみ$('#tab').click();ましたが、イベント ハンドラーが呼び出されません。

4

2 に答える 2

12

jQuery には、DOM のイベント登録とは別の独自のイベント登録システムがあります。を呼び出すと$(something).click()、登録済みのすべての jQuery ハンドラと登録済みのonclickハンドラが起動しますが、それ以外は起動しません。例えば、

document.body.addEventListener('click', function() { alert('event') }, false);
document.body.onclick = function() { alert('onclick'); };      

$('body').click(); // alerts "onclick"

を呼び出すとdocument.body.onclick()、2 番目のイベントのみが発生し、「onclick」と警告されます。両方のイベントを発生させるには、イベント オブジェクトを作成し、問題の要素 (この場合は body) にディスパッチします。ここで例を見つけることができます。当然のことながら、IE は別のメカニズムを使用して同じことを行うため、fireEventを呼び出す必要があります。

これは、最新のブラウザーの非クロスブラウザーの例です (上記の MDC の記事から引用)。

var clickEvent = document.createEvent('MouseEvents');
clickEvent.initMouseEvent('click', true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);

document.body.dispatchEvent(clickEvent);
于 2010-09-02T22:18:20.787 に答える
1

(確かではありません) jQuery は、ネイティブ イベント システムの上に独自のイベント システムを使用します。$(el).click()ネイティブ システムではなく、そのイベント システムで直接呼び出されます。(/わからない)

document.getElementById('tab').onclick();

ネイティブと同等ですが、要素のクエリで実際に要素が見つかるかどうかを最初に確認することをお勧めします。dom の準備ができたら、QUnit テストを初期化していますか?

また、attachEvent (IE) の場合、イベントの前に「on」を付ける必要があります。

tab.attachEvent('onclick', listenerFn);

ps。実際には、IE に相当するプレフィックス「on」が欠落していることが問題だったと思います。変更して $().click() をもう一度テストしてください。

于 2010-09-02T22:07:43.290 に答える