javascript - 如何使用代理对象捕获事件处理程序
问题描述
我想Proxy
为所有点击事件注册设置一个捕获处理程序。
请考虑这个例子:
let docProxy= new Proxy(document, {
get(target, name) {
if (name === 'getElementById') {
console.log(arguments[0]);
}
return typeof target[name] == "function"
? target[name].bind(target)
: target[name];
}
});
(function(document){
document.getElementById("mybtn").onclick=function(){ alert("click")};
})(docProxy);
我试图在 上设置一个代理document
,以便我可以获得任何元素的点击处理程序(在上面的示例中我想登录function(){ alert("click")}
。我忽略了什么?
这是更新的代码。两个按钮 ( foo
, mybtn
) 的按钮 onclick 事件不会触发
let docProxy = new Proxy(document, {
get: (target, name, receiver) => {
const origMethod = target[name];
return function (...args) {
let result = origMethod.apply( target, arguments );
return new Proxy (result, {
get: (obj, key, receiver) => {
if (key === 'addEventListener') {
return function() {
if (arguments[0] === 'click') {
console.log(arguments[1]);
}
}
}
return typeof obj[key] == "function"
? obj[key].bind(obj)
: obj[key];
},
set: (obj, key, value) => {
if (key === 'onclick') {
console.log(value);
}
}
});
};
}
});
(function(document){
document.getElementById("foo").addEventListener('click', function(){ alert("click")});
document.getElementById("mybtn").onclick=function(){ alert("click")};
})(docProxy);
解决方案
推荐阅读
- php - PHP 5 到 PHP 7 的迁移
- javascript - 在 redux 中获取 api 的最佳方法是什么?
- javascript - 为什么我的 React Text 组件没有显示文本?(反应 360)
- odoo-10 - 如何在odoo10中使库存经理的字段不可见
- c++ - 我们可以将阈值应用于颜色空间模型的单个组件,如 RGB 和 LAB 吗?
- google-bigquery - BigQuery:在自动化作业中询问的凭据
- perl - ne nice editor syntax highlighting - Perl 变量未突出显示
- getuikit - UIKit 2 (getuikit) - 灯箱 - 触控设备上的上一个/下一个
- sql-server - 微软sql server managemenet studio 忙于内部操作
- java - ExpandableListView 中的 onClick 子项