gpt4 book ai didi

javascript - 是否可以获取 "current"或 "last"事件的事件对象,而不将其作为处理程序中的参数接收?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:49:30 27 4
gpt4 key购买 nike

我正在尝试修改行为或 JavaScript 库,主要是通过 monkeypatching(不,没有更好的方法)。

在代码的某个位置,我需要知道是否按下了 Shift 键。如果此库中的事件处理程序编写正确,它会接收“事件”作为其第一个参数,但不幸的是,事实并非如此(事件通过 HTML 中的 onclick 内联连接)

因此,我正在尝试查看 jQuery 是否将最后一个事件对象“存储”在某处,或者是否有其他方法可以访问它。

本质上,我想要的是“window.event”,但理想情况下我希望它能在 Firefox 上运行。

除了向文档添加全局 onKeyDown 处理程序并自己跟踪 Shift 的状态之外,还有什么想法吗?就我的口味而言,这感觉有点矫枉过正,也有点过于全局化。

最佳答案

你能包装他们正在使用的函数作为他们的事件处理程序吗?以这个人为的例子为例:

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!)
}

如果可以进入函数内部,还可以检查参数对象。您的事件对象应该在那里(我相信是第一项)。

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);
});

你可以看到它在这个 fiddle 中工作:http://jsfiddle.net/84KvV/

编辑 2

如果您真的很喜欢它,您甚至可以自动包装函数。看到这个 fiddle :http://jsfiddle.net/84KvV/2/ .

请注意,这是期望函数字符串采用特定格式,以便它可以解析它 (functionName(...))。如果不是那种格式,这个确切的代码将不起作用:)

关于javascript - 是否可以获取 "current"或 "last"事件的事件对象,而不将其作为处理程序中的参数接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11586159/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com