有没有一种方法可以在JavaScript中执行类似于window.eval()的jQuery

Is there a way to execute jQuery similar to window.eval() in JavaScript?

本文关键字:类似于 执行 window eval JavaScript jQuery 一种 方法 有没有      更新时间:2023-09-26

我有以下代码来在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()是存在的,但它似乎有不同的用途。

这是因为jQuery还没有加载,您可以在iframe上附加一个onload或检查onreadystatechanged,以确定它何时加载。

原因可能是您的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

在尝试评估使用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而不是document,因为这不是等价的,所以我更改了它jQuery不是一种独立的语言。代码不起作用的至少一个原因是createElement采用了标记名,而"iframe_id"不是。

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

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

以下是我们在一个使用多个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用于工作代码。

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