问题标签 [event-handling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 您如何在 SOF 上的新帖子中执行没有“onclick”(如“Grippie”)的 Javascript 函数
您如何onclick
在 SOF 上的新帖子中不使用“Grippie”之类的 Javascript 函数,例如<div class="grippie" style="margin-right: 59px;"/
当您发布问题或答案时 Stack Overflow 上的 >?我得到了一个不错的 CSS 光标,它让我知道可移动的边缘,但是调整字段大小的 JavaScript 是如何发现我点击了“grippie”的?
编辑: 感谢您提供导致 jQuery 并描述处理程序的答案。我可以简单地使用确定何时单击元素的处理程序,例如:
或者这可能有效?
javascript - 假“点击”激活 onclick 方法
我有一个带有onclick方法的元素。
我想在另一个函数中激活该方法(或:假点击此元素)。
这可能吗?
event-handling - 有没有一种简单的方法来检测 Linux/Xorg/Qt4/Kde4 中的鼠标或键盘活动?
有没有一种简单的方法来检测 Linux 或 Xorg 或 Qt4 或 Kde4 环境中的鼠标或键盘活动?显然不仅在特定窗口上,而且在整个 Xorg 桌面上。
javascript - 在 javascript 中正确引用 html 列表项对象进行事件注册
如果我有例如以下 html 列表,我想知道如何引用列表项对象
如何在不需要唯一 elementId 的情况下将 onclick 注册到 Item2 li 例如,我可以为 subdiv_3 这样做,因为它具有唯一 ID 并且不在列表中
我的目标最终是为每个列表对象分配一个函数,用于基于列表对象编号的具有唯一参数的列表对象的数量,例如:
c# - 如何确保一个事件只订阅一次
我想确保我只在特定类中为实例上的事件订阅一次。
例如,我希望能够执行以下操作:
我将如何实施这样的警卫?
c# - 使用匿名委托进行事件处理时的垃圾收集
更新
我已将此处的各种答案组合成一个新问题的“明确”答案。
原始问题
在我的代码中,我有一个事件发布者,它存在于应用程序的整个生命周期(这里简化为基本要素):
因为这个发布者可以在任何地方使用,我很高兴自己创建了这个小助手类,以避免在所有订阅者中重写处理代码:
它工作得很好,直到我们开始在较小的机器上使用它,当我开始偶尔:
事实证明,代码中有一个地方是订阅者控件被动态创建、添加和从表单中删除的。鉴于我对垃圾收集等的深入了解(即直到昨天还没有),我从来没有想过要在我身后进行清理,因为在绝大多数情况下,订阅者也会在应用程序的整个生命周期内都存在。
我已经用Dustin Campbell 的 WeakEventHandler摆弄了一段时间,但它不适用于匿名代表(无论如何都不适合我)。
反正有这个问题吗?我真的很想避免在整个商店复制粘贴样板代码。
(哦,别问我为什么我们一直在创建和销毁控件,这不是我的设计决定......)
(PS:这是一个winforms应用程序,但我们已经升级到VS2008和.Net 3.5,我应该考虑使用弱事件模式吗?)
(PPS:来自 Rory 的好答案,但如果有人能想出一个与 WeakEventHandler 等效的方法,这样我就不必记住显式 UnLink/Dispose,那会很酷......)
编辑我必须承认我通过“回收”有问题的控件来解决这个问题。然而,解决方法又回来困扰我,因为我使用的“钥匙”显然不是唯一的(呜咽)。我刚刚在这里发现了其他链接(尝试过这个 - 似乎有点太弱了- 即使目标仍然存在,GC也会清除代表,下面的 s,oɔɯǝɹ 答案也有同样的问题),这里(强制你修改发布者,并且不't 真正与匿名代表一起工作)和这里(引用为不完整的达斯汀坎贝尔)。
我突然想到,我正在寻找的东西在语义上可能是不可能的——闭包的设计目的是“即使在我离开后也能闲逛”。
我找到了另一种解决方法,所以我会坚持下去,等待众神的声音。
javascript - 在 MVC 中防止循环事件的优雅方法?
这个问题,简而言之:
在 MVC 中,您如何区分复选框单击(或选择框或列表框更改)与人类含义“控制器,修改模型”,以及复选框单击(或选择框或列表框更改)与控制器含义“我”我更新视图,因为模型已经改变”?
这个例子:
我有一个 JS 应用程序(都是一个大的 HTML+JS 页面;它后面有一个服务器,并且 AJAX 正在运行,但这对示例并不重要)它具有由“边缘”连接的“顶点”的概念。UI 允许您在地图上添加和删除顶点,并启用或禁用顶点对之间的边。
有两种方法可以禁用从顶点 A 到顶点 B 的边:
- 单击边缘,使“边缘详细信息”窗口为您提供“禁用此边缘”按钮;或者
- 单击顶点 A(或 B)以使“顶点详细信息”窗口为您提供附近顶点的清单,您可以从中取消选中顶点 B(或 A)。
以下是 MVC 的底层工作原理(但请参阅这篇文章的末尾以获取更新,我在其中纠正了我理解的问题):
- 模型:顶点对象列表和边对象列表。
- 视图:一个 GMaps UI,带有标记和折线,加上复选框和按钮以及“顶点详细信息”和“边缘详细信息”DIV。
- 控制器:
- 当复选框和按钮上的事件触发时更新模型的 JS 函数;和
- 当模型上的事件触发时更新视图的 JS 函数。
这是具体的不雅:
- 用户将 Vertex Details Window 聚焦在 Vertex A 上,Edge Details Window 聚焦在从 Vertex A 到 Vertex B 的边上。
- 用户在边缘详细信息窗口中单击“禁用此边缘”。
- 控制器函数 1 获取点击事件,并在 Edge 模型对象上调用 disable()。
- Edge 模型对象触发“我刚刚被禁用”事件。
- 控制器功能 2 收到“我刚刚被禁用”事件,并且
- 重新绘制边缘详细信息窗口以显示“我已禁用!” 和
- 在顶点详细信息窗口中取消选中顶点 B。
- 废话!这会再次触发控制器功能 1,它正在侦听意味着边缘被禁用的 UI 事件!
所以有一个不必要的模型的重新更新,以及视图的重新更新。在更复杂的视图中,事件触发事件触发事件,这可能会导致数十个无关更新!
更新:一个很好的答案。
我有点误解了 MVC。如上所述,我不只有一个视图:我有几个视图到几个模型中。特别是,我有一个特定节点的边缘复选框列表视图,以及一个单独的“详细窗口样式”边缘视图。
此外,我不应该让一个控制器函数在模型更改时更新所有视图:每个视图都应该在模型更改时自行修改。
因此,如果每个视图都在模型上注册“状态更新”事件,并且每个视图在收到这些事件后自行更新,那么我的循环事件问题的答案就是:
复选框列表视图将在模型状态更改后更新复选框时禁用复选框事件。
现在,如果用户通过 Edge Detail 窗口禁用 Edge,Controller 会更新 Edge Model,checkbox-list View 会收到更新通知,并且 checkbox-list View 足够聪明,可以在更改状态的同时使复选框事件静音适当的复选框。
这比我原来的解决方案更可口,其中一个控制器更新所有视图——因此必须知道哪些视图需要特别注意和馈送以避免循环。相反,只有带有麻烦的 UI 元素的单个 View 必须处理该问题。
感谢那些回答我问题的人!
java - JTable选择改变事件处理:动态查找源表
我已经实现了自己的事件处理程序并将其添加到表的选择模型中:
并实现了“事件”的方法(上面提到过):
不幸的是,如果我有机会进行选择,则事件会触发两次,并且似乎无法找到关联的表,因为 e.getSource 提供了 javax.swing.DefaultListSelectionModel。
因此我的问题是:
1) 为什么虽然 eventListener 只注册了一次,但它会触发两次?
2) 如何找到选择适用的表格?DefaultListSelectionModel 似乎没有提供任何 getSource() 或类似功能。
非常感谢!
javascript - Javascript:除非元素附加到 document.body,否则事件不会触发
我在 javascript 中动态创建一个元素(div),并在其上注册一个事件侦听器:
现在,如果我将此元素附加到文档正文:
一切都很好,事件被捕获。但是(出于定位目的)我想将此元素附加到我页面中的(静态)子元素,例如:
并且元素已正确生成和定位 - 但现在不再捕获 onclick 事件。有什么想法吗?这是 x 浏览器,所以我一定遗漏了一些东西。
谢谢,唐。
qt - 在 QWidget 上安装 EventFilter (qt4.4.3/kde4)
我有一个 K* 窗口,其中有一个需要过滤事件的小部件。
例如,我不希望点击它的可能性......
我怎样才能做到这一点?
我必须使用事件过滤器吗?在这种情况下,最好的方法是什么?
但我的问题是我不能子类化我的小部件,因为它是 TerminalInterface->widget(),而不是像其他对象:\