【问题标题】:Javascript crazy idea finding a nodeJavascript 疯狂的想法找到一个节点
【发布时间】:2010-04-18 10:36:16
【问题描述】:

我有一个疯狂的想法(但太疯狂了,它可能会起作用),页面上的每个元素都是用 javascript 创建的,但给定的 ID 是其在 DOM 中路径的哈希值。

因此,不是通过 DOM 搜索来查找元素,而是散列路径,然后使用该散列 getElementById()

这样的问题是获取路径可能比首先搜索 DOM 更昂贵。有什么想法可以做到这一点,或者它是否只是愚蠢的?

【问题讨论】:

  • 嗯,关键是 id 是节点的路径。所以如果你有一个路径,而不是搜索 DOM 来获取它,它已经作为一个哈希 id 存在。
  • 处理路径比使用普通的childNodes[n]parentNode 等更容易吗?
  • 首先找到元素不是问题吗?找到元素后,您可以保存参考。所以基本上你从一开始就搜索所有元素,而不是动态构建缓存。

标签: javascript search dom


【解决方案1】:

如果你知道元素的完整路径,那么去那条路径真的很难证明这种事情是合理的吗?通常,通过与绝对路径无关的共同方面收集元素之类的事情很麻烦。有了像Sizzle 这样的引擎,我不确定我是否看到了这个用例。 :-)

我还想知道在移动元素时如何处理它。重新分配他们的哈希值,大概会很快变得丑陋。

请注意,您的方法并非适用于 Javascript 在运行时创建的元素;您可以使用递归下降函数在事后轻松地分配它们:

function createIDs(element) {
    var child;

    if (!element.id) {
        element.id = createElementID(element);
    }
    for (child = element.firstChild; child; child = child.nextSibling) {
        if (child.nodeType == 1) { // Element
            createIDs(child);
        }
    }
}

// Kick things off
createIDs(document.body);

这是对预先生成的内容的一次性点击,而不是总是必须重新生成内容。不提倡,只是指出。

【讨论】:

    【解决方案2】:

    “页面上的每个元素都是用 javascript 创建的”

    你的问题。现在,您完全是在客户端 PC 上动态创建页面,而不是提供已经创建的页面。他们必须对每一页都这样做。有些事情告诉我,这将否定您通过哈希想法查找的任何积极影响。

    【讨论】:

    • Touche,我想这仅适用于需要即时创建所有内容的应用程序。像 UI 框架之类的。
    【解决方案3】:

    听起来你正在重新发明一个像 jQuery 这样的 javascript 框架。

    您可以将 html 片段插入 DOM 并将这些引用保留为函数指针,或者在插入它们时简单地为每个元素分配一个唯一的 id,然后它们会重新查询该 id(这非常快)。

    【讨论】:

      【解决方案4】:

      我发现这有两个主要问题:

      • 由于页面是在客户端动态创建的,搜索引擎机器人只会得到一个空页面。

      • 如果页面中有任何其他脚本更改 DOM,则元素的路径会更改,并且散列不再起作用。

      【讨论】:

        【解决方案5】:

        我想问题是你要解决什么样的问题。

        通过唯一 id 散列获取元素的路径很好,但是你从哪里得到路径呢?这些将是相当长的“id”并且相当笨拙。或者,如果您使用硬编码的散列 ID,那么您会极大地混淆您自己的代码。而且,如果您只是稍微重组文档,则每个路径以及每个 id 都会发生变化。实际上,用 Javascript 编写整个网站听起来很疯狂。 :)

        总的来说,这听起来不值得麻烦。在任何现代 JS 框架中,使用 CSS 样式选择器查找元素通常不是瓶颈,但它更容易开发。如果您正在编写原始 JS,那可能会有所不同,但是我认为您无论如何都不应该这样做,除非您有自虐倾向。 ;)

        【讨论】:

          猜你喜欢
          • 2016-09-12
          • 1970-01-01
          • 1970-01-01
          • 2010-12-12
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多