Javascript 扩展on()函数的jQuery插件不';“不接受”;这";

Javascript 扩展on()函数的jQuery插件不';“不接受”;这";,javascript,jquery,mousetrap,Javascript,Jquery,Mousetrap,我正在编写一个插件来扩展jQuery的on()函数,以实现mousetrap.js 我应该从函数获取此并将其传递给on() 这是我的代码: $.fn.superon = function (keys, myfn) { $("body").on("click", this, function (e) { myfn(); }); Mousetrap.bind(keys, function () {

我正在编写一个插件来扩展jQuery的
on()
函数,以实现mousetrap.js

我应该从函数
获取此
并将其传递给
on()

这是我的代码:

    $.fn.superon = function (keys, myfn) {
        $("body").on("click", this, function (e) {
            myfn();
        });
        Mousetrap.bind(keys, function () {
            myfn();
        });
    };
    $.fn.superoff = function (keys) {
        $("body").off(this);
        Mousetrap.unbind(keys);
    };
问题是,如果我使用它,事件将附加到所有元素,而不仅仅是选定的元素


我做错了什么?

.on()
的第二个参数是选择器字符串,而不是元素。您只需省略第二个参数,并将单击绑定到
this
,而不是
body

$.fn.superon = function (keys, myfn) {
    this.on("click", function (e) {
        myfn();
    });
    Mousetrap.bind(keys, function () {
        myfn();
    });
};
$.fn.superoff = function (keys) {
    this.off("click");
    Mousetrap.unbind(keys);
};

  • 您缺少事件类型
    “请在
    .off
    功能中单击”
  • 在您的例子中,函数上的第二个参数必须是选择器(您传递的是jQuery对象)
  • 以下是更新的代码

    (function ($) {
        $.fn.superon = function (selector, keys, myfn) {
            $("body").on("click", selector, function (e) {
                myfn();
            });
            Mousetrap.bind(keys, function () {
                myfn();
            });
            return this;
        };
        $.fn.superoff = function (selector, keys) {
            $("body").off("click", selector);
            Mousetrap.unbind(keys);
            return this;
        };
    })(jQuery);
    
    
    $("#click").superon("#click", "a", function () {
        alert("hello");
        $("#click").superoff("a");
    });
    
    });
    
    $("#click2").superon("#click2", "b", function () {
        alert("hello2");
        $("#click2").superoff("b");
    });
    

    希望能有所帮助……

    这是我的解决方案,感谢@devnull69的建议

     // on() with keyboard shortcut support
     $.fn.superon = function (selector, keys, myfn) {
       this.on("click", selector, function (e) {
         myfn();
       });
       Mousetrap.bind(keys, function () {
         myfn();
       });
       return this;
     };
    
     // off() with keyboard shortcut support
     $.fn.superoff = function (selector, keys) {
       this.off("click", selector);
       Mousetrap.unbind(keys);
       return this;
     };
    

    通过这种方式,我将以调用
    on()
    off()
    函数的相同方式调用它。

    通过这种方式,如果“this”是一个随机添加的元素,它将不会被激发,否?您只能在已经创建的元素上运行方法(也可以从插件)。因此,如果要在动态创建的元素上使用
    .on()
    ,则必须将
    选择器
    作为字符串参数添加到插件调用中。明白了,所以我应该使用“this”而不是$(“body”)并将var选择器作为选择器。感谢投票被否决的原因是1。不能将事件附加到动态添加的元素。@FezVrasta的所作所为在这方面没有问题。2. $第2行中的(this)是浪费,并且会降低性能,因为在本例中,this已经是jQuery对象。通过检查,我们的目的不是为OP提供一个完全重写的插件。我把这件事留给OP去调查一件你应该快速解决的事情是
    $(“body”)。关闭('click',this)我不确定插件是否总是引用ID为的元素。在这种情况下,您的解决方案不正确。@FezVrasta同意,已修复错误@devnull69否不要求元素
    #click
    应该存在。调用
    $('#click')
    else以附加事件
    需要存在。在
    上,现在不强制存在。