javascript – JQuery相当于MooTools绑定(this)

我试图使用这个 class plugin在JQuery中重写一个Mootools工具提示类.当我的类被实例化时,我将事件监听器附加到目标链接,这将淡出工具提示.

在事件回调中,JQuery将关键字“this”分配给事件的目标,所以为了保持对类的属性的引用,我使用apply()来设置“this”来表示类实例.这显然是Mootools的handy bind()函数的JQuery中的对应项.

不幸的是当我使用apply()我失去了回调的事件参数.例如,在这一点我得到一个“e是未定义”的错误在第二行.

this.target.bind('click',function(e){
    e.preventDefault();
    var tip = this.opts.tip;
    tip.fadeOut(500,function(){
        tip.bind('click',function(){
            showing = false;
        })
    });
}.apply(this))

我在这里错过了一个招数吗?有人知道这个问题吗?

谢谢
弗雷德

解决方法

TBH,mootools .bind,你称之为ES5中的Function.bind,并且可以在支持js 1.8.5规范的浏览器中本地使用. MooTools只是增强了没有它的浏览器,但是让本机实现保留在原型上(如果有的话).

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

你可以很容易的将它作为一个Function.prototype.bind装饰器来实现,如果不能在本地使用它,就像上面的例子那样使用它:

// Function.prototype.bind polyfill
if ( !Function.prototype.bind ) {

  Function.prototype.bind = function( obj ) {
    if(typeof this !== 'function') // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');

    var slice = [].slice,args = slice.call(arguments,1),self = this,nop = function () {},bound = function () {
          return self.apply( this instanceof nop ? this : ( obj || {} ),args.concat( slice.call(arguments) ) );    
        };

    bound.prototype = this.prototype;

    return bound;
  };
}

正如你所看到的,它比一个简单的.apply / .call有一点更多的参与

需要考虑的一件事是,如果您需要使用绑定,或者您可以保存参考.

例如.

var self = this;
this.target.bind("click",function(e) {
    var tip = self.opts.tip;
});

这样做比功能绑定还要小.它也为您提供了一个正确的引用,作为触发元素(event.target === this).你会发现这个模式在mootools-core中比bind一般 – 尽管如果要将事件分配给类方法,通常需要绑定,例如:

this.element.addEvents({
    click: this.showTip.bind(this),mouseleave: this.hideTip.bind(this)
});

在这种情况下,保存引用将无法正常工作,但您可以将其重写为

var self = this;
this.element.addEvents({
    click: function(e) {
        self.showTip(e);
    }
});

一个jQuery特定的实现是代理 – http://api.jquery.com/jquery.proxy/

相关文章

jQuery插件的种类 1、封装对象方法 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进...
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。 入门 编写一个jQuery插件开始于给...
最近项目中需要实现3D图片层叠旋转木马切换的效果,于是用到了jquery.roundabout.js。 兼容性如图: ht...
一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异...
AMD 模块 AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一...