如何强制浏览器停止将动态插入的代码解析为HTML4
How to force the browser to stop parsing dynamically inserted code to HTML 4?
我实际上需要将一些非常旧的HTML解析为PDF文件,我已经有了一个jar,但它只接受合法的XHTML代码。因此,我必须解析我的旧HTML代码,这样jar才会接受它。因为我非常清楚我解析的HTML代码会是什么样子。我的想法是使用John Resig的HTML Parser将某些标签(img、br、meta)解析为直接的XML,这将对它们产生所需的效果(主要是关闭标签)。
我的实际尝试是这样的:
function fixTags() {
var tagsToParse = new Array( "br", "img", "input", "meta" );
for(i = 0; i < tagsToParse.length; i++) {
var elements = document.getElementsByTagName(tagsToParse[i]);
for(j = 0; j < elements.length; j++) {
elements[j].outerHTML = HTMLtoXML(elements[j].outerHTML);
}
}
}
这里的问题是,浏览器会将元素的新代码解释为HTML4,这导致他更改回我想要更改的内容。例如,<br>
在经过解析器后变成了<br/>
,但浏览器实际上会将其解释为HTML4,并且元素的outerHTML属性将再次为<br>
。
我解决这个问题的第一次尝试是强制文档暂时为XHTML:
var root = document.getElementsByTagName("html")[0];
root.setAttribute("xml", "http://www.w3.org/1999/xhtml");
但他的行为似乎一点也不困扰浏览器。
"显而易见"的解决方案是从dom构建一个字符串树,替换那里的字符串,并遍历树到我想要的字符串,对于这个"小"问题来说,这似乎有点太重和复杂了,这就是我问你的原因。
所以,如果有人有一个更简单的解决方案的想法,我会很高兴,应用程序是IE专用的,所以IE专用的解决方案也被接受。
对于您的用例,使用现有的HTML->XHTML转换器可能是最简单的,例如:http://www.it.uc3m.es/jaf/html2xhtml/simple-form.html
如果您真的想在浏览器中这样做,对于一个简单的解决方案,您可以尝试这样的方法,使用简单的正则表达式(通常不应该使用RegExp来解析XML)和XMLSerializer。
var serializer = new XMLSerializer();
var xml = serializer.serializeToString(document).replace(/<(img|meta|input|br|link)([^>]*)/gi, function (ignore, tagName, attributes) {
return '<' + tagName + attributes + ' />';
});
如果不起作用,你可以查找一个不那么天真的正则表达式,但我认为对于一个可以转换为PDF的文档来说,这应该很有用。
EDIT:请注意,RegEx假定在执行此操作之前,这些标记都不是自动关闭的。
- 从桌面读取python文件时高亮显示代码
- 如何将函数包装在函数中以避免代码重复
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 货币代码为欧元-金额的格式不应包含小数
- Regex代码只允许一个空格
- 如何将屏幕分辨率乘以 80%,然后在代码中使用
- 从var向代码隐藏函数传递值
- 如何动态插入jquery代码
- 如何在php变量中嵌入JQuery代码
- 代码不会验证
- 如何从rails中的代码中删除新行( )
- Angularjs代码未在匿名函数中运行
- 如何做到这一点,使代码在不传递条件后执行函数
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 面向对象的Javascript代码在IE7中不起作用
- 将 jQuery 代码添加到 Index.aspx 页面
- 为什么忽略了eval()代码中的语法错误
- 元素在我的代码中不会.fadeTo.Don'I don’我不知道;s错误的JavaScript、JQuery、H
- 如何轻松地将服务器端变量从Java代码转移到客户端代码
- 如何强制浏览器停止将动态插入的代码解析为HTML4