我已经测试了此代码,手动将反斜杠添加到所有</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();
但我需要使用{/ 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();
不幸的是我不能使用.js文件,所以我希望有一种方法可以正确地替换标签
答案 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();
希望它有所帮助...