2012-01-25 60 views
0

我正在使用event.target或event.srcElement获取元素。使用javascript获取未使用id的相同html元素

我可以保存事件的哪些信息,以确切知道之前选择的元素,而不设置ID?

如果我关闭了页面,如何获取相同的元素?

保存所有的parentNode似乎是再次获取元素的一种非常缓慢的方式。

有没有更高效的方法?

该页面将包含固定数量的元素。但是这个页面不能改变,我不能包含id属性。但是,我会标记用户再次打开页面时最后一次点击的标签。

+0

只是要清楚,'this'没有指向你需要(在事件处理的范围内)的元素? – cheeken

+0

当你关闭页面并回到页面时,显然所有的元素都将被重新创建,因此唯一的方法就是创建一个唯一的id。你究竟想要做什么? – SoWeLie

+0

最有效的方式几乎肯定是设置和'ID'。为什么禁止最简单的解决方案? –

回答

0

我发现了一个有趣的方法。

要保存元素:

// Save node name and position with this 
// el = elemento 
var p = document.getElementsByTagName(nodeName); 
for(var i=0; i<p.length; i++) 
{ 
    if(el == p[i]) 
    { 
     return i; 
    } 
} 

要获取:

// With nodeName saved and "position" i 
var elem = document.getElementsByTagName(nodeName)[i]; 
1

根据您的要求,最好的方法是根据类名生成某种xpath,如果它们不存在,则使用元素名称。如果你没有一个唯一的方法来获得元素的某种唯一标识符。看看我的jsfiddle的例子。

var getNodeIdentifier = function(element) { 
    return element.nodeName.toLowerCase() + "." + $(element).index(); 
};  

var current = element; 
var xpath = getNodeIdentifier(this); 

while (current.parentNode != null) { 
    xpath = getNodeIdentifier(current.parentNode) + "/" + xpath; 
    current = current.parentNode; 
} 

console.log(xpath); 

http://jsfiddle.net/qZMXN/29/

请注意,唯一的问题是,如果没有你的元素有任何类,这可能不会,因为如果你在用相同的节点类型同等级的多个元素工作,有没有办法唯一标识它们。

+0

这个页面将有多个具有相同节点的元素。 :(如何偏移位置,页面将只用于一个浏览器。我喜欢jsfiddle页+1 – Cobaia

+0

嗯...是的,你可能能够使用父母内的索引。你有能力包括jQuery的这个页面? – SoWeLie

+0

我会用chrome。忘了提及我对javascript不太了解,不知道jQuery是什么,我会读一下。 – Cobaia

1

我需要类似的东西,我想知道什么可能错误使用CSS选择器(除旧的浏览器的兼容性)。

喜欢的东西:

$('body>div:nth-of-type(1)>div:nth-of-type(2)>ul>li:nth-of-type(3)') 

http://jsfiddle.net/ddimitrop/Qa8P2/

人们可以很容易地建立路径到身体下面这样的选择。

function structureSelector(element) { 
    var tagName = element.tagName.toLowerCase(); 
    if (tagName == 'body') { 
    return tagName; 
    } 
    var indexInParent = Array.prototype.indexOf.call(element.parentNode.childNodes, element); 
    return structureSelector(element.parentNode)+'>'+tagName+':nth-child('+(indexInParent+1)+')'; 
} 

http://jsfiddle.net/ddimitrop/w9tbw/