假设我们有一个具有属性的IMG
( id
less) 元素。usemap="#hotmap"
然后我们有这个<MAP name="hotmap">
元素(在 中BODY
)包含大量的AREA
s(比如 >1000)。很明显,我们希望将AREA
s 的事件处理委托给MAP
元素,而不是创建数百个事件监听器。
现在在 eventhandler 函数 (for MAP
) 中,我们希望获得对IMG
使用MAP
哪个触发事件的引用。但是,MAP
is 在BODY
andIMG
元素中不能有 HTML,因此MAP
不能在其子元素中。所以问题是,我们如何才能IMG
在这个事件处理程序中捕捉到?
一个简单的例子:
<img src="some_image.png" usemap="#hotmap" />
...
<map id="map" name="hotmap">
<area shape="circle" coords="100,100,50" />
...
</map>
map.addEventListener('click', function (e) {
var area = e.target,
image = ?; // How to refer the img
...
}, false);
旁注
我正在开发一个 HTA 项目,我需要一个对象,该对象可以为具有某些自定义属性的图像动态创建和分配热图。该对象从外部文件中获取AREA
s 的数据,一切正常,除了这个小细节。现在,我添加一个自定义属性,其中包含对 "user" 的引用IMG
,每个AREA
. 尽管这将是不必要的,但如果它只能在事件处理程序中执行一次。
编辑
jsFiddle的现场演示,(不包括 HTA,适用于任何(?)现代浏览器)
编辑二
我刚刚意识到,我不能重用MAP
,因为它也可以根据IMG
. 所以我把对的引用IMG
而MAP
不是它AREA
的s。
虽然这解决了我的问题,但我仍然想知道,IMG
一般来说,如何获取事件处理程序。建议的querySelector()
解决方案似乎不起作用(之前遇到过,现在返回了undefined
)