Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript获取没有id的相同html元素_Javascript_Html_Javascript Events - Fatal编程技术网

使用javascript获取没有id的相同html元素

使用javascript获取没有id的相同html元素,javascript,html,javascript-events,Javascript,Html,Javascript Events,我正在使用event.target或event.srcement获取元素 在不设置id的情况下,我可以保存哪些事件信息以准确了解之前选择的元素 如果我关闭页面,如何获得相同的元素 保存所有parentNode似乎是重新获取元素的一种非常缓慢的方法 有没有更有效的方法 页面将包含固定数量的元素。但此页面无法更改,我无法包含id属性。但是,我会标记用户再次打开页面时单击的最后一个标记。根据您的要求,最好的方法是基于类名和元素名(如果不存在)生成某种xpath。如果您没有id,这是获取元素某种唯一标识

我正在使用event.target或event.srcement获取元素

在不设置id的情况下,我可以保存哪些事件信息以准确了解之前选择的元素

如果我关闭页面,如何获得相同的元素

保存所有parentNode似乎是重新获取元素的一种非常缓慢的方法

有没有更有效的方法


页面将包含固定数量的元素。但此页面无法更改,我无法包含id属性。但是,我会标记用户再次打开页面时单击的最后一个标记。

根据您的要求,最好的方法是基于类名和元素名(如果不存在)生成某种xpath。如果您没有id,这是获取元素某种唯一标识符的唯一方法。有关示例,请参见我的JSFIDLE

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


请注意,唯一的问题是如果您的元素都没有任何类,这可能不起作用,因为如果您在同一级别上有多个元素具有相同的节点类型,则无法唯一地标识它们。

我发现了一种有趣的方法

要保存元素,请执行以下操作:

// 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;
    }
}

我需要类似的东西,我想知道使用css选择器会出什么问题(除了旧的浏览器兼容性)

比如:

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

人们可以很容易地沿着通向身体的路径构建这样一个选择器

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)+')';
}

请澄清,
没有指向您需要的元素(在事件处理程序的范围内)?当您关闭页面并返回时,显然,所有元素都将被重新创建,因此实现这一点的唯一方法是某种唯一的id。您到底想做什么?最有效的方法几乎肯定是设置和
id
。为什么要禁止最简单的解决方案?@SoWeLie我在报告中添加了更多信息question@Jordan页面无法更改。我需要知道最后单击的元素。该页面将有多个元素,在同一级别具有相同节点:(偏移位置如何,该页面将只在一个浏览器中使用。我喜欢JSFIDLE page+1Hmm…是的,您可以在父级中使用索引。您是否有能力在该页面中包含jquery?我将使用chrome。忘了提及我对javascript知之甚少,也不知道什么是jquery,我将阅读相关内容.JQeury可以很容易地获得节点的序号,我将更新JSFIDLE。我看不到链接上的更新。你能传递新链接吗?
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)+')';
}