4

我有以下代码在 iframe 中执行 JavaScript(在本例中为 frames[0],因为应用程序在任何给定时间仅包含 1 个 iframe):

如果js包含核心/纯 JavaScript,则以下工作:

var js = ""; // JavaScript code here
frames[0].window.eval(js);  

但如果 'js' 包含 jQuery,它就不起作用:

var js = ""; // JavaScript or jQuery code here
var preview = document.createElement('iframe_id');  
preview.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" ;
document.body.appendChild(preview); 
frames[0].window.eval(js);  

jQuery 中有没有 window.eval() 的替代方法?我知道 .globalEval() 在那里,但它似乎是为了不同的目的。

4

5 回答 5

1

在尝试评估使用 jQuery 语法的代码之前,您必须确保已加载 jQuery 脚本。看看这个线程https://stackoverflow.com/a/6725358/937367

function scriptTag(src, callback) {

    var s = document.createElement('script');
    s.type = 'text/' + (src.type || 'javascript');
    s.src = src.src || src;
    s.async = false;

    s.onreadystatechange = s.onload = function() {

        var state = s.readyState;

        if (!callback.done && (!state || /loaded|complete/.test(state))) {
            callback.done = true;
            callback();
        }
    };

    // use body if available. more safe in IE
    (document.body || head).appendChild(s);
}

在回调函数中评估您的代码,如下所示,一切都应该没问题。

var js = ""; // JavaScript or jQuery code here
scriptTag("http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js", function(){
    frames[0].window.eval(js); 
});

我在这里测试了它http://jsfiddle.net/SFUbg/2/。我不知道为什么在那个 scriptTag 函数doc中使用而不是文档,因为这不是等效的,所以我改变了它。

于 2013-09-04T06:13:52.770 回答
1

这是因为 jQuery 尚未加载,您可以附加一个onload或检查onreadystatechangediframe 以确定它何时加载。

于 2013-09-04T06:10:31.063 回答
1

原因可能是您的 iframe 不加载 jquery 库。尝试:

var js = ""; // JavaScript or jQuery code here
var preview = document.createElement('script');  
preview.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" ;
frames[0].window.document.body.appendChild(preview); 
frames[0].window.eval(js);  
  • document.createElement('script'); 代替document.createElement('iframe_id');
  • 执行此行为frames[0].window.document.body.appendChild(preview);您的 iframe 加载 jquery。
于 2013-09-04T06:15:13.517 回答
0

jQuery 不是一门独立的语言。您的代码不起作用的至少一个原因是 createElement 采用标签名称,而 'iframe_id' 不是。

此外,您将 iframe 的 src 直接设置为 jQuery。您应该将其设置为 HTML 页面,或 about:blank,然后以某种方式加载 jQuery。加载它的最简单方法是将 iframe URL 设置为具有显式加载 jQuery 的 HTML 页面。

编辑:如果 iframe 已经存在并已加载,并且您只想向其中添加 jQuery,那么 Jan.J 的答案应该会有所帮助。

于 2013-09-04T06:13:12.393 回答
0

这是我们在使用多个 iframe 的项目中非常成功地使用的代码,它适应了您看似在做的事情:

function setContent(source) {
  var iframe = document.createElement("iframe");
  iframe.style.opacity = 0.0;   
  document.body.appendChild(iframe);

      // set new content
  doc = iframe.contentDocument;
  doc.open();
  doc.write(sourceCode);
  doc.close();

  // kill off old iframe
  document.body.removeChild(document.querySelector("iframe"));
  iframe.style.opacity = 1.0;

  // inject the script you needed
  var scriptElement = doc.createElement("script");
  scriptElement.src = "...";
  doc.querySelector("head").appendChild(scriptElement);
}

并有一个http://jsbin.com/iFoZAdU/8/edit用于工作代码。

现在请不要再发布五个相同的问题。

于 2013-09-12T00:36:50.943 回答