你能包装他们使用的函数作为他们的事件处理程序吗?举这个人为的例子:
var someObject = {
keyDownListener: function() {
alert('something was pressed!');
}
}
我们可以用我们自己的接受事件对象的方法替换 keyDownListener。
var someObject = {
keyDownListener: function() {
alert('something was pressed!');
}
}
var oldKeyDownListener = someObject.keyDownListener;
someObject.keyDownListener = function(event) {
oldKeyDownListener(); // Call the original
// Do anything we need to do here (or before we call the old one!)
}
如果你能进入函数内部,你也可以检查 arguments 对象。您的事件对象应该在那里(我相信第一项)。
var f = function() {
console.log(arguments);
}
f(); //= Logs []
f(1); //= Logs [1]
f(1, 'something'); //= Logs [1, 'something']
编辑(回应下面的评论)。
如果您可以“劫持”该方法,那么这是您可以做到的一种方法。我不确定这是否是一个好方法,但如果你有所有这些限制,它会让你得到你想要的。基本上,这段代码的作用是搜索任何具有 onclick 属性的元素,并更改方法签名以包含事件对象。
然后我们可以包装原始侦听器以从参数中提取事件对象,然后将执行传递回原始函数。
这样做会让你得到你想要的(我想?)。请参阅此代码:
HTML:
<a href="#" onclick="javascript:myFunction(1, 2, 3);">Click Me</a>
JavaScript:
window.myFunction = function(one, two, three) {
console.log("one: " + one + ", two: " + two + ", three: " + three);
}
var originalMyFunction = window.myFunction;
window.myFunction = function() {
var event = arguments[arguments.length - 1]; // The last item in the arguments array is our event object.
console.log(event);
originalMyFunction.apply(this, arguments);
}
$('[onclick]').each(function() {
var s = $(this).attr('onclick');
var lastIndex = s.lastIndexOf(')');
var s2 = s.substring(0, lastIndex);
var s3 = s.substring(lastIndex, s.length);
var s4 = s2 + ', event' + s3;
$(this).attr('onclick', s4);
});
你可以看到它在这个小提琴中工作:http: //jsfiddle.net/84KvV/
编辑 2
如果你想真正喜欢它,你甚至可以自动包装函数。看到这个小提琴:http: //jsfiddle.net/84KvV/2/。
请注意,这期望函数字符串采用某种格式,以便它可以解析它(functionName(...))。如果不是那种格式,那么这个确切的代码将不起作用:)