Javascript 带有event.target的WeakMap
编辑:第二段代码(我的真实代码)实际上没有什么问题。在一个页面上它工作,在另一个页面上它不工作。对潜在的错误是肯定的 我正在创建一个DOM元素,并将该DOM元素作为键提供给一个WeakMap。然后,使用JQuery事件委派/事件侦听器,我尝试检索保存的密钥,但它返回未定义的:Javascript 带有event.target的WeakMap,javascript,ecmascript-6,weakmap,Javascript,Ecmascript 6,Weakmap,编辑:第二段代码(我的真实代码)实际上没有什么问题。在一个页面上它工作,在另一个页面上它不工作。对潜在的错误是肯定的 我正在创建一个DOM元素,并将该DOM元素作为键提供给一个WeakMap。然后,使用JQuery事件委派/事件侦听器,我尝试检索保存的密钥,但它返回未定义的: const item=document.createElement(“div”),uu data=new WeakMap(); __data.set(项,{hello:“123”}) document.body.appen
const item=document.createElement(“div”),uu data=new WeakMap();
__data.set(项,{hello:“123”})
document.body.appendChild(项)
//后来在活动中,代表团
$(“div”)。在(“单击”)上,函数(事件){
const target=event.target,data=\u data.get(目标);
console.log(数据)
//未定义的打印
有人知道有什么不对,或者知道为没有ID的DOM元素保存数据的替代方法吗
编辑:我有点恼火,我制作的示例工作正常,但我自己的代码没有……(有些位看起来多余。这是根据我的实际代码建模的,所以不是所有缺少的部分都在这里,只是实用而已),但下面是显然工作正常的代码:
const\uuu data=new WeakMap();
函数buildingItem(){
const item=document.createElement(“div”);
item.setAttribute(“数据操作”、“删除”);
__数据集(项目{hi:123});
退货项目;
}
函数构建(){
const main=document.getElementById(“main”)
for(设i=0;i<3;i++){
const container=document.createElement(“div”),attached=document.createElement(“div”);
const build=buildingItem(),
data=\u data.get(build);
build.classList.add(“分类”);
数据[“hello”]=`Item${i}`
__数据集(构建、数据);
build.innerText=`Item${i}`
附加。附加(构建);
容器。附加(附加);
主。附加(容器);
}
}
构建()
$(文档)。在(“单击”,“div.classified[数据操作]”,函数(事件){
const target=event.currentTarget,data=\u data.get(目标);
log(`CTarget Data:${Data[“hello”]}`)
})
两个可能的问题:
target
是被单击的最里面的元素。您可能希望使用此
或事件。而currentTarget
是挂接事件处理程序的元素(可能是target
的祖先元素)
WeakMap
中连接所有click
div元素上的click
事件,不仅仅是该元素,而是只有一个div
。如果单击其他div,自然会得到未定义的,因为其他div
不是映射中的键
div
中添加了一个span
来演示#1,还添加了第二个div
来演示#2):
const item=document.createElement(“div”),uu data=new WeakMap();
__data.set(项目{hello:“123”});
文件.正文.附件(项);
item.insertAdjacentHTML(“beforeed”,“单击我,我会工作”);
document.body.insertAdjacentHTML(“beforeend”,“单击我,我将不工作(我不是地图中的一个键)”);
$(“div”)。在(“单击”)上,函数(事件){
const target=event.currentTarget,data=\u data.get(目标);
log(“当前目标:”,数据);
//请注意,使用'event.target'不会有任何错误
log(“with target:”,_data.get(event.target));
});
是否可以选择将ID作为数据-*属性附加到事件目标?这应该有效。请检查项===target
。是否可以提供一个请?只是一个旁注:“稍后在事件中委派”该代码中没有任何事件委派。只是事件处理。@VLAZ-您之所以看到它,是因为带有“单击我”的div
与地图中作为键的div
不同(#以下答案中为2)。为用作键的div
添加高度(以及背景色)因此可以单击它。我已经回滚了编辑,因为它鼓励人们回答“您没有div
中的div
”或类似内容。“如果您单击其他div,您自然会得到未定义的,因为其他div不是地图中的键。”你的第二点是有意义的。我不认为事件委派会这样做。我只是尝试添加一个事件侦听器,但它实际上没有约束力,所以我求助于委派它。那么有什么建议吗?我相信@VLAZ所做的会使这一点重现:指出这些没有附加ID有帮助吗?我使用了div元素,因为它是我脑海中出现的第一个元素。实际上,它是一个从引导程序中下拉的元素,如。on(“单击”,“a.dropdown-item[data action],function(event))
但我想在这种情况下这并没有什么不同。@acw-VLAZ的例子是一个#2的例子。因为你要添加的div
中没有任何内容,它的高度为零,所以你不能点击它——但是VLAZ的例子有一个不同的div
,其中有文本。如果我们给你要添加的div添加高度,它就有可能可以点击它:高度和背景色都添加到地图中用作键的div
。没有任何id
s.:-)也很好(另请参见我对这个问题的评论。代码中没有事件委派。)如果需要事件委派,可以在:$(document.body)上使用三参数版本的。在(“单击”,“a.dropdown-item[data-action]”,function(event){/*…*/});
(父元素不必是body
,而只是要将其他元素添加到其中的容器。)@acw-为了避免疑问,我添加了一个使用事件委派的示例。:-)