Javascript事件绑定持久性

Jas*_*son 1 javascript jquery javascript-events

如果你有一个不断渲染/销毁的HTML元素,那么对HTML的javascript事件绑定是否仍然存在,或者是否需要在创建/销毁周期中绑定/取消绑定事件?

我正在使用D3来生成美国各县的地图.另外,我正在生成工具提示覆盖,其中包含点击事件上的按钮以进行有效选择.

click事件处理程序的一部分,我将模板的HTML绑定到tooltip元素,然后将javascript事件处理程序绑定到所述HTML

thisObj._tooltip.template = template : "<div id = 'tooltip_template'>" + 
            "<div class = 'county_data'></div>" +
            "<img src = '/static/images/delete.png' width = '28' height = '28' class = 'delete_logo' id = 'close_tooltip' />" +
            "<button id = 'add_prospective_market' class = 'tooltip_button'>Prospective Market</button>" +
            "<button id = 'add_market' class = 'tooltip_button'>Market County</button>" +
            "<button id = 'remove_market' class = 'tooltip_button'>Remove Market</button></div>"

thisObj._tooltip.tooltip.html(thisObj._tooltip.template)
  .style("left", (d3.event.pageX + 10) + "px")
  .style("top", (d3.event.pageY - 50) + "px")
  .style("pointer-events" , "auto")
  .style("width", "400px")
  .style("height", "150px");

$(".county_data").text(d.name + ", " + d.properties.StateCode);

addTooltipHandlers();

thisObj._tooltip.tooltip.transition()
 .duration(800)
 .style("opacity", 1);
Run Code Online (Sandbox Code Playgroud)

我将事件处理程序绑定到元素via

var addTooltipHandlers = function(){
  $("#add_market").on("click", function(){
    console.log("Adding new Market")
  });

  $("#add_prospective_market").on("click", function(){
    console.log("Adding new Prospective market")
  });

  $("#remove_market").on("click", function(){
     console.log("Removing this market")
  });

  $("#close_tooltip")
    .on("mouseover", function(){
      $(this).css({"border-color" : "red", "opacity" : 1});
    })
    .on("mouseout", function(){
      $(this).css({"border-color" : "black", "opacity" : 0.5});
    })
    .on("click", function(){
      console.log("Closing tooltip");

      d3.selectAll($("#" + thisObj._tooltip.county))
        .style("fill", thisObj._currentCounty.color);

      thisObj._tooltip.tooltip.transition()
        .duration(500)
        .style("opacity", 0)
        .style("pointer-events", "none");

      thisObj._tooltip.open = false;
      removeTooltipHandlers();
   });
}
Run Code Online (Sandbox Code Playgroud)

由于工具提示仅在屏幕上可见,直到注册了close事件,然后它被销毁,一旦事件监听器绑定到一个元素,当该元素被销毁并重新创建时,该绑定是否仍然存在?

vit*_*ore 13

为了使事件处理程序保持不变,您必须在jquery中使用事件委托

代替

$(...).on(event, handler)
Run Code Online (Sandbox Code Playgroud)

使用

$(...).on(event, selector, handler)
Run Code Online (Sandbox Code Playgroud)

例如

$('body').on('click','a.saveButton', saveHandler)
Run Code Online (Sandbox Code Playgroud)

这样您就可以将事件处理程序附加到body元素而不是可以销毁或添加到DOM的实际元素.所以处理程序将一直工作,直到你关闭它们.

对于所有全局事件处理程序,您可以使用事件命名空间,例如:

$('body').on('click.app','a.saveButton', saveHandler)
$('body').on('click.app','a.addButton', addHandler)
Run Code Online (Sandbox Code Playgroud)

这将允许您将off所有这些组合在一起:

$('body').off('.app')
Run Code Online (Sandbox Code Playgroud)

更新:非常简单的jsfiddle 来显示事件委托.