Javascript 引用相同元素的ur闭包。例如,这不起作用: for (var i = 0; i < elements.length; i++) { var element = elements[i]; var button = document.createElement("button"); button.addEventListener("click", function(ev) { // do something with element here }, false) } for(var i=0;i
但这确实:Javascript 引用相同元素的ur闭包。例如,这不起作用: for (var i = 0; i < elements.length; i++) { var element = elements[i]; var button = document.createElement("button"); button.addEventListener("click", function(ev) { // do something with element here }, false) } for(var i=0;i,javascript,firefox,dom,greasemonkey,Javascript,Firefox,Dom,Greasemonkey,但这确实: var buildListener = function(element) { return function(ev) { // do something with event here }; }; for (var i = 0; i < elements.length; i++) { var element = elements[i]; var button = document.createElement("button")
var buildListener = function(element) {
return function(ev) {
// do something with event here
};
};
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
var button = document.createElement("button");
button.addEventListener("click", buildListener(element), false)
}
var buildListener=函数(元素){
返回功能(ev){
//对这里的事件做点什么
};
};
对于(var i=0;i
无论如何,我决定不选择一个答案,因为这个问题有两个答案:1)不,没有可以使用的内部ID;2) 您应该为此使用闭包。因此,我只是对第一批说是否有内部ID或谁建议生成ID的人以及任何提到闭包的人进行了投票。谢谢你的帮助 您还可以使用pguid(页面唯一标识符)生成唯一标识符:
pguid = b9j.pguid.next() // A unique id (suitable for a DOM element)
// is generated
// Something like "b9j-pguid-20a9ff-0"
...
pguid = b9j.pguid.next() // Another unique one... "b9j-pguid-20a9ff-1"
// Build a custom generator
var sequence = new b9j.pguid.Sequence({ namespace: "frobozz" })
pguid = sequence.next() "frobozz-c861e1-0"
使用鼠标和/或元素的位置属性生成唯一ID。我“认为”我刚刚解决了一个类似的问题。但是,我在浏览器DOM环境中使用jQuery var objA=$(“某个dom元素的选择器”); var objB=$(“某个其他dom元素的选择器”) if(objA[0]==objB[0]){ //太好了!这两个对象指向完全相同的dom节点
}好的,没有自动关联到DOM元素的ID。 DOM具有元素的层次结构,这是主要信息。
从这个角度来看,您可以使用jQuery或jQLite将数据与DOM元素关联起来。当您必须将自定义数据绑定到元素时,它可以解决一些问题。您可以使用以下函数为DOM中的任何给定节点生成稳定、唯一的标识符:
function getUniqueKeyForNode (targetNode) {
const pieces = ['doc'];
let node = targetNode;
while (node && node.parentNode) {
pieces.push(Array.prototype.indexOf.call(node.parentNode.childNodes, node));
node = node.parentNode
}
return pieces.reverse().join('/');
}
这将为此类结构创建标识符,如doc/0
、doc/0/0
、doc/0/1
、doc/0/1/0
、doc/0/1/1
:
<div>
<div />
<div>
<div />
<div />
</div>
</div>
您还可以进行一些优化和更改,例如:
- 在
循环中,当while
具有您知道是唯一的属性时,节点
,例如中断
@id
- 不是
这些reverse()
,目前它只是看起来更像是从中生成ID的DOM结构片段
- 如果不需要文档节点的标识符,则不包括第一个
条目
文档
- 以某种方式将标识符保存在节点上,并对子节点重用该值,以避免再次遍历树的所有路径
- 如果要将这些标识符写回XML,如果要写入的属性受到限制,请使用另一个连接字符
//(function () {
var idCounter = new Date().getTime();
function getId( node ) {
return (node.id) ? node.id : (node.id = 'tempIdPrefix_' + idCounter++ );
}
//})();
var n = document.getElementById('someid');
getId(n); // returns "someid"
var n = document.getElementsByTagName('div')[1];
getId(n); // returns "tempIdPrefix_1224697942198"
var saved_element = findThatDOMNode();
document.body.onclick = function()
{
alert(saved_element); // it's still there!
}
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
var button = document.createElement("button");
button.addEventListener("click", function(ev) {
// do something with element here
}, false)
}
var buildListener = function(element) {
return function(ev) {
// do something with event here
};
};
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
var button = document.createElement("button");
button.addEventListener("click", buildListener(element), false)
}
pguid = b9j.pguid.next() // A unique id (suitable for a DOM element)
// is generated
// Something like "b9j-pguid-20a9ff-0"
...
pguid = b9j.pguid.next() // Another unique one... "b9j-pguid-20a9ff-1"
// Build a custom generator
var sequence = new b9j.pguid.Sequence({ namespace: "frobozz" })
pguid = sequence.next() "frobozz-c861e1-0"
function getUniqueKeyForNode (targetNode) {
const pieces = ['doc'];
let node = targetNode;
while (node && node.parentNode) {
pieces.push(Array.prototype.indexOf.call(node.parentNode.childNodes, node));
node = node.parentNode
}
return pieces.reverse().join('/');
}
<div>
<div />
<div>
<div />
<div />
</div>
</div>