document.write – 用“”替换“”标签

我已经测试过这段代码,手动将反斜杠添加到所有标签中,并且
如果所有标签都变为则代码可以正常工作。

 var iframe = document.createElement('iframe'); var html = '$(window).load(function(){function popo1(){alert("ciaoooo!");}popo1();$(".eccolo").html("



xD sygsyusgsuygsus ysg usygsuys");});
'; document.body.appendChild(iframe); iframe.contentWindow.document.open(); iframe.contentWindow.document.write(html); iframe.contentWindow.document.close();

DEMO

但我需要使用类似的东西用动态自动替换所有标签

 XXX.replace(//ig, ""); 

根据这篇文章

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

 var iframe = document.createElement('iframe'); var XXX = '$(window).load(function(){function popo1(){alert("ciaoooo!");}popo1();$(".eccolo").html("



xD sygsyusgsuygsus ysg usygsuys");});
'; var YYY = XXX.replace(//ig, ""); document.body.appendChild(iframe); iframe.contentWindow.document.open(); iframe.contentWindow.document.write(YYY); iframe.contentWindow.document.close();

DEMO

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

但是如果我想用<\/script>动态替换所有标签呢?

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

我从一个总是改变的输入中获取var XXX 。我刚刚在我的问题中添加了一个定义的值( var XXX='...

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

       

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

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

    "; // <====== });    

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

 var str = "The problem is here: "; 

需要是

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

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

从根本上说,如果你收到类似内容的输入,给你的人就是给你无效的输入。 子字符串 不能出现在 / 标记内的JavaScript代码中 - 不能出现在字符串文字中,也不能出现在评论中。

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

是非平凡的 ,这就是为什么规范不需要HTML解析器来实现它。

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

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

以下是代码和DEMO

 var iframe = document.createElement('iframe'); var 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("



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();

希望能帮助到你…