第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單擊事件偵聽器調(diào)用的函數(shù)在不單擊的情況下被調(diào)用,但僅在第二次運行時調(diào)用

單擊事件偵聽器調(diào)用的函數(shù)在不單擊的情況下被調(diào)用,但僅在第二次運行時調(diào)用

MMTTMM 2022-06-09 19:46:05
這是一個謎題:我正在嘗試創(chuàng)建一個簡單的選擇你自己的路徑游戲,它從本地 JSON 文件中獲取內(nèi)容。運行時,它將每個場景(JSON 文件中的“Section”)分解為多個段落,并將第一個段落添加到 DOM,并在其周圍的 div 上附加一個事件偵聽器。每次用戶單擊“容器”時,都會從該部分添加另一個段落,直到顯示所有段落。之后,如果用戶再次單擊“容器”,則會添加三個選項,每個選項都附加了自己的事件偵聽器。單擊這些選項之一時,場景(或“部分”)將更改為選定的選項。HTML“容器”被清空,該過程通過添加新場景(部分)的第一段重新開始。問題是它對第一部分和選項工作正常,但是在用戶單擊選項后,它會加載新場景的兩段而不是一個。它應該加載一個段落并等待點擊事件,但它實際上加載了一秒鐘。第二段是通過 readyToUpdate 函數(shù)加載的,該函數(shù)只能由事件偵聽器調(diào)用(尚未觸發(fā))。{      "Section_1": {        "Content": "Dark corner paragraph one<>Dark corner paragraph two<>Dark corner paragraph three",        "Choices": [            "Go to the garden<>24",            "Go to the terrace<>95",            "Go to the beach<>145"        ]    },    "Section_24": {        "Content": "Garden paragraph one<>Garden paragraph two<>Garden paragraph three",        "Choices": [            "Go to the dark corner<>1",            "Go to the terrace<>95",            "Go to the beach<>145"        ]    },    "Section_95": {        "Content": "Terrace paragraph one<>Terrace paragraph two<>Terrace paragraph three",        "Choices": [            "Go to the dark corner<>1",            "Go to the garden<>24",            "Go to the beach<>145"        ]    },    "Section_145": {        "Content": "Beach paragraph one<>Beach paragraph two<>Beach paragraph three",        "Choices": [            "Go to the dark corner<>1",            "Go to the garden<>24",            "Go to the terrace<>95"        ]    }}    <div id="container"></div>
查看完整描述

2 回答

?
慕容森

TA貢獻1853條經(jīng)驗 獲得超18個贊

我相信正在發(fā)生的事情是,當您單擊一個選項并調(diào)用選項單擊偵聽器時,您正在經(jīng)歷update()并向updateParagraphs()容器添加一個新的單擊偵聽器。但與此同時,click 事件正在傳播到容器,并被您剛剛添加的新容器偵聽器捕獲。


所以你有兩個選擇:第一個,正如@wth193 所建議的,是使用 setTimeout() 在下一個滴答聲中添加容器監(jiān)聽器。


function updateParagraphs(){

    // ...

    // container.addEventListener('click', readyToUpdate, {once: true});

    setTimeout(function () {

        container.addEventListener('click', readyToUpdate, {once: true});

    });

}

在我看來,一個更干凈(更清晰)的解決方案是使用Event.stopPropagation()。


function choiceUpdater(e){

  console.log("Enter choiceUpdater");

  e.stopPropagation();

  // ...

}

這樣,click 事件僅由選擇元素捕獲,而不是由容器捕獲。


查看完整回答
反對 回復 2022-06-09
?
慕萊塢森

TA貢獻1810條經(jīng)驗 獲得超4個贊

function updateParagraphs(){

    ...

    // container.addEventListener('click', readyToUpdate, {once: true});

    setTimeout(function () {

        container.addEventListener('click', readyToUpdate, {once: true});

    });

}

我認為打破調(diào)用堆棧的 setTimeout 似乎有效,但我無法解釋原因。


查看完整回答
反對 回復 2022-06-09
  • 2 回答
  • 0 關(guān)注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號