13

さて、私は長い間これを理解しようとしてきました、そしてついに調査する時間があります。タイトルが示すように「違いは何ですか?」私はこれが私が望むように機能することを知っています。

    addLoadEvent(converter);

// Converter
function converter() {
    var pixels = document.getElementById("pixels");
    pixels.addEventListener("keyup", updateNode, true);
    pixels.addEventListener("keydown", updateNode, true);
}

しかし、これはそうではなく、1回だけ実行されます。

    addLoadEvent(converter);

// Converter
function converter() {
    var pixels = document.getElementById("pixels");
    pixels.onkeydown = updateNode;
    pixels.onkeyup = updateNode;
}

私が欠けているもの...違いは何ですか?トピックへのリンクがあれば役立ちます。

私の仮定では、ハンドラーはリスナーのように動作する必要がありますが、そうではありません。実際、リスナーをaddLoadEvent関数に追加する必要がありますか?

4

2 に答える 2

10

addEventListener イベントにイベントハンドラー関数を追加します。この方法では、イベントハンドラーの数に制限はありません。

設定onxxxxx すると、イベントハンドラーがその1つの関数に設定されます。

Mozilla Developer Centralから:

addEventListenerは、単一のターゲットに単一のイベントリスナーを登録します。イベントターゲットは、ドキュメント内の単一ノード、ドキュメント自体、ウィンドウ、またはXMLHttpRequestの場合があります。

ターゲットに複数のイベントリスナーを登録するには、同じターゲットに対してaddEventListenerを呼び出しますが、イベントタイプまたはキャプチャパラメータは異なります。

また、古い方法の比較については、同じドキュメントのこの章を参照してください。onxxxx

于 2010-02-07T00:37:31.763 に答える
-4

ECMAスクリプトはコアが非常に柔軟であるため、関数、メソッド、事実上すべてを変数に割り当てることができるため、「addEventListener」などの変数に関数をアタッチする追加機能を使用することは、私のすべての意味で悪い設計です。 。

それで、あなたが私に尋ねるなら、私はペッカが言ったことすべてをあなたに話します、それは私が完全に同意します、そしてまたそれ:

pixels.onkeydown = updateNode;

ECMAスクリプト言語の自然なステートメントであり、次のとおりです。

pixels.addEventListener("keydown", updateNode, true);

DOMの補足がやり過ぎで、多くの開発者が最初の方法で一度設定するとどうなるかを考えさせ、後で他のスクリプトが別の方法で設定する可能性があります:)

于 2010-02-07T01:15:10.473 に答える