Javascript 事件绑定持久化

2023-12-25

如果您有一个不断呈现/销毁的 HTML 元素,那么与 HTML 的 Javascript 事件绑定是否持续存在,或者是否有必要在创建/销毁周期中绑定/取消绑定事件?

我正在使用 D3 生成美国各县的地图。此外,我正在生成一个工具提示叠加层,其中包含用于有效选择的单击事件上的按钮。

单击事件处理程序的一部分,我将模板的 HTML 绑定到工具提示元素,然后将 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);

我通过以下方式将事件处理程序绑定到元素

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();
   });
}

由于工具提示仅在注册关闭事件之前在屏幕上可见,然后被销毁,因此一旦事件侦听器绑定到元素,当该元素被销毁并重新创建时,该绑定是否仍然存在?


为了使事件处理程序持续存在,您必须使用事件委托 http://api.jquery.com/on/#direct-and-delegated-events在jquery中

代替

$(...).on(event, handler)

use

$(...).on(event, selector, handler)

例如

$('body').on('click','a.saveButton', saveHandler)

通过这种方式,您可以将事件处理程序附加到 body 元素,而不是可以销毁或添加到 DOM 的实际元素。因此,处理程序将一直工作,直到您将其关闭为止。

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

$('body').on('click.app','a.saveButton', saveHandler)
$('body').on('click.app','a.addButton', addHandler)

这将使您能够off所有这些加在一起:

$('body').off('.app')

更新:非常简单jsfiddle http://jsfiddle.net/vittore/wsxcL8mn/显示事件代表团。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 事件绑定持久化 的相关文章

随机推荐

  • 间歇性 SQL 异常 - 网络相关或特定于实例的错误

    我们有一个非常奇怪的间歇性问题 该问题在上个月左右开始出现 其中一些与 mssql 服务器的连接失败并出现错误 System Data SqlClient SqlException A network related or instance
  • 有什么方法可以检查变量是否是真正的 jqXHR?

    正如标题已经提到的 有没有办法检查变量是否是真正的jqXHR 我的意思是 想象的 var resource get resource if resource instanceof jqXHR do something 我试图解决的实际问题是
  • SQLAlchemy 基本问题

    我相信对于任何有 SQLAlchemy 经验的人来说 这都是基础知识 但我觉得这些文档没有什么帮助 而且我厌倦了挠头 给定两个类 class User Base tablename users id Column Integer prima
  • 包装 slf4j API

    我想将 slf4j 与 Logback 改造为遗留应用程序 好处是 遗留应用程序有自己的日志框架 所以我所要做的就是更改日志框架以记录到 slf4j 而不是 log4j 这就像做梦一样 我很高兴 直到我注意到 Logback 为每个日志事件
  • 如何让 IntelliSense 自动完成 XAML 中自定义/用户控件的枚举? [复制]

    这个问题在这里已经有答案了 可能的重复 WPF 如何在 vs2008 xaml 编辑器智能感知中显示枚举属性值 https stackoverflow com questions 419802 wpf how to display enum
  • 当我传递特定参数时,使用 ElementTree 的 iter() 解析 XML 找不到我的标签

    尝试从标签返回属性和值 逐字逐句地遵循 ElementTree 文档不会产生任何结果 没有错误 它只是运行并且不打印任何内容 如果我在没有参数的情况下运行 iter 它会打印每个标签 但如果有参数 它什么也不做 不知道发生了什么事 find
  • 使用 dockerfile 安装 Composer

    我对 docker 还很陌生 我尝试在 Dockerfile 中自动执行 Composer install 但在安装时似乎无法 cd 进入我的应用程序 出了什么问题 或者也许还有另一种更好的方法来做到这一点 我的 docker compos
  • 如何显示 MKAnnotation 的副标题 2 行文本并更改右侧按钮的图像?

    我正在查看 Apple 的 MapCallouts 示例 了解地图注释和标注 单击图钉时出现的气泡 每个注释都有坐标 标题和副标题 我想用两行显示字幕 我尝试过 NSString subtitle return Founded June 2
  • 即使用户已登录,wolkenkit 也会重定向到 Auth0

    我只是尝试按照 wolkenkit 文档使用聊天模板测试 wolkenkit 的身份验证 用户登录似乎可以工作 但即使用户已经登录 用户也会被重定向到 Auth0 客户端无需调用auth login方法 这是来自客户端的代码片段 wolke
  • 使 JEditable 适用于新元素 (.live)

    我正在使用 JEditable 插件进行就地编辑 我有一个 设置 功能 它调用 editable 所有相关课程 问题是 我有新附加的元素 我也想使其可编辑 显然 是新增的 editable 永远不会被叫到他们 换句话说 我希望获得 jque
  • Firebase 离线商店 - 查询未返回在线商店中的更改

    我在用着Firebase离线能力设置为 true let ref FIRDatabase database referenceWithPath my data child my users id scoresRef keepSynced t
  • 如何使用 javascript/jquery 动态更改图像?

    所以 我有这个http jsfiddle net ithril UjGhE 1 http jsfiddle net ithril UjGhE 1 请检查一下 我在这里尝试的是将主图像 img 标签的 src 动态更改为所单击图像的相同 sr
  • android 列表视图意图

    单击列表视图后 我无法创建意图 完成后提示错误 应用程序意外停止 请重试 public void onItemClick AdapterView
  • 缺少 Sweet Alert 的选择选项

    这可能是一个 ServiceNow 问题 但我添加了一个甜蜜警报来显示一个选择框 这样我就可以收集一个值以传递到下一条记录 但是选择框没有显示 弹出窗口只是没有框或选项 我缺少什么 截屏 选择框警报 https i stack imgur
  • Laravel 中的动态数据库连接

    我知道在 Laravel 中你可以通过在config database php文件 然后使用DB connection my conn name 但是无论如何都可以使用未在其中指定的连接config database php file 我正
  • 将类转换为字节数组 + C#

    如何在 C 中将类转换为字节数组 这是一个托管代码 因此以下代码失败 int objsize System Runtime InteropServices Marshal SizeOf objTimeSeries3D byte arr ne
  • 将 std::allocate_shared 与多态资源分配器一起使用

    我正在尝试创建共享指针std pmr monotonic buffer resource 我无法编译它 我缺少什么 https godbolt org z R9 jdju https godbolt org z R9jdju include
  • 为什么当工作线程要退出时我们需要检查IsIoPending?

    从win32threadpool cpp中我们知道 工作线程在通过检查20秒超时退出之前 需要通过IsIoPending 方法检查是否有IO挂起 根据我的理解 1 当工作线程要退出时 它必须完成它的工作并返回到线程池 2 基于上述1 线程退
  • HTML5 国际化

    如何更改 HTML5 的消息 或者它是否根据浏览器的语言自动更改 例如
  • Javascript 事件绑定持久化

    如果您有一个不断呈现 销毁的 HTML 元素 那么与 HTML 的 Javascript 事件绑定是否持续存在 或者是否有必要在创建 销毁周期中绑定 取消绑定事件 我正在使用 D3 生成美国各县的地图 此外 我正在生成一个工具提示叠加层 其