我试图将 forEach()
函数的索引传递到 addEventListener
内部的函数参数中:
dispensaryLocations.forEach((location, i) => {
location.addEventListener('click', clickLocationToOpenMarker(i));
});
这是clickLocationToOpenMarker()
函数:
const clickLocationToOpenMarker = id => {
infoWindowContents.map(infowindow => {
infowindow.close();
});
google.maps.event.trigger(markers[id], 'click');
};
对于Contex:markers
是Google Maps标记的数组,单击时,打开一个InfowDindow,显示有关该位置的信息。infoWindowContents
是一个阵列,可容纳每个标记的所有相应的InfowIndows。但是,我在这里不关心Google Maps API,这更多的是尝试将论点传递给addEventListener
内部的功能而不会发射的功能。
我的问题是,当我将函数传递给addEventListener
时:element.addEventListener('click' clickLocationToOpenMarker)
函数按预期分配给每个元素,并且不会立即调用并运行。
这里的警告是,我需要能够将i
变量作为参数传递给函数:element.addEventListener('click', clickLocationToOpenMarker(i))
,以便该函数知道要打开哪个Google Maps Marker
。但是,一旦我将参数添加到函数的参数中,与上面的示例不同,该函数会在forEach()
循环的每次迭代中立即调用并启动。
为什么addEventListener
传递参数时会立即触发功能,但是当没有参数传递给该函数时,它只会分配它?
您正在调用clickLocationToOpenMarker
。您需要将其包装在功能中,以防止它立即运行:
dispensaryLocations.forEach((location, i) => {
location.addEventListener('click', () => clickLocationToOpenMarker(i));
});
表达式 clickLocationToOpenMarker(i)
是函数调用。要将函数绑定到单击事件,您可以将其包装在另一个匿名函数中(如SlipType在答案中所述(:
location.addEventListener('click', function() {
clickLocationToOpenMarker(i);
});
或,您可以使用Function.prototype.bind
来绑定函数中的参数值(因此您不必创建匿名函数(。
location.addEventListener('click', clickLocationToOpenMarker.bind(null, i));