Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

实现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!

学习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)))//写入当前文档
        

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(2018)  评论(3编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示