[解決済み] クリックイベントリスナーの内部でclick()をトリガーしても無限ループにならないのはなぜですか?
2023-07-13 01:18:07
質問
このJavaScriptコードのプログラムフローを説明できる方を教えてください。
const $leaveRoom = document.querySelector('#leave-button');
let a = 1;
$leaveRoom.addEventListener('click', () => {
console.log(a);
console.log("check");
a++;
$leaveRoom.click();
console.log(a);
a++;
});
<button id="leave-button">Leave Room</button>
The Output was:
1
check
2
check
3
4
この質問は馬鹿に聞こえるかもしれませんが、私はJavaScriptに新しいです。私はこのコードのプログラムフローを理解することができません。私はどのように出力に3 & 4を取得したかを知りたいです。
どのように解決するのですか?
<ブロッククオート
この問題のキーとなるのが
隠しフラグ
であり、各
element.click()
メソッドになります。
各要素は関連するクリック中フラグを持ち、これは初期状態では設定されていません。
doc: https://html.spec.whatwg.org/multipage/interaction.html#dom-click
このメソッドが有効になるとすぐに、このフラグは
progess Status == unset
から
progess Status == active
(擬似コード)
(含まれるコードが完全に実行されると初期状態に戻る)
このフラグが
active
の状態である場合、このメソッドへの呼び出しは無視されます。
以下は、`console.log()`の実行順序を示す私のオリジナルの投稿です。
const bt_leaveRoom = document.querySelector('#leave-button')
var counter = 0
var origin = 'event clic'
bt_leaveRoom.addEventListener('click', () =>
{
let source = origin
console.log(`_first console.log(): counter = ${ ++counter }, origin = ${source}`)
origin = 'call'
bt_leaveRoom.click()
console.log(`second console.log(): counter = ${ ++counter }, origin = ${source}`)
})
<button id="leave-button">Leave Room</button>
このようにコーディングすると、隠しフラグが同じように動作します。
この行を置き換えてください。
bt_leaveRoom.click()
になります。
if (source !== 'call') bt_leaveRoom.click()
しかし実際には、システムはメソッド隠しフラグ (
progress flag
?)
である可能性があります。
(擬似コードでは)
if (progress_flag_of_bt_leaveRoom.click() is unset) do { bt_leaveRoom.click() }
関連
-
[解決済み] HTML5のlocalStorageにオブジェクトを格納する方法は?
-
[解決済み] REST APIからデータを取得しようとしたときに、要求されたリソースに'Access-Control-Allow-Origin'ヘッダーが存在しない。
-
[解決済み] クリックイベントのリスナーに'return false'を追加するとどうなりますか?
-
[解決済み】jQueryのクリックイベントが複数回発生する件
-
[解決済み】JavaScriptのクリックイベントリスナーをクラスで使用する。
-
[解決済み】Reduxの@connectデコレーターの「@」(アットマーク)って何?
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)
-
[解決済み] これは純関数ですか?