我正在使用的遗留页面中有一些Javascript,它可以读取整个页面的HTML,以便将其保存到文件中:
html = document.documentElement.outerHTML;
然而,这个和innerHTML
替代方法都会删除某些属性值周围的双引号,导致HTML无法用于以后的处理。
e.g。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
成为
<META content="text/html; charset=utf-8" http-equiv=Content-Type>
当我'查看源'时,引号是正确的,那么如何使用Javascript获取正确的HTML?我的开发环境是Visual Studio 2013和Internet Explorer 10(在怪癖模式下),如果相关的话。
澄清:后续处理的第一步是将HTML加载到XMLDocument中。问题是由于缺少双引号而导致失败。
答案 0 :(得分:1)
outherHtml和innerHtml都不能保证为您提供与源中看到的相同的html。浏览器将元素序列化为字符串,而不是返回实际的源HTML代码。
一种解决方法是返回父元素的innerhtml而不是元素的outerhtml。这有时更准确。当然,这假设父母没有其他孩子。 但是,您要使用整个文档,因此没有父元素。
我认为解决方案需要另一种方法来处理整个文档。 Perhpas在ajax调用中请求页面,并将整个响应发送到服务器。
此代码运行的是哪些页面?它是在您在自己的网站中控制的页面中,还是包含在您无法控制的许多网站中?页面的html内容是否会因用户输入而改变,或者您是否尝试获取从服务器返回时显示的页面?
答案 1 :(得分:1)
大多数浏览器都不这样做,并且根据HTML5 CR,所有属性值都出现在序列化中的双引号中,即使在HTML序列化中也是如此。但IE 8及更早版本使用部分不同的序列化。结果仍然是正确的HTML规则,但不是XHTML规则(但IE 8及更早版本不支持XHTML - 他们消化XHTML,但仅仅因为他们的标签汤解析器是允许的。)
您可以考虑使用将HTML转换为XHTML的后处理器。或者您可以编写自己的函数,这相当于在现代浏览器中获取outerHTML
。序列化在HTML5中详细定义,因此这将相对简单。
答案 2 :(得分:0)
如何防止从outerHTML中删除双引号?
你做不到。但是,只有HTML规范允许,浏览器才会这样做。
然而,这会删除一些属性值周围的双引号,导致HTML无法用于以后的处理。
最好通过修复处理器来解决这个问题,因为它可以处理HTML而不是试图强制客户端提供处理器所期望的任何内容。
你可能会通过HTML解析器和XHTML序列化程序以你处理文件的任何语言传递它,但是只使用HTML解析器是一个更简单的选项。