草庐IT

javascript - 捕获所有事件(javascript)

coder 2024-07-19 原文

我希望能够捕获所有创建和分派(dispatch)的事件,并在发生这种情况时触发一些回调。

此外,我希望能够在事件与事件监听器配对时随时触发回调。

问题包括:动态添加的元素、阻止传播或冒泡的事件以及动态生成的自定义事件。我想可能需要一个 dispatchEvent 之类的原型(prototype),但我不确定。这可能吗?

最佳答案

一些事件基础:

  1. 事件在作为事件目标的 DOM 对象(通常是元素)“上”调度。
  2. 事件可以首先向下传播到捕获阶段的子元素。这个阶段很少使用,因为它直到最近才被一些广泛使用的浏览器支持。
  3. 事件可以在冒泡阶段传播到父元素。这个阶段很常用。
  4. 有些事件不会传播,它们既没有捕获阶段也没有冒泡阶段(例如聚焦、模糊和提交事件)。在某些浏览器中传播的某些事件不会在其他浏览器中传播。
  5. 响应事件的 DOM 元素有一个事件处理程序。它可以设置为监听特定事件并在该事件到达元素时调用监听器函数,无论是在捕获、冒泡期间还是元素是事件目标时。
  6. 监听器可以取消传播,例如链接内 span 上的点击事件可以取消传播,因此链接不会获得点击

鉴于上述情况,实际上不可能使用 Events API 来“捕获所有事件” .这将需要为每个元素上的每个事件类型建立一个监听器,并且不可能捕获自定义事件,因为您必须了解它们才能设置适当的监听器。

I imagine there would need to be a prototyping of dispatchEvent or something

dispatchEvent是一个 Event 实例的方法,它没有被指定为一个构造函数(没有要求它有一个内部 [[Construct]] 方法)所以这样使用不切实际。浏览器不需要为宿主对象实现原型(prototype)继承(尽管大多数都这样做),并且宿主对象和方法的实现细节在很大程度上是隐藏的,所以这不是一个选项。

您可能会尝试扩展事件 API,但您实际上 should not mess with host objects .

看来你关心的是动态添加的元素。有一个策略叫做"event delegation" ,在那里你计算出你需要监听的事件,然后在一个不会改变的元素上设置尽可能接近事件目标的监听器(例如,如果你动态添加和删除表格行,则为表格元素,或者其他元素的容器 div)用于您需要响应的特定事件类型。

您还可以让修改 DOM 的函数派发自定义事件以添加监听器或其他任何内容。

关于javascript - 捕获所有事件(javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695913/

有关javascript - 捕获所有事件(javascript)的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  3. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  4. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. ruby - 如何让Ruby捕获线程中的语法错误 - 2

    我正在尝试使用ruby​​编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?

  7. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  8. ruby-on-rails - 无法在 Rails 助手中捕获 block 的输出 - 2

    我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e

  9. ruby - 如何遍历 Ruby 中所有正则表达式匹配的字符串? - 2

    我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby​​-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/

  10. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

随机推荐