【问题标题】:how can i load <script>'s into an iframe?如何将 <script> 加载到 iframe 中?
【发布时间】:2010-10-14 16:29:56
【问题描述】:

我的逻辑可以从父级添加到我的 iframe 中

这行得通:

$('#iframe').load(function() {
  $(this).contents().find('#target').append('this text has been inserted into the iframe by jquery');    
});

这不是

$('#iframe').load(function() {
  $(this).contents().find('body').append('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>');    
});

.lf

问题与插入的脚本标签没有正确转义有关。 一半的 javascript 在 html 中变得可见,就像第一个脚本标签突然结束一样。

【问题讨论】:

    标签: javascript jquery iframe


    【解决方案1】:

    也许错误在于您的字符串,切勿在 javascript 中创建带有文字 的字符串。

    $('#iframe').load(function() {
      $(this).contents().find('body').append('<scr' + 'ipt type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></scr' + 'ipt>');    
    });
    

    【讨论】:

    • 啊!我怎么能错过呢?!我什至在今天早些时候的另一个问题(不是关于 SO)中向其他人指出了这一点。希望我能 +2 这个。
    • "...永远不要使用..." 创建一个字符串,创建它(就像你所做的那样)很好。这就是问题所在。
    • 我几乎就在问题“问题与插入的脚本标签没有正确转义有关”哈哈,谢谢大家
    【解决方案2】:

    我有点惊讶,这不起作用 [编辑:一点也不惊讶,请参阅mtrovo's answer。]...但这就是我做,根据您在下面的评论,这大部分不是jQuery,但仍然很简短:

    var rawframe = document.getElementById('theframe');
    var framedoc = rawframe.contentDocument;
    if (!framedoc && rawframe.contentWindow) {
        framedoc = rawframe.contentWindow.document;
    }
    var script = doc.createElement('script');
    script.type = "text/javascript";
    script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js";
    framedoc.body.appendChild(script);
    

    题外话:我真的不会给 iframe(或其他任何东西)ID“iframe”。感觉就像是在自找麻烦(IE 存在命名空间问题,虽然我不知道它会混淆标签名称和 ID,但我不会完全震惊)。我使用了上面的“theframe”。

    【讨论】:

    • 感谢 TJ,这看起来不错,我刚刚遇到了需要将 jquery 加载到 iframe 中的问题,而无需使用 jquery。 (因为 jquery 尚未加载到 iframe 中进行加载)! - 用纯js做这个容易吗?
    • @Haroldo:是的。事实上,除了第一行之外,答案是纯 JavaScript。我已经修改了第一行,所以它是纯 JavaScript。但是您可以使用 jQuery 来进行加载,前提是 jQuery 加载在您的代码运行所在的窗口中(而不是 iframe 的窗口)。但我认为 mtrovo 已经指出了为什么您的原始代码不起作用,请参阅 his/her answer 了解更多信息。
    • "document.body.appendChild(script);"必须是“doc.body.appendChild(script);”对吧!?
    • @T.J.Crowder 啊! “frame.body.appendChild(脚本);”必须是“framedoc.body.appendChild(script);”正确的!?一定是错字。
    【解决方案3】:

    警告:以这种方式加载脚本会使脚本在主窗口上下文中运行 即:如果您使用 somescript.js 中的窗口,那将是 NOT iframe 的窗口!

    $('#iframe').load(function() {
        $(this).contents().find('body').append('<scr' + 'ipt type="text/javascript" src="somescript.js"></scr' + 'ipt>');    
    });
    

    为了能够使用 iframe 上下文注入脚本:

    function insertScript(doc, target, src, callback) {
        var s = doc.createElement("script");
        s.type = "text/javascript";
        if(callback) {
            if (s.readyState){  //IE
                s.onreadystatechange = function(){
                    if (s.readyState == "loaded" ||
                        s.readyState == "complete"){
                        s.onreadystatechange = null;
                        callback();
                    }
                };
            } else {  //Others
                s.onload = function(){
                    callback();
                };
            }
        }
        s.src = src;
        target.appendChild(s);        
    }
    
    var elFrame = document.getElementById('#iframe');
    $(elFrame).load(function(){
        var context = this.contentDocument;
        var frameHead = context.getElementsByTagName('head').item(0);
        insertScript(context, frameHead, '/js/somescript.js');
    }
    

    【讨论】:

    • 访问 iframe 的文档很有意义。你能多谈谈.load 函数在做什么吗?我在他们的文档中没有看到这种语法
    • .load(function() {}...) 是 iframe 完成加载时的完整回调:api.jquery.com/load
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多