存储和检索DOM元素

时间:2011-03-20 01:03:10

标签: javascript dom

想知道是否有人在此之前遇到过这个......

我想使用JavaScript来识别页面上的DOM元素,然后将其引用存储在数据库或cookie中以供以后检索。

为了具体,我要做的是创建一个UI,以便当用户点击页面上的元素时,JavaScript会触发click事件,传递点击的DOM元素的实例。

到目前为止很容易,对吧?

所以我想要做的是存储这个DOM元素的“身份”,比如在数据库中,所以当我稍后返回到这个页面时,我可以提取所有存储的DOM元素身份并在页面再次。

如果这个DOM元素具有唯一ID,那么这很简单。只需存储ID,然后当页面重新启动时,我们只需执行getElementByID,然后我们再次获得DOM元素。

问题在于,并非DOM中的所有内容都具有唯一标识符,因此存在问题所在。

我最初有一些不好的想法,比如遍历整个DOM并使用唯一的类名(dom-01,dom-02等)递增它们,这会给我一个标识符。但这会导致很多初始开销,如果页面发生变化,DOM元素的顺序也不一样,所以我们不会得到正确的DOM元素。

我从未尝试过,但另一个想法是序列化DOM元素,将其粘贴在数据库中,然后重新加载解析到一个对象,并使用该对象找到我原来的DOM元素。我之前从未这样做过,所以我如何将恢复(解析)的对象与DOM中的对象进行比较是一个很大的未知。

欢迎使用序列化解决方案或任何其他原创想法的细节!!

先谢谢大家!

2 个答案:

答案 0 :(得分:3)

这是一个jsFiddle解决方案尝试:http://jsfiddle.net/techbubble/pJgyu/7720/

我采用的方法是计算目标元素的HTML内容的简单哈希,或者如果不存在这样的内容,则聚合属性的哈希值和元素的值。我有一个getElementHash()函数,它返回一个格式为字符串的字符串:TAG:[H | A]:哈希(H或A表示是否使用HTML内容或属性来计算哈希值)。这会为页面上具有HTML内容或至少具有一个属性的任何元素生成唯一键(可能存在极小的重复风险)。

为了检索具有先前保存的键的元素,我创建了一个getElementByHash()函数。它使用从jQuery选择器中的键中提取的标记。对于返回的每个元素,计算HTML内容或属性散列(基于键中指定的值“H”或“A”)以查看它是否与键中的散列匹配。如果匹配,搜索结束并返回元素。

只要HTML内容(或属性)保持不变,此方法就不会在页面上移动元素。它不会为既没有任何HTML内容也没有任何属性的元素生成一个键(这使得它们无论如何都无用)。

答案 1 :(得分:2)

如果要将节点的位置保留在DOM中,为什么不保留它的XPath呢? XPath允许您在文档中保留节点的确切位置,只要该位置不会更改。例如,你可以说像

这样的东西
//div[@id="xpath_is"]/span[class="cool"]/a[4]

在[{1}}

<a>内的第<span class="cool">个标记含义

http://www.w3.org/TR/xpath/
http://www.w3schools.com/xpath/default.asp

您可以通过使用Firebug检查属性并右键单击节点并选择“复制XPath”来获取属性的XPath。我不确定从DOM节点获取它有多容易(有方法,但不确定有多少烘焙实现)。简单地寻找一个祖先(通过向上遍历<div id="xpath_is">并构建一个)并添加.parentNode.className s,你会相对容易 - 但我也是懒得写这个,;)。