代码之家  ›  专栏  ›  技术社区  ›  vsync Qantas 94 Heavy

这是什么意思:“document.write('<scr'+'ipt…?”

  •  19
  • vsync Qantas 94 Heavy  · 技术社区  · 15 年前

    我在每个雅虎上都看到过这个! news page ,在源代码的底部,
    却不明白为什么他们打破了 脚本 像那样的话。

    有人知道这有什么原因吗?

    document.write("<scr"+"ipt language=javascript src=http://l.yimg.com/d/lib/bc/bc_2.0.4.js></scr"+"ipt>");
    
    6 回复  |  直到 12 年前
        1
  •  39
  •   RichieHindle    15 年前

    考虑这个简化的例子:

    <script>
    document.write("something </script> something");
    </script>
    

    浏览器的HTML解析器将看到 </script> 在javascript字符串中,并将其解释为脚本元素的结尾。

    HTML解析器不知道JavaScript语法-它只知道 <script> 元素在下一个结束 </Script & Gt; .

    (它还知道您不能嵌套 <脚本& GT; 元素,因此打开 <脚本& GT; 以及结束语 </Script & Gt; 在您的示例中。)

        2
  •  4
  •   Eric Lippert    15 年前

    假设您正在编写一个工具来检测文本块中脚本块的开始和结束。假设你看到了

    <blah><blahdeblah><script>
    
    blah blah blah
    
    blah
    
    print("</script>")
    
    print("<script>")
    
    blah
    
    </script>
    
    </blahdeblah></blah>
    

    在不了解脚本语言语法的情况下,您的工具如何知道这是一个脚本块,而不是两个脚本块之间的”)blah?

    网络浏览器就是这样一种工具。这是一个合理的做法,确保你从来没有混淆网络浏览器 <script> </script> 在您的文件中,除非它实际上是一个脚本标记。

        3
  •  3
  •   Steve B.    15 年前

    这样它就不会被计算,而是作为字符串插入。

        4
  •  3
  •   strager    15 年前

    这是防止XML/XHTML和HTML验证器对源代码大喊大叫的一个坏方法。

        5
  •  0
  •   Colin    15 年前

    有些浏览器在解析文档时往往“动作”很快,当它们找到一个脚本标记时(即使它本身在一块JS中),也会立即尝试执行javascript。为了避免这种情况,他们打破了标签的贴花。

        6
  •  0
  •   Umbrella Ismael Miguel    12 年前

    有关此问题的完整讨论,请参阅:
    http://www.wwco.com/~wls/blog/2007/04/25/using-script-in-a-javascript-literal/

    简而言之,您的代码分为两个独立的步骤进行解析。

    第一个是XML。这意味着元素<script>正在查找</script>。记住XML元素是内容无关的,这一点很重要。这意味着解析器不知道 然而 里面有javascript。

    一旦它包含了<script>元素的内容, 然后 它处理文本块,可能是javascript。

    通过使用字符串连接运算符拆分标记,可以防止常量绊倒XML阶段。

    一个简单的解决方案是将<和>放在javascript文本中。