我的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>
&#13;
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);
}
}
&#13;
答案 0 :(得分:1)
在添加之前将其删除:
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);
}
}
答案 1 :(得分:0)
您可以使用off()删除类似的事件:
这将删除绑定到此元素的所有点击事件。
$("#test").off("click").click(function() { //you code });
看看这个:stackoverflow
答案 2 :(得分:0)
您可以使用DOM removeEventListener
(与 addEventListener
相对)。
示例:
var element = document.getElementById("myDIV")
, onClick = function() { /**/ };
element.addEventListener("click", onClick); // to bind handler
element.removeEventListener("click", onClick); // to unbind handler
请记住保存对使用addEventListener绑定的处理函数的引用,以将其删除。
如果您使用 jQuery , Zepto.js ,则可以使用$(element).on("click", myFunction)
和$(element).off("click", myFunction)
取消绑定。