javascript - 如何删除 javascript 中的所有点击处理程序

标签 javascript jquery html d3.js click

我的 html 页面中有 d3 元素,其中包含包含类气泡的“g”元素,它们的结构如下所示。当我单击时,事件会注册并添加单击类。函数 recordData 注册事件。我需要在一次迭代后删除“g”元素上的所有单击事件,这样如果在另一次迭代中重复任何 g 元素,它就不会注册两次。我如何删除“g”元素上的所有事件监听器,特别是我通过 recordData 添加的事件监听器。

<g id="4119-virtuality" angle="3.7699111843077517" class="bubble" transform="translate(102.63251712643411,493.138632973281)" style="pointer-events: auto; fill: black; font-weight: bold;">
  <circle r="52.21875" style="opacity:0"></circle>
  <rect rx="5" ry="5" style="fill: rgb(170, 170, 170);" x="-52.21875" y="-45" width="104.4375" height="90"></rect>
  <text text-anchor="middle" style="font-size:20" alignment-baseline="middle">
    <tspan x="0" y="0">virt</tspan>
  </text>
</g>

function recordData(){
  var element = document.getElementsByClassName("bubble");
  for(var i = 0; i < element.length; i++){
    element[i].addEventListener("click", function(){
      var id = this.attributes.id.value;
      var index = findWithAttr(local_data, "keywordId", id);

      if(this.attributes.class.value.split(" ").indexOf("clicked") == -1)
      {
        console.log("Clicked");
        local_data[index].sub_rel = true; // Update the sub relevance to the original array
        // Store the clicked elements temporarily
        clicked_elements.push({
          id: id,
          keyword: local_data[index].keyword,
          obj_rel: local_data[index].obj_rel,
          sub_rel: local_data[index].sub_rel
        })
        var bubs = svg.selectAll(".contextbubble,.bubble");
        var b = bubs[0].filter(function(d) {return d.id === id});
        d3.select(b[0]).style("font-weight", "bold");
        d3.select(b[0]).classed("clicked", true);

      }
      else if (this.attributes.class.value.split(" ").indexOf("clicked") > -1)
      {
        console.log("Unclicked");
        local_data[index].sub_rel = false; 
        var indx = findWithAttr(clicked_elements, "id", id);
        clicked_elements.splice(indx, 1);
        var bubs = svg.selectAll(".contextbubble,.bubble");
        var b = bubs[0].filter(function(d) {return d.id === id});
        d3.select(b[0]).style("font-weight", "normal");
        d3.select(b[0]).classed("clicked", false);
      }
    }, false);
  }
}

最佳答案

在添加之前将其删除:

 var recordData = function() {
 var element = document.getElementsByClassName("bubble");
  for (var i = 0; i < element.length; i++) {
    element[i].removeEventListener("click", event);
    element[i].addEventListener("click", event);
  }
}

var event = function() {

  var id = this.attributes.id.value;
  var index = findWithAttr(local_data, "keywordId", id);

  if (this.attributes.class.value.split(" ").indexOf("clicked") == -1) {
    console.log("Clicked");
    local_data[index].sub_rel = true; // Update the sub relevance to the original array
    // Store the clicked elements temporarily
    clicked_elements.push({
      id: id,
      keyword: local_data[index].keyword,
      obj_rel: local_data[index].obj_rel,
      sub_rel: local_data[index].sub_rel
    })
    var bubs = svg.selectAll(".contextbubble,.bubble");
    var b = bubs[0].filter(function(d) {
      return d.id === id
    });
    d3.select(b[0]).style("font-weight", "bold");
    d3.select(b[0]).classed("clicked", true);

  } else if (this.attributes.class.value.split(" ").indexOf("clicked") > -1) {
    console.log("Unclicked");
    local_data[index].sub_rel = false;
    var indx = findWithAttr(clicked_elements, "id", id);
    clicked_elements.splice(indx, 1);


    var bubs = svg.selectAll(".contextbubble,.bubble");
    var b = bubs[0].filter(function(d) {
      return d.id === id
    });
    d3.select(b[0]).style("font-weight", "normal");
    d3.select(b[0]).classed("clicked", false);
  }


}

关于javascript - 如何删除 javascript 中的所有点击处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37761695/

相关文章:

尽管留在范围内,Javascript 对象仍会丢失状态

html - 下拉UL在IE中变透明

javascript - 如何将元素放回到前一个位置?

javascript - 如何使用 webpack 将 html、js 和 css 打包到一个 html 文件中?

javascript - 我在 Javascript 中有一个对象数组。如何循环遍历它以查找 'fname' 键的出现次数

javascript - 集群渲染时缩放会导致 map 卡住

javascript - 向下滚动时高度会发生变化

html - 另一个 CSS 布局难题

javascript - 如何在我通过页面切换时切换每个元素

javascript - 如何在 JavaScript 中添加从一个函数到另一个函数的转换?