Javascript 带有event.target的WeakMap

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

编辑:第二段代码(我的真实代码)实际上没有什么问题。在一个页面上它工作,在另一个页面上它不工作。对潜在的错误是肯定的

我正在创建一个DOM元素,并将该DOM元素作为键提供给一个WeakMap。然后,使用JQuery事件委派/事件侦听器,我尝试检索保存的密钥,但它返回未定义的:

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
    的祖先元素)


  • jQuery代码在
    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-为了避免疑问,我添加了一个使用事件委派的示例。:-)