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

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

在單擊事件偵聽器中添加第二個單擊事件偵聽器

在單擊事件偵聽器中添加第二個單擊事件偵聽器

慕勒3428872 2021-11-04 16:27:06
我嘗試使用 D3 在現有的單擊事件偵聽器中添加第二個單擊事件偵聽器,但未成功。基本上,我有一張事件地圖(圓圈)。我希望用戶能夠點擊一個圓圈并出現一個彈出窗口。我希望該彈出窗口僅在用戶第二次單擊任何地方時消失。因此,單擊一個圓圈將實例化彈出窗口并綁定它,第二次單擊 ANYWHERE 將使彈出窗口消失并將圓圈恢復為僅響應懸停,除非再次單擊。我通過在圓事件偵聽器中添加另一個“主體”點擊事件偵聽器來解決這個問題:  // event listener: if events (circles) are clicked, instantiate pop-up  d3.selectAll(".events").on("click", function(d) {         console.log("event clicked!")         //disable hover event listeners         d3.selectAll(".events").on("mouseout", null);         d3.selectAll(".events").on("mouseover", null);                            popup.transition()                         .duration(200)                      .style("opacity", .9);              popup.html(d.ArtistBio)        // if user clicks a SECOND time, anywhere, make popup disappear        d3.select("body").on("click", function(d) {             console.log("body clicked")            //hide popup            popup.transition()                          .duration(200)                        .style("opacity", 0);              //revert back to hover, unless user clicks again!            d3.selectAll(".events").on("mouseout", true);            d3.selectAll(".events").on("mouseover", true);            d3.selectAll(".events").on("mouseout", function(d) {             console.log("mousing out!")                      popup.transition()                          .duration(200)                        .style("opacity", 0);                            })            // mouseover event listers added back in            d3.selectAll(".events").on("mouseover", function(d) {               popup.transition()                         .duration(200)                      .style("opacity", .9);              popup.html(d.ArtistBio)          })                    })我的問題是這兩個事件同時被觸發(fā),而不是按順序觸發(fā):一旦我點擊一個圓事件,主體點擊事件偵聽器也被實例化,因此彈出窗口在呈現后立即被刪除。有沒有辦法以類似于我上面描述的方式做我正在嘗試做的事情?提前致謝。
查看完整描述

2 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

點擊會冒泡,這是正常的預期。為避免這種情況,請使用event.stopPropagation. 您還可以使用d3.events(當它們存在時...):


d3.event.stopPropagation();

這是演示,單擊矩形及其外部:


d3.select("rect").on("click", function() {

  console.log("rectangle clicked");

  d3.event.stopPropagation();

  d3.select("body").on("click", function() {

    console.log("body clicked")

  })

})

<script src="https://d3js.org/d3.v5.min.js"></script>

<svg>

  <rect width="50" height="50" x="100" y="50"></rect>

</svg>


查看完整回答
反對 回復 2021-11-04
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

你可以這樣做:


  // event listener: if events (circles) are clicked, instantiate pop-up

  d3.selectAll(".events").on("click", function(d) { 

        console.log("event clicked!")

        const currentCircle = this; 

        //disable hover event listeners

         d3.selectAll(".events").on("mouseout", null);

         d3.selectAll(".events").on("mouseover", null);              

              popup.transition()        

                 .duration(200)      

                .style("opacity", .9);

              popup.html(d.ArtistBio)

        // if user clicks a SECOND time, anywhere, make popup disappear

        d3.select("body").on("click", function(d) { 

    if(this !== currentCircle){

            console.log("body clicked")

            //hide popup

            popup.transition()        

                  .duration(200)      

                  .style("opacity", 0);  

            //revert back to hover, unless user clicks again!

            d3.selectAll(".events").on("mouseout", true);

            d3.selectAll(".events").on("mouseover", true);

            d3.selectAll(".events").on("mouseout", function(d) { 

            console.log("mousing out!")      

                popup.transition()        

                  .duration(200)      

                  .style("opacity", 0);              

              })


            // mouseover event listers added back in

            d3.selectAll(".events").on("mouseover", function(d) { 

              popup.transition()        

                 .duration(200)      

                .style("opacity", .9);

              popup.html(d.ArtistBio)


          })

       }            

        })

在 body 事件偵聽器中,檢查單擊的元素是否與單擊的當前圓/彈出窗口不同。


查看完整回答
反對 回復 2021-11-04
  • 2 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號