唯一的元素ID,即使件没有一个
-
03-07-2019 - |
题
我正在写一个油猴子的脚本中我重复一堆的要素。每个元素,我需要一串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"
使用鼠标和/或位置性质的元素生成一种独特标识。
你可以产生一个稳定、独特的标识对于任何给定的节点在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.它可以解决一些问题的时候你必须结合定义的数据元素。