为什么要在字符串中分割脚本结束标记?

时间:2019-03-27 11:47:18

标签: javascript tags

我正在研究一个asp.net项目,在其中的一部分上,我需要使用javascript打印页面的一部分,其中包含图像。经过一番挖掘,我找到了一个代码,它可以正常工作。

<script>


function VoucherSourcetoPrint(source) {
    return "<html><head><script>function step1(){\n" +
            "setTimeout('step2()', 10);}\n" +
            "function step2(){window.print();window.close()}" +
            "\n</scri" + "pt></head><body onload='step1()'>\n" + <%-- lokk this line--%>
            "<img src='" + source + "' style='width: 300px; height: 150px; margine:none;' /></body></html>";
}

function VoucherPrint(source) {    
    Pagelink = "about:blank";
    var pwa = window.open(Pagelink, "_new");
    pwa.document.open();
    pwa.document.write(VoucherSourcetoPrint(source));
    pwa.document.close();
}


</script>

正如您在第一个函数上看到的那样,它正在返回一个字符串,并且有一个脚本结束标记,它写为</scri" + "pt>,首先我认为这是一个错误,并尝试删除多余的引号和加号,然后显示错误的字符串。

enter image description here

我很困惑,为什么它必须像</scri" + "pt>一样?

1 个答案:

答案 0 :(得分:2)

因为HTML解析器将找到字符“ </script>”的序列,并结束脚本元素。然后它将无效的JavaScript传递给JavaScript解析器。

这是一个简化的示例:

<script>console.log("</script>");</script>
▲       ▲           ▲▲        ▲  ▲
1       2           34        5  6
  1. 脚本元素开始标记。
  2. 开始使用JavaScript(console.log("-不是可编译的脚本)。
  3. JavaScript结束
  4. 脚本元素结束标记
  5. 在HTML文档(");)中以纯文本显示的文本
  6. 脚本末尾,没有匹配的打开标记。被HTML解析器丢弃为错误。

一种更优雅的方法是逃避/

<script>console.log("<\/script>");</script>