我已经创建了一个框架,在服务器上生成一个HTML“DOM”树,作为python对象的树,然后将其作为字符串吐出以发送到客户端。这样做的方法是通过树的递归深度优先遍历:例如div会吐出开头的“div”,吐出所有它的孩子的html,然后吐出结束“/div".
此树分为概念组件,如下所示:
graph http://lhy.mit.edu/media/Flow_Chart.png
这只显示前两个层次结构;实际站点还有更多:例如,注释栏中的每个注释都是一个自包含的组件,菜单栏上的每个按钮都是一个自包含的组件。如您所见,各种组件不需要在树中的相同深度。什么构成“组成部分”由我决定。
我想要的是每个组件的完整 html字符串(从该组件的根节点向下的所有内容),以及每个组件的部分 HTML字符串(该组件的HTML,减去其子组件的HTML)。例如,主要部分的部分 HTML将是html,head和两个div标签仅。另一方面,主要部分的完整 html将是页面上的每个节点。
我该怎么做?我可以找到每个组件和子组件的完整的 HTML字符串,用一些字符串标记每个子组件的边界并执行Regex-Removals以找到部分每个组件的HTML字符串,但感觉笨重和低效。
我可以做一个迭代加深的DFS,在组件及其子组件之间的边界处停止,直到探索到该组件中的每个节点。然后,我会为每个组件提供部分 HTML,但之后我需要执行类似的hacky Regex-Inserts,以便稍后为每个组件构建完整的 HTML。
我可以做到这两点,但这需要两次通过而且价格昂贵,但可能不像上面的Regex体操那样昂贵。
我可以做一个优先级队列Dijkstra,让每个组件的优先级高于其子组件。它将以正确的顺序遍历树,在移动到子节点之前完成每个组件,但我不知道如何从中获取最终格式良好的HTML字符串。
所有这一切的目的是让服务器能够智能地,完全地自主地确定客户端页面上需要在两个任意页面之间的页面转换上进行更改的最小组件集。
如果我在自己的网站上创建了一个新页面,我只需要零额外的代码行就可以让它与任何现有页面顺畅地进行ajax。
但首先我需要按顺序获取我的图形遍历html-spewing算法。有什么想法吗?
答案 0 :(得分:0)
我假设您的客户端是Javscript代码,因为您没有指定任何内容。
不要做太复杂的事情。尤其是对于上帝的爱don't try using regexes to work with HTML。
您的服务器是否向您发送了完整功能的HTML字符串?在这种情况下,您可以将其转换为可以使用的实际DOM(有很多方法可以实现),然后使用元素的.innerHTML
来获取“完整的html”并使用{{ 1}}获取标签的名称。
我仍然不明白为什么你需要所有这些复杂功能。如果您已经完成了下载整个“新页面”的麻烦,那么尝试更改尽可能少的部分没有太多理由 - 只需更换一切并忘记它(对服务器的调用应该是反正最贵的东西)。
如果你真的想要使用更少的蛮力,那么你应该找到一种方法来请求/仅通知有趣的变化,而不必看一切。然后,给定要更改的部分和文本,您只需要执行类似
的操作.tagName