代码:
content = "<script>" + js_code + "</script>";
$('#iframe_id').contents().find('body').append(content);
但不知何故它没有起作用。我查看了一些现有/相关的答案,似乎jQuery并不能完全将脚本标签识别为脚本标签。iFrame与同一域/同一端口/同一主机位于同一位置,因此不存在跨站点脚本等问题。我该如何解决这个问题?
content = "<script>" + js_code + "</script>";
$('#iframe_id').contents().find('body').append(content);
但不知何故它没有起作用。我查看了一些现有/相关的答案,似乎jQuery并不能完全将脚本标签识别为脚本标签。iFrame与同一域/同一端口/同一主机位于同一位置,因此不存在跨站点脚本等问题。我该如何解决这个问题?
</script>
),HTML解析器会混淆并提前关闭脚本标签。"<\/script>"
中转义 /
。这是因为在JavaScript(和其他一些语言)中,任何无效的转义序列都将被忽略,因此"\l"
被视为"l"
,"\/"
被视为"/"
。然而,HTML解析器不使用反斜杠来转义它们,因此它不会混淆(感谢https://stackoverflow.com/users/405681/keaukraine)。var scriptTag = "<script>alert(1)<\/script>";
$("#iframe").contents().find("body").append(scriptTag);
原始解决方案
拆分结束标签,以避免破坏HTML解析器。本页面上的其他解决方案之所以有效,是因为它们从未在代码中使用字符串</script>
(jsfiddle):
var scriptTag = "<script>alert(1)<";
scriptTag += "/script>";
console.log(scriptTag);
$("#iframe").contents().find("body").append(scriptTag);
或者(jsfiddle):
var scriptTag = "<script>alert(1)<"+"/script>";
$("#iframe").contents().find("body").append(scriptTag);
var scriptTag = "<script>alert(1)<\\/script>";
- http://jsfiddle.net/tLHn5/ - keaukrainefunction putScriptInIframes(script, scriptId) {
var $iframes = $('iframe');
$iframes.each(function () {
var thisDoc = this.contentWindow.document;
if ( ! thisDoc.getElementById(scriptID)) {
var scriptObj = thisDoc.createElement("script");
scriptObj.type = "text/javascript";
scriptObj.id = scriptId;
scriptObj.innerHTML = script;
thisDoc.body.appendChild(scriptObj);
}
});
}
var script = "alert('hello world');";
$('#iframe').contents().find('body').append($('<script>').html(script))
在Fiddle中工作
text()
方法和html()
方法的区别相同。如果你附加一个字符串,它可能不会被视为HTML。 - Neil S<script>
元素中,在其中提到</script>
将关闭该元素而不是保留为String
值。这避免了提及它。 - Jonathan LonowskigetScript()
将它加载到框架中。 - Neil S你需要转义/script
。它出现了。
例如像Google Analytics一样操作。
$("#iframe").contents().find("body").append(decodeURI("**%3Cscript%3E** alert(2) **%3C/script%3E**"));
用这些转义字符替换script
和/script
希望对您有所帮助。
由于 iframe 运行在自己的 window
中,您还需要注入 jquery.js 文件的导入。
<script type="text/javascript" src="/jquery/jquery-ui-1.9.1.custom.js"></script>
编辑:我对此进行了一些操作,以下是我的结果。
HTML
<iframe id="frame"></iframe>
JS
$("#frame").attr(
"src", "data:text/html;charset=utf-8," +
"<html>" +
"<style>.red {color: red}</style>" +
"<div class=\"test\">Test</test>" +
"<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js\">
这个可以工作,可以在这里看到 http://jsfiddle.net/WsCxj/。
所以有几点需要注意:
我将整个内容作为一个字符串传递。您必须在前面添加 data:text/html;charset=utf-8,
,然后将字符串设置为 iframe 的 src。
我使用绝对路径添加了 jquery.js 文件 - 这似乎很重要,可能是因为框架本身没有路径,因为它的内容是动态生成的。
我像这样分割了脚本结束标记 <" + "/script>
,因为至少 Firefox 尝试在此时结束实际脚本。更干净的方法可能是将 js 作为完全独立的文件。
function initFrame (code){
eval (code);
}
initFrame.apply ($('#iframe').contents(),[js_code]);
没有eval
var initFrame = new Function(js_code);
initFrame.apply ($('#iframe').contents(),[]);
new Function
本质上与 eval 相同。在另一个框架的上下文中运行函数可能会出现问题,并且很难进行调试,因为两个上下文中的全局对象是不同的... - Ruan Mendesnew Function
在幕后仍然执行 eval
。因此,避免在 new Function
中使用 eval
并没有任何好处。 eval
可能不允许使用返回语句,但它会返回最后一个表达式的值。 - Ruan Mendes这个对我有用,将以下代码粘贴到页面中,该页面位于iframe中,而不是父页面:
window.myFunction = function(args) {
alert("script from iframe");
}
现在添加以下代码来调用上述函数:
var iframe = document.getElementById("iframeId");
iframe.contentWindow.myFunction(args);
使用JS间隔函数设置ajax刷新,以获取存储在文件/会话等中的任何数据,如何?
这肯定不是最轻量级的模式,它涉及一点点PHP,但可以完成工作。
<script>...</script>
) 还是在单独的.js
文件中? - Jonathan Lonowskiframes[0].window.$ = frames[0].window.jQuery = window.$;
- Ivan Chernykh