4

这是我用来在移动设备上绑定“点击”事件的功能。基本上是一个正常的功能。

bindTapEvent: function(container, selector, run, bindClickAlso){
    var startX, startY, currentX, currentY = 0;
    var moved = false;
    var self;

    if(touchDevice){
        container.on({
            click: function(e){
                e.preventDefault();
            },
            touchstart: function(e){
                e.preventDefault();
                self = $(this);
                startX = e.originalEvent.touches[0].pageX;
                startY = e.originalEvent.touches[0].pageY;
            },
            touchmove: function(e){
                currentX = e.originalEvent.touches[0].pageX;
                currentY = e.originalEvent.touches[0].pageY;
                if(Math.abs(startX - currentX) > 10 || Math.abs(startY - currentY) > 10){
                    moved = true;
                }
            },
            touchend: function(e){
                e.preventDefault();
                run();
            }
        }, 
        selector
        )
    } else {
        if(bindClickAlso != false){
            container.on('click', selector, function(){
                run();
            });
        }
    }
}

我这样使用它:

tt.bindTapEvent(container, '.showColumns', function(){
    container.find('.column').addClass('visible');
    $(this).doSomething();
});

唯一的问题是我不能(显然)在这样的事情中使用 $(this) 。我已经阅读了有关更改上下文的 jQuery $.proxy 的信息,但我无法理解它,因此我可以使用它。是否有可能(在我的情况下)将 tt.bindTapEvent 中使用的匿名函数的上下文更改为当我使用 $(this) 时它仅在 bindTapEvent 函数中“存储”和“使用”?

4

3 回答 3

3

看一下 .call() 和 .apply() ,它们可以让您将所需的上下文作为第一个参数传递。

http://odetocode.com/blogs/scott/archive/2007/07/05/function-apply-and-function-call-in-javascript.aspx

所以在你的例子中,run()你可以使用run.call(this);所以你将 this 作为回调函数的上下文传递。

于 2012-06-06T21:02:25.563 回答
2

有一个由 ES5 标准定义的绑定函数,所有现代浏览器都支持(IE8 及更低版本的shimmable )

你在你选择的函数上调用 bind ,一个新的函数将被返回。

传递给的第一个参数bind是您希望this在结果函数内部设置的对象,随后的参数将被柯里化。因此,对于您的情况,只需添加.bind(this)到匿名函数即可。

tt.bindTapEvent(container, '.showColumns', function(){
    container.find('.column').addClass('visible');
    $(this).doSomething(); //should work now
}.bind(this));

有关 MDN 的更多信息

于 2012-06-06T21:02:42.950 回答
0

如果你知道这个this问题,我希望你也知道.call.apply方法:-)

您需要run在容器的上下文中调用 -function,分别this在侦听器函数中:

e.preventDefault();
run.call(this, e);

顺便说一句:您似乎声明并初始化了var self,但无处使用它?

于 2012-06-06T21:02:51.177 回答