哪些事件附加到元素?

2024-03-30

如何接收附加到元素的所有事件dojo http://dojotoolkit.org/?

dojo.query('#mydiv') // which events does #mydiv has?

获取 DOM 元素上的所有事件:

// Get my div
myDiv = dojo.byId("myDiv");
// Obtain all event-related attributes
var events = dojo.filter(
    myDiv.attributes, 
    function(item) { 
        return item.name.substr(0, 2) == 'on';
    }
);
// Execute first found event, just for fun
eval(events[0].value);

如果您使用 dojo.query 获取 myDiv,请记住 dojo.query 返回一个数组,因此您的元素将位于 myDiv[0] 中。

此解决方案不适用于 dojo.connect 附加的事件。可能有一种方法可以从 Dojo 内部工作中提取此信息,但您必须深入研究源代码才能了解具体方法。

另一种选择是使用全局注册表显式管理所有 dojo.connect 事件。您可以使用 dojox.collections 来简化此操作。例如,创建一个全局注册表,其键将是 dom 节点,值将是 dojo.connect 返回的句柄(这些句柄包含 dom 节点、事件类型和要执行的函数):

// On startup
dojo.require(dojox.collections.Dictionary);
eventRegistry = new dojox.collections.Dictionary();
...
// Registering an event for dom node with id=myDiv
var handle1 = dojo.connect(dojo.byId("myDiv"), "onclick", null, "clickHandler");
// Check if event container (e.g. an array) for this dom node is already created
var domNode = handle1[0];
if (!eventRegistry.containsKey(domNode))
    eventRegistry.add(domNode, new Array());
eventRegistry.item(domNode).push(handle1);
...
// Add another event later to myDiv, assume container (array) is already created
var handle2 = dojo.connect(dojo.byId("myDiv"), "onmouseover", null, "mouseHandler");
eventRegistry.item(domNode).push(handle2);
...
// Later get all events attached to myDiv, and print event names
allEvents = eventRegistry.item(domNode);
dojo.forEach(
    allEvents, 
    function(item) {
        console.log(item[1]); 
       // Item is the handler returned by dojo.connect, item[1] is the name of the event!
    }
);

您可以隐藏烦人的检查,通过创建 dojox.collections.Dictionary 的子类并已合并此检查来查看事件容器是否已创建。创建一个js文件,路径为fakenmc/EventRegistry.js,并将其放在dojo、dojox等旁边:

dojo.provide('fakenmc.EventRegistry');
dojo.require('dojox.collections.Dictionary');
dojo.declare('fakenmc.EventRegistry', dojox.collections.Dictionary, {
    addEventToNode : function(djConnHandle) {
        domNode = djConnHandle[0];
        if (!this.containsKey(domNode))
            this.add(domNode, new Array());
        this.item(domNode).push(djConnHandle);
    }
});

使用上面的类,您必须使用 dojo.require('fakenmc.EventRegistry') 而不是 'dojox.collections.Dictionary',并且只需直接添加 dojo 连接句柄而无需其他检查:

dojo.provide('fakenmc.EventRegistry');
eventRegistry = new fakenmc.EventRegistry();
var handle = dojo.connect(dojo.byId("myDiv"), "onclick", null, "clickHandler");
eventRegistry.addEventToNode(handle);
...
// Get all events attached to node
var allEvents = eventRegistry.item(dojo.byId("myDiv"));
...

这段代码没有经过测试,但我想你已经明白了。

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

哪些事件附加到元素? 的相关文章

随机推荐

  • 我在什么上下文中运行 C#?

    我想知道 当我有这样的代码时 lock obj MyCode MyAgent Can MyAgent包含代码认识到它正在运行lock block 关于什么 for int i 0 i lt 5 i MyCode MyAgent Can My
  • 类抛出异常[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 如何在 Symfony2 中创建 IP 黑名单?

    是的 我知道有食谱中的选民教程 http symfony com doc 2 0 cookbook security voters html 但我正在寻找稍微不同的东西 我需要两层不同的黑名单 拒绝某些IP访问整个网站 拒绝某些IP登录 我
  • For 循环中的 DispatchGroup

    因此 我花了一些时间尝试让 DispatchGroup 在长时间异步操作完成之前阻止 for 循环迭代 我发现的大多数示例都相当简单明了 但我似乎无法让我的简单测试用例按我的预期工作 let group DispatchGroup for
  • Fabric.js:如何将自定义尺寸设置为 Text 或 IText?

    我正在使用优秀的 Fabric js 在画布上绘制一些文本 当我为 IText 对象指定自定义大小 假设为 200x200 矩形 时 Farbric js 似乎强制对象的宽度和高度适合文本 var t new fabric IText He
  • 无法使用 Web Video Kit API 将视频发布到 Tiktok

    我正在尝试使用此端点将视频上传到 Tiktok https open api tiktok com share video upload https open api tiktok com share video upload 按照官方文档
  • 将数据放入 EBS 支持的 EC2 实例中

    我创建了一个 AWS EC2 实例并向其附加了一个 EBS 卷 我已经在上面安装了 LAMP 堆栈和 phpmyadmin 我还可以使用 Cyber duck 使用公钥 私钥 初始化与其的 SFTP 连接 并将一些 html php 文件上
  • CMAKE:更新函数中的列表不起作用

    我跟着this https stackoverflow com questions 22487215 cmake function parameter and return and this https stackoverflow com
  • 在 javascript 中使用正则表达式无效组错误

    我有以下正则表达式来检查多种类型的电子邮件地址输入 W
  • Windows 8 下的 WPF 和 Silverlight 的未来会怎样?

    看到首次发布 HTML5 JS Windows 8 GUI http windows8news com 2011 06 02 microsoft unveil windows 8 tablet ui 大量的WPF 和 Silverlight
  • 如何在 pycaffe 中获取图层类型?

    是否有可能在 pycaffe 中获取每一层的类型 例如 卷积 数据等 我搜索了提供的示例 但找不到任何内容 目前我正在使用图层名称来完成我的工作 这是非常糟糕和有限的 这很容易 import caffe net caffe Net path
  • 使用curl PHP获取gzip压缩的XML文件时出现问题

    我正在尝试使用curl 从 xml gz 文件中获取数据 我可以下载该文件 但我的任何尝试都无法获取可用的 XML 当我尝试打印 XML 时 我收到一长串乱码特殊字符 例如 r 7 E i 5 6 DL u 有没有一种简单的方法来解压缩和编
  • Ruby 模除法

    所以我用一个模块编写了一个在 Ruby 中进行模除法的程序 module Moddiv def Moddiv testfor op1 op2 return op1 op2 end end Program require mdivmod pr
  • 让 UIButton 充当导航控制器

    如何使常规 UIButton 充当导航控制器 以便按下它时我可以打开一个新视图 按照以下方式在 viewDidLoad 方法中创建 yourButton UIButton yourButton UIButton buttonWithType
  • bitbucket-pipelines.yml 文件中的部署环境“暂存”在管道中多次出现

    我正在尝试让 Bitbucket Pipelines 执行定义部署区域的多个步骤 当我这样做时 我收到错误 配置错误您的部署环境 暂存 bitbucket pipelines yml 文件在管道中出现多次 请参阅我们的文档以了解有效的环境及
  • 在 Play 应用程序中启动时调用服务

    我有一个 Play 2 4 应用程序 尝试在应用程序启动时启动每周任务 当前的建议是在急切注入的类的构造函数中执行此操作 Guice 但是 我的任务需要访问服务 如何将该服务注入到我的任务中而不出现错误 Error injecting co
  • iOS 10 问题:即使设置了 ContentSize,UIScrollView 也不滚动

    UPDATE 这是 iOS 10 的问题 这在 iOS 9 中仍然像以前一样有效 当你设置时它就会起作用contentSize在主线程上并将此代码放入 void viewDidLayoutSubviews void viewDidLayou
  • Excel COUNTIF 特殊字符

    是否可以计算整列中的特定特殊字符 我正在尝试数所有逗号 在一个专栏中 这就是我正在使用的 COUNTIF D3 D45 问题是这仅计算单元格中单独的逗号 如果我在单元格中添加任何其他内容 在逗号之前或之后 则不会计数 我正在计数的细胞示例
  • Datanode 在单机上的 Hadoop 中失败

    我使用以下教程在 ubuntu 12 04 LTS 上设置并配置了 sudo 节点 hadoop 环境http www michael noll com tutorials running hadoop on ubuntu linux mu
  • 哪些事件附加到元素?

    如何接收附加到元素的所有事件dojo http dojotoolkit org dojo query mydiv which events does mydiv has 获取 DOM 元素上的所有事件 Get my div myDiv do