我正在写一个油猴子的脚本中我重复一堆的要素。每个元素,我需要一串ID,我可以使用的参考这件之后。该元素自身没有 id 属性,和我不可以修改原始文件给它一(虽然我可以让DOM改变我的脚本)。我不能储存的引用在我的剧本,因为当我需要他们的油猴子的脚本本身将已超出范围。是否有某种方式得到一个"内部的"ID浏览器的使用,例如?有Firefox-唯一的解决办法是罚款;截浏览器解决方案,可以应用在其他情况将是令人敬畏。

编辑:

  • 如果油猴子的脚本是出的范围,怎么是你引用的元素是以后? 他们的油猴子的脚本是增加的活动DOM的对象。我不能储存的参考文献中的一系列或其他一些类似的机制,因为当事件火,该阵列将不复存在,因为油猴子的脚本已经出来的范围。因此事件需要一些办法知道有关元件的参考脚本了当的事件附后。和元素中的问题不是一个向其它附后。

  • 你就不能使用定制的财产的元素? 是的,但问题是上查找。我要重复通过的所有要素寻找一个有这一定义的位置,所需的身份证。这会的工作,肯定,但是在大型的文件也可能是非常耗费时间。我在寻找东西在哪里的浏览器就可以执查找繁重的工作。

  • 等等,你可以或不能修改的文档? 我不能修改的源文件,但我可以让DOM变化,在脚本。我会澄清的问题。

  • 你不能使用封锁? Closuses没有把外出工作,虽然我起初认为他们不会。看看我后面的员额。

它听起来像是答案的问题:"还有一些内部浏览器ID我可以使用?",是"不"。

有帮助吗?

解决方案 4

更新: 封锁是确实的答案。所以之后摆弄它更多一些,我想通了,为什么关闭了最初的问题和如何解决它。棘手的事情有一封是你必须要小心在循环的要素,不要结束了所有的关闭引用同样的元素。例如,这没工作:

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)
}

无论如何,我决定不选择一个答案,因为该问题有两个答案:1)没有,没有内部Id你可以使用;2)应使用关闭。所以我只是投赞成票的第一个人来说是否有内部Id或推荐产生的Id,再加上任何人提到的关闭。谢谢你的帮助!

其他提示

答案是否定的,没有内部id你可以访问。歌剧和即(也许野生动物园?) 支持 .sourceIndex (这些变化,如果DOM会),但Firefox没有这种排序。

你可以模拟来源索引的通过产生Xpath给定的节点,或者发现该指标的节点 document.getElementsByTagName('*') 这将永远返回素源的顺序。

所有这一切都需要完全静态的文件的课程。改变DOM将打破查找。

我不明白的是你怎么可以失去的参考节点但不要(理论)的内部id?要么关闭和分配工作,或者他们不知道。或者我是不是错过什么?

封闭的路要走。这样你就会有准确的参考件,甚至会生存的一些洗牌的DOM。

例如对于那些不知道的关闭:

var saved_element = findThatDOMNode();

document.body.onclick = function() 
{
   alert(saved_element); // it's still there!
}

如果 你不得不将其存储在一个饼干,那么我建议计算XPath为它(例如走DOM计数,前面的兄弟姐妹,直到你找件和身份证件和最后你就会喜欢的东西 [@id=foo]/div[4]/p[2]/a).

XPointer 是W3C的解决这一问题。

有点混淆的措词,你的问题-你说,你"需要一串ID[你]可以使用的参考,元件后,"但是,你"不可能储存的参考文献在[您]脚本,因为当你需要他们的油猴子的脚本本身将已超出范围。"

如果剧本已经出来的范围,那么你是如何引用他们后面?!

我要忽视的事实是,我感到困惑什么你在告诉你我写的油猴子的脚本相当经常 可以 修改DOM元素,我访问给他们一个ID财产。这是代码可以使用,以获得的伪独特的价值为临时使用:

var PseudoGuid = new (function() {
    this.empty = "00000000-0000-0000-0000-000000000000";
    this.GetNew = function() {
        var fourChars = function() {
            return (((1 + Math.random()) * 0x10000)|0).toString(16).substring(1).toUpperCase();
        }
        return (fourChars() + fourChars() + "-" + fourChars() + "-" + fourChars() + "-" + fourChars() + "-" + fourChars() + fourChars() + fourChars());
    };
})();

// usage example:
var tempId = PseudoGuid.GetNew();
someDomElement.id = tempId;

那工作对我来说,我只是测试它在油猴子的脚本我自己。


更新: 封闭的路要走-就个人而言,作为一个硬核JavaScript开发,我不知道你怎么 没有 认为那些立即进行。:)

myDomElement; // some DOM element we want later reference to

someOtherDomElement.addEventListener("click", function(e) {
   // because of the closure, here we have a reference to myDomElement
   doSomething(myDomElement);
}, false);

现在, myDomElement 是其中一个元素,你显然,从你的描述,已经有周围(因为你想添加一个ID,或任何).

也许如果你发布一个例子是你们试图要做的,它会更容易帮助你,假设这不。

如果你 可以 写信给DOM(我敢肯定你一定可以).我会解决这个这样的:

有一个功能返回或者产生一个ID:

//(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"

这样你不需要担心什么HTML看起来像服务器手给你。

如果你不修改DOM你可以让他们所有的索引顺序:

(原型 例)

myNodes = document.body.descendants()
alert(document.body.descendants()[1].innerHTML)

你可以循环的所有节点,并给他们一个独特的分类,你稍后可能选择容易。

你可以设定id特性的计算值。有一个功能原型图书馆,可以为你做这个。

http://www.prototypejs.org/api/element/identify

我最喜欢的javascript库是的!不幸的是jQuery没有一个功能,如识别。然而,仍然可以设置标识属性值,你产生在你自己的。

http://docs.jquery.com/Attributes/attr#keyfn

这里是一个局部段从jQuery docs,集id div基于位置的网页:

  $(document).ready(function(){

    $("div").attr("id", function (arr) {
          return "div-id" + arr;
        });
  });

你也可以使用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"

http://appengine.bravo9.com/b9j/documentation/pguid.html

使用鼠标和/或位置性质的元素生成一种独特标识。

你可以产生一个稳定、独特的标识对于任何给定的节点在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 循环, break 当, node 有一个属性,你知道是独特的,例如 @id

  • reverse()pieces, 目前它是只是在那里看起来更像DOM结构的身份证的生成

  • 不包括第一 piece doc 如果你不需要一个标识符为该文件的节点

  • 保存标识符的节点上在一些方法,重复使用,值用于儿童的节点,以避免具有历的所有道路上树。

  • 如果你正在写这些符回XML,使用另一种串联的性格如果属性你写的受到限制。

在javascript,你可以附加一个自定义ID领域的节点

if(node.id) {
  node.myId = node.id;
} else {
  node.myId = createId();
}

// store myId

这是一个有点黑客,但是它会给每个节点的一个id,你可以使用。当然, document.getElementById() 不注意它。

我认为'我刚刚解决的一个问题与此类似。但是,我使用的jQuery在浏览器DOM环境。

var objA=$("选择到一些dom元件");var objB=$("选择的其他一些dom元件");

如果(objA[0]===objB[0]){ //伟大的!两个对象一点完全相同dom }

OK,没有ID关于DOM元。DOM有hierarchycal结构的元素,它是主要的信息。从这个角度看,你可以 联系数据DOM元素 字或jQLite.它可以解决一些问题的时候你必须结合定义的数据元素。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top