Javascript 从addEventListener中提取具有此关键字的绑定函数

Javascript 从addEventListener中提取具有此关键字的绑定函数,javascript,leaflet,this,addeventlistener,Javascript,Leaflet,This,Addeventlistener,我想修改如下所示的: this.map.getContainer().addEventListener('touchstart', this.fire.bind(map, 'mousedown')); 现在(如果我没有弄错的话),该函数监听触摸事件,如果它们发生,则发送相应的鼠标事件。因此,它告诉地图对象处理触摸事件就像处理鼠标事件一样 this.map.on('mousedown', this.eventHandlers.mouseDown); this.eventHandlers = {

我想修改如下所示的:

this.map.getContainer().addEventListener('touchstart', this.fire.bind(map, 'mousedown'));
现在(如果我没有弄错的话),该函数监听触摸事件,如果它们发生,则发送相应的鼠标事件。因此,它告诉地图对象处理触摸事件就像处理鼠标事件一样

this.map.on('mousedown', this.eventHandlers.mouseDown);
this.eventHandlers = {
    mouseDown: this.events.mouseDown.bind(this),
};
我想修改上述功能,以便区分单指触摸事件和多指触摸事件,如下所示:

element.addEventListener('touchstart', onTouchStart);
function onTouchStart(e) { 
    if (e.touches.length > 1) { foo() } else { this.fire.bind(map, 'mousedown') }
};
但是,仅仅将上面的侦听器函数放在那里是不起作用的。我尝试使用e.currentTarget并创建了一个var otherThis=this,然后用otherThis替换它,但没有成功

我得到以下错误:

未捕获的TypeError:无法读取未定义的属性“bind” 在htmldevelment.ontooch启动时

非常感谢您的帮助

这里:

function onTouchStart(e) { 
    if (e.touches.length > 1) { foo() } else { this.fire.bind(map, 'mousedown') }
};
问题是
这个.fire.bind(映射'mousedown')
。这段代码没有副作用,它只是定义了一个函数。看见但实际上并不是这样

要调用它,您可以使用:

this.fire('mousedown');
在这里:

问题是
这个.fire.bind(映射'mousedown')
。这段代码没有副作用,它只是定义了一个函数。看见但实际上并不是这样

要调用它,您可以使用:

this.fire('mousedown');

这是一个例子

您不需要将触摸事件转换为鼠标事件(
touchstart
→<代码>鼠标向下移动,
触摸移动
→<代码>鼠标移动,
触摸端
mouseup
)或反之亦然:浏览器已经为您执行了该操作

我强烈建议你在阅读报纸的同时,也要看电视。它深入地解释了不同的浏览器如何在触摸事件旁边调度鼠标(和指针)事件

即使您仅在触摸事件的某些条件下才调度
mousedown
/
up
/
move
,单次触摸也会收到重复的
mousedown
/
up
/
move
事件


另一方面:这里是绑定事件处理程序的干净方法

element.addEventListener('touchstart', onTouchStart);
function onTouchStart(e) { 
    if (e.touches.length > 1) { foo() } else { this.fire.bind(map, 'mousedown') }
};
…将是

element.addEventListener('touchstart', onTouchStart.bind(this));
function onTouchStart(e) { 
    if (e.touches.length > 1) { foo() } else { this.fire('mousedown') }
};
L.DomEvent.on(element, 'touchstart', onTouchStart, this)
请注意调用是如何应用于事件处理程序函数的,以及如何应用于事件处理程序内部的函数调用的。这使得事件处理程序中的
This
的值成为
bind()
的参数

“传单方式”是

element.addEventListener('touchstart', onTouchStart.bind(this));
function onTouchStart(e) { 
    if (e.touches.length > 1) { foo() } else { this.fire('mousedown') }
};
L.DomEvent.on(element, 'touchstart', onTouchStart, this)

…这是
bind
addEventListener
上的两个包装
L.DomeEvent
还处理浏览器的怪癖(
dblclick
在某些情况下在触摸屏上),并翻译非标准IE10的
MSPointerDown
(等),以便在带有IE10和触摸屏的Win7机器上运行
touch*
事件。

这是一个例子

您不需要将触摸事件转换为鼠标事件(
touchstart
→<代码>鼠标向下移动,
触摸移动
→<代码>鼠标移动,
触摸端
mouseup
)或反之亦然:浏览器已经为您执行了该操作

我强烈建议你在阅读报纸的同时,也要看电视。它深入地解释了不同的浏览器如何在触摸事件旁边调度鼠标(和指针)事件

即使您仅在触摸事件的某些条件下才调度
mousedown
/
up
/
move
,单次触摸也会收到重复的
mousedown
/
up
/
move
事件


另一方面:这里是绑定事件处理程序的干净方法

element.addEventListener('touchstart', onTouchStart);
function onTouchStart(e) { 
    if (e.touches.length > 1) { foo() } else { this.fire.bind(map, 'mousedown') }
};
…将是

element.addEventListener('touchstart', onTouchStart.bind(this));
function onTouchStart(e) { 
    if (e.touches.length > 1) { foo() } else { this.fire('mousedown') }
};
L.DomEvent.on(element, 'touchstart', onTouchStart, this)
请注意调用是如何应用于事件处理程序函数的,以及如何应用于事件处理程序内部的函数调用的。这使得事件处理程序中的
This
的值成为
bind()
的参数

“传单方式”是

element.addEventListener('touchstart', onTouchStart.bind(this));
function onTouchStart(e) { 
    if (e.touches.length > 1) { foo() } else { this.fire('mousedown') }
};
L.DomEvent.on(element, 'touchstart', onTouchStart, this)

…这是
bind
addEventListener
上的两个包装
L.DomeEvent
还处理浏览器的一些问题(在某些情况下触摸屏上的dblclick),并翻译非标准IE10的
MSPointerDown
(等),以便在带有IE10和触摸屏的Win7机器上执行
touch*
事件。

谢谢@egueys的回答。问题是,我只是用问题中的最后一个代码段替换了第一个代码段中的代码,所以我希望它在不显式调用它的情况下工作?我不完全理解代码,但我想它已经在代码中的某个点完成了。有问题的图书馆是。我完全忘了提到我的错误,抱歉!更新了问题。别忘了
这个
的模糊性。谢谢你的回答@egueys。问题是,我只是用问题中的最后一个代码段替换了第一个代码段中的代码,所以我希望它在不显式调用它的情况下工作?我不完全理解代码,但我想它已经在代码中的某个点完成了。有问题的图书馆是。我完全忘了提到我的错误,抱歉!更新了问题。别忘了
这个
的模糊性。非常感谢,@IvanSanchez。图书馆(在评论中链接)就是这样做的,而且似乎很有效,所以我不想重做整个事情。但如果我有时间,我会看看你链接的材料。谢谢你的详细解释,真的很有帮助!在这种情况下,我必须猜测,
L.Pather
的作者不知道触摸事件也会自动触发鼠标事件,但是
L.Pather
不会因为重复处理此类事件而受到不良影响:-/Hi@IvanSanchez,一个简单的问题:我注意到,在浏览器中运行我的Cordova应用程序时,lpath多段线在mousemove期间绘制时可见,但在我的Android设备上,它们只有在mouseup之后才可见。这可能是L.Pather对待触摸事件的方式造成的吗?非常感谢你,@IvanSanchez。该库(在注释中链接)是否