document.write - 替换""标签为"< \ / script>"

时间:2014-07-28 04:59:30

标签: javascript jquery replace

我已经测试了此代码,手动将反斜杠添加到所有</script>标记中,并且 如果所有标签都变为<\/script>,则代码可以正常运行。

var iframe = document.createElement('iframe');
var html = '<html><head><script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.js"><\/script><script type="text/javascript">$(window).load(function(){function popo1(){alert("ciaoooo!");}popo1();$(".eccolo").html("<br><br><br><br>xD sygsyusgsuygsus ysg usygsuys");});<\/script></head><body><div class="eccolo"></div></body></html>';

document.body.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(html);
iframe.contentWindow.document.close();

DEMO


但我需要使用{/ p>之类的内容动态地使用</script>自动替换所有<\/script>标记

XXX.replace(/<\/script>/ig, "<\\\/script>");

根据 this post


但似乎这种替换实际上不起作用......

var iframe = document.createElement('iframe');
var XXX = '<html><head><script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.js"><\/script><script type="text/javascript">$(window).load(function(){function popo1(){alert("ciaoooo!");}popo1();$(".eccolo").html("<br><br><br><br>xD sygsyusgsuygsus ysg usygsuys");});<\/script></head><body><div class="eccolo"></div></body></html>';

var YYY = XXX.replace(/<\/script>/ig, "<\\\/script>");

document.body.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(YYY);
iframe.contentWindow.document.close();

DEMO


不幸的是我不能使用.js文件,所以我希望有一种方法可以正确地替换标签

2 个答案:

答案 0 :(得分:2)

  

但是,如果我想用</script>动态替换所有<\/script>代码,该怎么办...

在下面的评论中,你说过:

  

我从一个总是改变的输入中得到var XXX ..我刚刚在我的问题中添加了一个定义的值(var XXX='<html><head>...),例如

这与你问题中的内容完全不同。如果您说您将收到XXX字符串中的输入,其内容(在内存中,而不是字符串文字)如下所示:

<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.js"></script>
    <script type="text/javascript">
        $(window).load(function() {
            function popo1() {
                alert("ciaoooo!");
            }
            popo1();
            $(".eccolo").html("<br><br><br><br>xD sygsyusgsuygsus ysg usygsuys");
        });
    </script>
</head>
<body>
    <div class="eccolo"></div>
</body>
</html>

...然后输入完全正常,可以按原样用于设置iframe的内容。您不必对其进行替换。您链接的帖子与您正在做的事情无关。

但如果你说你会得到这样的输入:

<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.js"></script>
    <script type="text/javascript">
        $(window).load(function() {
            var str = "The problem is here: </script>"; // <======
        });
    </script>
</head>
<body>
    <div class="eccolo"></div>
</body>
</html>

...然后你处于与HTML解析器相同的不幸位置:你不知道子串</script>何时实际结束了一个脚本元素,或者是一个JavaScript字符串文字中的文本(或者评论)。如果您有一个包含该内容的网页,则HTML解析器会在The problem is here:之后立即结束脚本元素。实际上,如果您通过iframe将该内容输出到document.write,则解析器会阻塞它。这一行:

var str = "The problem is here: </script>";

需要

var str = "The problem is here: <\/script>";
// or
var str = "The problem is here: </sc" + "ript>";
// or similar

...以避免绊倒HTML解析器。 (在.js文件中没问题,但这不是你的用例。)

从根本上说,如果你收到类似内容的输入,那么给你的人就会给你无效的输入。子字符串</script> 无法出现在<script> / </script>标记内的JavaScript代码中 - 不在字符串文字中,不在评论中,不在任何地方。

规范定义的答案是:不要试图弄明白,要求它是正确的。 但是如果您知道脚本是JavaScript,并且您确实想要允许无效输入并更正它,那么您需要一个JavaScript解析器。这听起来很离谱,但Esprima就是这样,Meteor中有jsparser,可能还有其他人。您将扫描您给出的字符串以查找<script>,然后让JavaScript解析器接管并解析代码(您可能需要修改它以便它知道在</script>外停止一个字符串文字/评论)。然后获取解析器使用的文本,使用replace将代码文本中的任何</script>转换为<\/script>,然后继续。

非平凡,这就是规范不要求HTML解析器执行此操作的原因。

但同样,如果输入就像你的问题中的示例(没有使用反斜杠来避免字符串文字的这个问题),则根本不必执行replace。只需将其输出到iframe,它就可以正常工作。

答案 1 :(得分:-1)

您可以以编程方式创建脚本标记,并在加载页面后附加到head标记中。

以下是代码和DEMO

var iframe = document.createElement('iframe');

var html = '<html><head></head><body><div class="eccolo"></div></body></html>';

document.body.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(html);

var script1 = iframe.contentWindow.document.createElement('script');
var script2 = iframe.contentWindow.document.createElement('script');

script2.textContent = '$(window).load(function(){function popo1(){alert("ciaoooo!");}popo1();$(".eccolo").html("<br><br><br><br>xD sygsyusgsuygsus ysg usygsuys");});'
var head = iframe.contentWindow.document.querySelector('head');
head.appendChild(script1);
script1.onload = function() {
    head.appendChild(script2);    
}
script1.src = 'http://code.jquery.com/jquery-1.11.0.js';
iframe.contentWindow.document.close();

希望它有所帮助...