Javascript 如何在已定义的回调函数中访问$(this)和事件

Javascript 如何在已定义的回调函数中访问$(this)和事件,javascript,jquery,callback,hammer.js,Javascript,Jquery,Callback,Hammer.js,我试图通过回调函数启用一些触摸控制,但在访问事件以及回调函数中的$(this)时遇到问题。现在代码如下所示: $('.img-responsive').each(touchControls); function touchControls(event) { event.preventDefault(); var mc = new Hammer(this); mc.on("doubletap", function() { console.log($(thi

我试图通过回调函数启用一些触摸控制,但在访问事件以及回调函数中的$(this)时遇到问题。现在代码如下所示:

$('.img-responsive').each(touchControls);

function touchControls(event) {
    event.preventDefault();
    var mc = new Hammer(this);
    mc.on("doubletap", function() {
        console.log($(this));
    });
}
其中“.img responsive”是我页面上的一类图像

当它尝试调用event.preventDefault时,我得到一个错误,即event.preventDefault不是函数。我以为事件会自动传递给名为?我知道当我使用.on执行命名回调函数时,event.preventDefault()工作得非常好。我假设当我使用它时,它是不同的。每个,我如何正确地访问它

现在,如果我删除event.preventDefault()行,当它记录$(this)时,我会得到一个函数。我本来希望得到单独的元素,这样我就可以为它们设置触摸控制,但这显然不起作用。我试图通过以下方式来约束“这个”:

$('.img-responsive').each(touchControls).bind(this);
但是当我记录$(this)时,它仍然是一个函数,而不是我所期望的元素


我基本上只是对如何在定义的回调函数中访问$(this)和事件感到困惑。

您将事件传递到了错误的函数中。。您需要将其传递到事件侦听器中。每个循环的第一个参数是迭代的当前索引

$('.img responsive')。每个(触摸控制);
功能触摸控制(eachIndex){
var mc=新锤子(本);
mc.on(“双击”,功能(事件){
//移动到此处并传递事件
event.preventDefault();
log($(this));
});
}
功能锤(el){
返回$(el)
}

img
img
不是事件处理程序,因此其回调函数不接受
事件
对象。
每个
回调函数的方法签名如下所示:

。每个(功能)

功能
类型:函数(整数索引,元素)
为每个匹配元素执行的函数

因此,您将没有要引用的
事件
对象,但更重要的是,没有要防止的默认事件行为

相反,它实际上设置了事件处理程序。它的回调函数将事件作为其参数。您可以在事件处理程序代码中,在上的
回调函数中处理事件管理

迭代时,此
将引用当前元素。但是在内部回调函数中会有一个不同的上下文(因此不同的
this
)。只需在外部范围中存储对元素的引用:

function touchControls() {
    var $this = $(this);
    var mc = new Hammer(this);
    mc.on("doubletap", function(e) {
        e.preventDefault();
        console.log($this);
    });
}

在这种情况下,如何防止双击事件的默认行为放大?如果我不应该在这里阻止它,那么我应该在哪里访问它来阻止它?@MichaelYousef更新了我的回复,以解决事件管理问题。我想Hammer会更改上下文,因此指向doubletap的函数?不管怎样,您的解决方案非常有效,谢谢。@MichaelYousef与其说是
Hammer
改变了上下文,不如说是
上的
。在文档中:“当jQuery调用处理程序时,
this
关键字是对传递事件的元素的引用;对于直接绑定的事件,这是附加事件的元素”。在您的例子中,处理程序绑定到
mc
,因此这就是
this
所指的内容。