如何在iframe的本地范围内执行注入的javascript代码?

时间:2013-05-07 13:52:26

标签: javascript jquery iframe

我在iframe中加载了一个html文档 我已经在javascript中为该文档开发了一些弹出菜单代码,我将代码从主文档注入iframe。

但是我的代码在iframe中不起作用,因为它使用了“document”对象,并且令人惊讶地引用了主文档而不是iframe文档。

我也在玩内容选择,我需要window.getSelection()回到主要文档的选择,而我需要window.frames[0].getSelection()

我做错了吗? 有没有简单的解决方案来解决这个问题?

更新(澄清)
正如Bergi指出的那样,我的问题是如何运行正确注入的javascript代码来获取iframe中的局部范围而不是全局范围?
所以我必须在代码中重写documentwindow ...

更新 (我的HTML的骨架)

<html>
  <head></head> <!-- script launches on jquery's $(document).ready -->
  <body>
    <iframe>
    [
      <body>
        ...
        <script></script> <!-- code injected here from the code (appended to the body) -->
      </body>
    ]
    </iframe>
  </body>
</html>

脚本是这样的(使用jquery):

$(function(){
$('iframe').load(function(){

var $doc = $('iframe').contents();
var $head = $('head', $doc);
$head.append('<link rel="stylesheet" href="/stylesheets/book-popup-menu.css" />');

var $body = $('body', $doc);
$body.append(' \
    <div id="popup"> \
    </div> \
');
$body.append(' \
    <script type="text/javascript"> \
              console.log(document.body);// it still displays the global body \
            </script> \
');
});
});

更新A fiddle demonstrating the issue

1 个答案:

答案 0 :(得分:2)

最后,我找到了答案!

如果使用jQuery(如$body.append('<script>'))附加代码,那么''元素将由document.createElement('script')创建,因此将成为全局文档的一部分。即使将其插入iframe文档后,也会在全局命名空间中执行

所以解决方案是 - 利用这个神话般的解决方案:( Injecting Javascript to Iframe) - 回归到香草javascript:

$('iframe').load(function(){

    var $doc = $('iframe').contents();
    var $head = $('head', $doc);
    $head.append('<link rel="stylesheet" href="/stylesheets/book-popup-menu.css" />');

    var $body = $('body', $doc);
    $body.append('<div id="popup"></div>');// non-javascript content works fine

    var doc = $('iframe').contents()[0]; // doc = $doc[0] does not work for some reason... 

    var script = doc.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.textContent = "console.log(document.body)"; // this will be iframe's body
    $body[0].appendChild(script1); // $body.append(...) does not work
});