Javascript 在DOM树中使用某种节点号进行元素搜索

Javascript 在DOM树中使用某种节点号进行元素搜索,javascript,jquery,html,dom,Javascript,Jquery,Html,Dom,我正在寻找JavaScript可以提供的递归搜索策略(也欢迎JQuery)。现在,如果我知道某个元素的id、类名或标记名,我就可以查找该元素,或者我还可以查找基于css属性和父节点中元素索引的其他条件 基本上,我要做的是根据节点的x,y位置搜索节点(这是简单的部分),然后在内存中存储对该节点的某种引用(JavaScript代码之外),然后再次使用该引用(可能该引用是dom树中的节点号)来定位同一元素 在这个HTML页面中,元素没有任何id、类名 如何获得对DOM中任意元素的可序列化引用 编辑 我

我正在寻找JavaScript可以提供的递归搜索策略(也欢迎JQuery)。现在,如果我知道某个元素的id、类名或标记名,我就可以查找该元素,或者我还可以查找基于css属性和父节点中元素索引的其他条件

基本上,我要做的是根据节点的x,y位置搜索节点(这是简单的部分),然后在内存中存储对该节点的某种引用(JavaScript代码之外),然后再次使用该引用(可能该引用是dom树中的节点号)来定位同一元素

在这个HTML页面中,元素没有任何id、类名

如何获得对DOM中任意元素的可序列化引用

编辑 我正在开发android的webview,首先Java代码调用JavaScript例程,它获取元素(我要查找的编号),然后在Java代码的后面部分,它再次将该元素编号传递给JavaScript以定位相同的元素

在内存中存储对该节点的某种引用(在javascript代码之外),然后重新使用该引用(可能该引用是dom树中的节点号)来再次定位相同的元素

以最简单的形式:

  • 存储子位置列表,从
    文档开始计数
  • 迭代该列表以检索有问题的元素
i、 e

测试:


应该不用说:此解决方案假定在调用
refElement()
getElement()

之间有一个不变的文档结构,为什么要进行否决?这个问题看起来不错。@BlueIce可能是因为没有代码?然而,问题不仅仅是简单地请求代码。我同意你的看法。我不太清楚你所说的“在内存中引用此节点(javascript代码之外)”是什么意思?@Mouser,首先我通过jQuery中的普通搜索(例如find()方法)获取js元素对象,但之后我不允许再次使用同一个对象实例。将会有Java代码接管,它应该为该元素存储某种类型的字符串标识符,然后使用该标识符再次调用Java脚本方法代码。顺便说一句,我正在开发android的webview。这看起来是一个可行的解决方案,但是我们必须为getElementsByTagName()期间已经发生的递归调用refElement()。昂贵吗?我不明白。啊,这不会太贵,因为我们只迭代标记,而不是单个文本节点。这样或那样都不会太贵。作为迭代实现,它并不昂贵,也不会作为递归实现
refElement()
在我老化的笔记本电脑上每秒可以轻松运行100000次以上。是的,起初我认为它对整个dom是递归的,但这段代码非常优雅。。非常感谢:)
function refElement(elem) {
    var positions = [],
        position;

    while (elem) {
        position = 0;
        while (elem.previousElementSibling) {
            position++;
            elem = elem.previousElementSibling;
        }
        positions.unshift(position);
        elem = elem.parentElement;
    }
    return positions.join();
}

function getElement(ref) {
    var positions = ref.split(/,/),
        elem = document;

    while (elem && positions.length) {
        elem = elem.children[positions.shift()];
    }
    return elem;
}
var e = document.getElementsByTagName("TEXTAREA")[0];
var ref = refElement(e);
console.log(ref)                   // 0,4,6,1,0,2,1,4,6,0,0,1
console.log(e === getElement(ref)) // true