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();
希望能帮助到你…