代码之家  ›  专栏  ›  技术社区  ›  Ian McIntyre Silber

检索页面内容的InnerHTML替代方法?

  •  1
  • Ian McIntyre Silber  · 技术社区  · 15 年前

    我目前正在使用innerhtml来检索HTML元素的内容,我发现在某些浏览器中,它并不返回源代码中的内容。

    例如,在下面一行使用firefox中的innerhtml:

    <div id="test"><strong>Bold text</strong></strong></div>
    

    将返回:

    <strong>Bold text</strong>
    

    在IE中,它返回原始字符串,带有两个结束强标记。我假设在大多数情况下,火狐清除错误代码并不是问题(而且可能是一个好处)。但是,对于我要完成的工作,我需要原始HTML源代码中显示的准确代码。

    这有可能吗?还有其他的javascript函数吗?

    6 回复  |  直到 13 年前
        1
  •  3
  •   Ivan Nevostruev    15 年前

    我认为在现代浏览器中,你不会收到不正确的HTML代码。这是正确的行为,因为您没有动态生成HTML的源代码。例如firefox' innerHTML 返回的一部分 DOM tree 以字符串表示。不是HTML源。这不是问题,因为第二个 </strong> 标记仍被浏览器忽略。

        2
  •  2
  •   Andris    15 年前

    innerHTML 不是从文档的实际源(即HTML文件)生成的,而是从浏览器呈现的DOM对象派生的。因此,如果IE以某种方式向您显示了不正确的HTML代码,那么它可能是某种bug。没有这样的方法可以在每个浏览器中检索无效的HTML代码。

        3
  •  1
  •   bobince    15 年前

    一般来说,由于伊万和安德里斯的原因,你不能得到原始的无效HTML。

    IE也和火狐一样,通过创建一个带有标记名的元素节点,修复你的代码,尽管你不会注意到序列化。 /strong 与伪造的结束标签相对应。无法保证IE会在解析/序列化周期中保留其他无效的标记结构。

    事实上,即使对于有效的代码,输出 innerHTML 不会与输入完全相同。属性顺序不维护,标记名大小写不维护(即 <STRONG> ,空白是各种地方丢失,实体引用不维护等等。如果您__需要确切的代码__,则必须保留确切代码的副本,例如在 <script> 阻止在相关内容后写入。

        4
  •  1
  •   noah    15 年前

    如果您不需要HTML来呈现(例如,您将把它用作JS模板或其他东西),您可以将它放在文本区域,并使用innerhtml检索内容。

    <textarea id="myTemplate"><div id="test"><strong>Bold text</strong></strong></div></textarea>
    

    然后:

    $('#myTemplate').html() === '<div id="test"><strong>Bold text</strong></strong></div>'
    

    除此之外,浏览器将决定如何解释HTML,它将只返回它的解释,而不是原始的。

        5
  •  0
  •   PurplePilot    15 年前

    内文本?还是有同样的效果?

        6
  •  0
  •   alemjerus    15 年前

    你必须使用 innerXML 财产。它正是你想要实现的。