实现here document的一些副产品
近日打算利用注释实现here document,可惜不是这个浏览器就是那个浏览器给我制造麻烦。这次是火狐,它为了追求解析速度,做了一个作弊的特性,把javascript中的注释都去掉了!见下面实验:
考虑到压缩时会去掉注释,这是更健壮的版本:
经测试,也只有FF支持这混帐的特性。那么我们就集中精力兼容FF吧,这是外国人给出一个解决方案,利用E4X。
var string = (<r><![CDATA[
The text string goes here. Since this is a XML CDATA section,
stuff like <> work fine too, even if definitely invalid XML.
]]></r>).toString();
接着下来要做的事是:检测浏览器是否支持E4X!
正如Douglas Crockford大神在Qcon里所说,New syntax is useless if you must support older browsers.。
New syntax === syntax errors
为了防止其编译期的致命错误,我们只有使用eval,但对于大段的代码这是非法不妥的,因此E4X方案给我抛弃了。不过,最后还是给我找到解决方安案了……
ぉまけ♪ 我的方法功能预览:
window.onload = function(){
var xml = dom.here('EOS',new Error /*
<<EOS
<?xml version="1.0" encoding="ISO8859-1" ?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</CATALOG>
EOS
*/ )
var xlt = dom.here("xslt",new Error/*
<<xslt
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" >
<xsl:output method='html' version='1.0' encoding='GB2312' indent='yes'/>
<xsl:template match="/">
<html>
<body>
<table border="2" >
<tr bgcolor="yellow">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="CATALOG/CD">
<tr>
<td><xsl:value-of select="TITLE"/></td>
<td><xsl:value-of select="ARTIST"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
xslt
*/
)
//将注释中的XML字段转换为一个XML文档!
var xmldom = dom.xml(xml);//生成一个XML文档的包裹对象
var xltdom = dom.xml(xlt).xml//生成一个XSLT文档
var result = xmldom.toDocument(xltdom)//转换一个HTML文档
document.write((dom.xml.serialize(result)))//写入当前文档
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
浙公网安备 33010602011771号