JS IndexedDB闭包/内部函数

时间:2017-01-25 17:46:36

标签: javascript indexeddb

我想理解为什么在这个"循环"我无法在具有闭包/内部函数的事件中附加元素的键。我知道像for,while这样的其他循环会发生什么......我不明白为什么在这种情况下这种方法不起作用的真正原因。

问:为什么我不能直接传递密钥?

item.transaction(["itens"], "readonly").objectStore("itens").openCursor()
                .onsuccess = function(e) {
                    var info = e.target.result;
                    if (info) {


                        var div = document.createElement("div");
                        var img = document.createElement("img");
                        var h2 = document.createElement("h2");

                        img.src = "../imagens/misc/" + info.value.image;
                        h2.innerHTML = info.value.title;
                        div.appendChild(h2);


                        div.onclick = function() {
  //always the lasy key.
                           console.log(info.key);


                        };

                        div.appendChild(img);
                        box.appendChild(div);

                        info.continue();
                    }
                };

我知道解决方案的类型有效......

bt.onclick = (function(index) {
        return function (){console.log('iterator: ' + index);}
    })(i);  

with ({ n: i }) {
bt.onclick = function(index) {
    console.log('iterator: ' + n);
};
}

1 个答案:

答案 0 :(得分:2)

在给出的示例中,您将为光标的每次迭代重写div.onclick

如果将其更改为:

,可能会更清楚
console.log('overwriting onclick handler to log: ' + info.key);
div.onclick = function() {
  console.log(info.key);
};

或者,不要覆盖:

console.log('adding onclick listener to log: ' + info.key);
div.addEventListener('click', function() {
  console.log(info.key);
});

这些行为会有所不同,但也许可以帮助您了解正在发生的事情。