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,如果要写入的属性受到限制,请使用另一个连接字符


是的,但问题稍后会出现在查找端。我必须再次找到该元素的唯一方法是迭代文档中的所有元素并比较该自定义属性。根据文档的大小,这可能会非常慢。伟大的人都有相同的想法。挑剔:DOM id必须以a-Z字符开头,这样就破坏了HTML(尽管可以工作)。:-)是的-我倾向于忘记规范的一些细节,因为大多数浏览器都很方便地原谅我。:)我在自己的JavaScript代码中使用此模式已经有相当长一段时间了,没有问题,但现在您提到了它,我想我将进行更改以确保有效性……也许:PYeah,我通常会在这样的场景中使用闭包。我不知道为什么在这种情况下我没有想到他们。我把这归咎于太多晚上工作到很晚DOM元素上的闭包是否会导致浏览器泄漏,至少在IE中是这样?@ErikE-据我回忆,并且我不愿意承认的是,当事件处理程序附加到DOM元素时,内存泄漏问题就会发生,这些元素从DOM中移除,不再被任何变量引用。这是一个非常有趣的问题。我想知道各种浏览器是如何实现这一点的。也许有些浏览器会为所有元素指定一个隐藏索引,这样它们就可以在内部访问这些元素,而无需遍历整个DOM树。这是有道理的。问题是我们是否可以从JavaScript访问索引。@AsGoodAsItGets实际上,这是另一种方式,因为这个问题是首先创建的。:)@没有人会强迫你耸耸肩;在数据库设计中,为了扩展性,我们通常创建一个唯一的ID字段来查找记录(行),该字段的编号保证永远不会更改,即使我们主要是通过另一个字段进行查找。看起来很奇怪,DOM设计器不会将唯一的整数放入所创建的每个节点中,或者至少在元素类型的每个节点中。另一方面,节点对象中充斥着函数值,这些函数值可能存储在类static中或实际对象之外的其他地方。只是说说而已。这里很好地描述了函数内部循环问题:。谢谢你的提醒;如果元素完全重叠的话,这并不是完全的证据。这种由DOM遍历生成的唯一名称将在HTML文件更改时更改(仅删除一个节点可能会更改许多分配的名称或标识符)。因此,持久id显然只能由HTML文件的作者分配!HTML5无法解决的问题。
//(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>