拦截(可能取消)页面的鼠标/键盘事件处理程序
Posted
技术标签:
【中文标题】拦截(可能取消)页面的鼠标/键盘事件处理程序【英文标题】:Intercept (and perhaps cancel) page's mouse/keyboard event handlers 【发布时间】:2014-11-07 01:58:28 【问题描述】:我正在尝试创建一个处理选定文本的 Chrome 扩展程序。一些网站页面的其他可选文本内容具有导航到新页面的单击/鼠标向上/向下事件处理程序。
有没有办法从后台或内容脚本中暂时禁用(和恢复)页面的任意事件处理程序而不干扰本机文本选择?
我想到的最坏情况是分离,克隆正文 html,允许选择,然后恢复绑定的原始文件。好像很麻烦。
谢谢!
【问题讨论】:
【参考方案1】:大多数 HTML DOM 事件都遵循capture-target-bubble event model。这意味着,例如,如果您单击一个按钮,“click”事件首先在根处调度,一直到该按钮,然后再返回。可以停止事件传播,防止下一级的事件监听器收到事件通知。
接收事件的最早可能性是在根,通常在捕获阶段window
。要将事件侦听器绑定到捕获阶段,请使用addEventListener
,并将第三个参数设置为true
:
// in a content script, at run_at:document_start
window.addEventListener('click', function(event)
event.stopImmediatePropagation();
, true);
很多网页使用jQuery来管理DOM事件,它在冒泡阶段绑定了事件监听器,所以之前的方法适用于大多数网站。如果页面不使用 jQuery,那么您必须在 document_start
绑定您的事件侦听器,以确保您的事件侦听器在所有其他事件侦听器之前触发。
【讨论】:
对不起,这个问题不适用 @uosɐſ 您是如何在 45 秒内找出答案不适用的?如果您想阻止页面干扰原生事件,那么唯一可靠的方法就是阻止页面看到这些事件。 它没有考虑 chrome 扩展的孤立世界的细微差别。这是关于一般 DOM 事件信息的答案。 @uosɐſ 孤立的世界仅适用于 javascript 执行上下文,不适用于 DOM 事件。因此,内容脚本中的孤立世界与问题或答案无关。您的问题的答案不一定是特定于扩展的。事实上,答案中唯一特定于扩展的部分位于答案的最后(关于 run_at:document_start 的行)。 好吧,我的错误 +1。关于“document_start”的见解为孤立的世界提供了注入页面脚本和预处理其他事件的机会可能会奏效。除非页面的常规脚本删除所有此类处理程序。我希望 Chrome 扩展 API 中有更强大的功能,这看起来像是标准的 javascript 事件模型解释。对不起。以上是关于拦截(可能取消)页面的鼠标/键盘事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章