我正在努力开发一个相当轻量级的实时应用程序。
我们使用jQuery的事件系统在应用程序中的模块之间进行通信。因此,在 DOM 中进行的所有更改都应该影响模块外部的任何内容,都必须通过事件来实现。
这些事件由客户端 socket.io 实现捕获,该实现要求nodejs socket.io 服务器将事件广播到所有其他客户端。
我的问题:有没有办法弄清楚事件是在哪个选择器上触发的?这样如果我打电话
$("tag.class").trigger("myevent");
我可以以某种方式做到
$(document).on("myevent", function() {
console.log(this.selector)
});
它将打印"标签.class"
这很有趣,因为知道用户在选择中触发了某个事件,而不是之后可能看起来非常随机的元素上的某个事件会很有趣。
我已经阅读了这个问题,但我希望能够获得应用程序中触发的所有事件的选择器。
感谢您抽出宝贵时间:)
从链接的答案中汲取灵感,你可以覆盖jQuery trigger
函数。像这样:
$.fn.origTrigger = $.fn.trigger;
$.fn.trigger = function (fn) {
var selector = this.selector;
this.origTrigger(function (ev) {
fn(ev, selector);
});
};
最好的办法是随事件一起发送数据。它也更强大,因为您有更多的控制权。选择器可能不漂亮,但数据很漂亮。
$('tag.class').trigger('myevent', ['some', 'param']);
$(document).on('myevent', function(param1, param2) {
console.log(param1); // "some"
console.log(param2); // "param"
});
当然,如果你想发送任意数量的参数,你可以使用一个"options"对象,并通过以下方式处理它:
$('tag.class').trigger('myevent', [{some: 'option', other: 'option'}]);
$(document).on('myevent', function(options) {
var opts = {
default: 'option',
some: 'default',
other: 'default'
};
$.extend(opts, options);
console.log(opts); // {default: "option", some: "option", other: "option"}
});