有没有办法在JavaScript中执行类似于window.eval()的jQuery?

时间:2013-09-04 06:05:06

标签: javascript jquery html

我有以下代码在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()就在那里,但似乎是出于不同的目的。

5 个答案:

答案 0 :(得分:1)

这是因为jQuery尚未加载,您可以在iframe上附加onload或检查onreadystatechanged以确定何时加载。

答案 1 :(得分:1)

在尝试使用jQuery语法的eval代码之前,必须确保已加载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被用来代替文档,因为这不是等价的,所以我改了它。

答案 2 :(得分: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。

答案 3 :(得分:0)

jQuery不是一种单独的语言。您的代码无法工作的至少一个原因是createElement采用标记名称,而'iframe_id'则不是。

另外,您将iframe的src直接设置为jQuery。你应该将它设置为HTML页面,或关于:空白,然后以某种方式加载jQuery。加载它的最简单方法是将iframe URL设置为带有显式加载jQuery的HTML页面。

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

答案 4 :(得分: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

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