2

2 つの特定の Javascript に関する質問がありますが、おそらく 1 つの一般的な回答で答えられるでしょう。対応する一般的な質問もお気軽に送信してください。私は自分自身を表現することが困難です。

  • 単一の Javascript コールバックで複数の DOM 要素を操作する場合、ビューは個々の操作ごとに「ライブ」で更新される可能性がありますか、またはコールバックが返された後にアトミックに更新されますか?

  • ユーザーが HTML 要素を短時間に 2 回クリックし、対応するクリック ハンドラーが HTML 要素を無効にした場合、ハンドラーが 2 回実行されないという保証はありますか?

4

3 に答える 3

1

先制的に、私はこれに対する標準の引用を持っていません。これは厳密に私の経験です。

Javascript がリアルタイムで実行されているときに、表示されるピクセルが更新されたことに気付いたことはありません。ブラウザの標準操作中はそうではないのではないかと思います - デバッグで例外が発生する可能性は確かにあります。ただし、単一の関数呼び出しの上部と下部の間の DOM 要素で同期リフロー計算が発生することを確認しましたが、これらのリフロー計算はピクセル バッファーに到達しませんでした (私が気付きました)。これらは同期的に発生するようです。

function foo() {
    $('#myElement').width(); // 100
    $('#myElement').parent().width(); // 150
    $('#myElement').css('width', 200);
    $('#myElement').width(); // 200
    $('#myElement').parent().width(); // 250
}

クリック ハンドラー内で無効になっている要素の複数回のクリックについては、2 回目のクリックが発生しないと思われます。オペレーティング システムがクリック イベントを受け取ると、それがブラウザに渡され、キューに入れられると思います。このキューは、Javascript を実行する同じスレッドによって処理されます。OSのクリック イベントは、Javascript の実行が完了するまでキューに残ります。実行が完了すると、OS のクリック イベントは削除され、ブラウザのクリック イベントとしてラップされ、DOM を介してバブリングされます。この時点で、ボタンは既に無効になっており、クリック イベントはボタンをアクティブにしません。

私は間違っているかもしれませんが、この同じスレッドの別の操作として、ピクセルバッファーが画面上に描画されていると推測しています。

これは、他の場所で引用および参照されているのを見た標準の漠然とした記憶に基づいています。リンクはありません。

于 2013-10-31T20:17:10.517 に答える
0

最初の箇条書き: アップデートは公開されます。たとえば、次の関数を onclick ハンドラにアタッチします。

function(){
    var d = document.getElementById("myelement") 
    d.setAttribute("align", "center")
    d.setAttribute("data-foo","bar")
    d.setAttribute("data-bar","baz")
}

これをブラウザにロードして、最初の行にブレークポイントを設定します。イベントをトリガーし、DOM を見ながら行ごとにステップスルーします。更新はライブで行われます。一度に行われるわけではありません。

それらをアトミックに発生させたい場合は、問題のDOM要素を複製し、複製に変更を加えてから、元の要素を複製で置き換えます。複製された要素は引き続きリアルタイムで更新されますが、ユーザーに表示される効果はアトミックです。

2 番目の箇条書き: 要素が無効になった後に 2 番目のクリック イベントが発生した場合、はい、2 番目のコールバックは取得されません。ただし、最初のクリックと無効化呼び出しの間に遅延があり (たとえば、要素を無効にする必要があるかどうかを判断するために、ある種の長いチェックを実行する必要がある)、その遅延内に 2 回目のクリックが発生すると、コールバックが発生します。もう一度。ブラウザーは、特定のスクリプトで複数のクリック イベントが許容されない動作であることを認識する方法がありません。

于 2013-10-31T18:26:45.840 に答える
0

すべてのスクリプトの実行は、同じスレッド内で発生します。したがって、同時にアクションを実行することはできず、要素の同時変更について心配する必要はありません。これは、現在実行中のクリック ハンドラーが起動されることを心配する必要がないことも意味します。ただし、これは、スクリプトが終了したときにすぐに再起動できないという意味ではありません。実行は非常に高速で、見分けがつかない場合があります。

于 2013-10-31T18:28:17.553 に答える