使用 Javascript 或 jQuery 将元素写入子 iframe

Posted

技术标签:

【中文标题】使用 Javascript 或 jQuery 将元素写入子 iframe【英文标题】:Write elements into a child iframe using Javascript or jQuery 【发布时间】:2010-11-03 03:15:36 【问题描述】:

我有这样的事情:

<!doctype html>
<html>
  <body>
     <iframe id="someFrame"></iframe>
  </body>
</html>

我想使用 jQuery 来编写元素,使得完整的等效 HTML 如下所示:

<!doctype html>
<html>
  <body>
    <iframe id="someFrame">
      <!-- inside the iframe's content -->
      <!-- <html><body>  -->
      <div>A</div>
      <div>B</div>
      <div>C</div>
      <!-- </body></html> -->
    </iframe>
  </body>
</html>

或者,任何普通的旧javascript都可以。

谢谢。

编辑:经过更多研究,我似乎正在寻找与 iframe 的 contentDocument 属性等效的 IE。 “contentDocument”是 FF 支持的 W3C 标准,但 IE 不支持。 (惊喜惊喜)

【问题讨论】:

【参考方案1】:

两者都可以,只是目标不同:

var ifrm = document.getElementById('myIframe');
ifrm = ifrm.contentWindow || ifrm.contentDocument.document || ifrm.contentDocument;
ifrm.document.open();
ifrm.document.write('Hello World!');
ifrm.document.close();

【讨论】:

啊哈-contentWindow。我实际上发现打开和关闭是开始使用 jquery 所必需的...... 此方法不再有效。我收到 js 错误,显示不安全的 JavaScript 尝试从具有 URL“URL2”的框架访问具有 URL“URL1”的框架。域、协议和端口必须匹配。下面给出的桥梁方法确实可以正常工作。 我知道这是一个旧线程,但在什么情况下你会有ifrm.contentDocument.document.document 为什么不能直接写入 iframe 的主体,只能使用这个 hack? 没有 close() 语句,后面的所有 JS 都不会执行,因此使用 try finally 块是有意义的。谢谢。这个答案帮助我弄清楚我的页面出了什么问题【参考方案2】:

经过一些研究,以及 Mike 的肯定回答,我发现这是一个解决方案:

  var d = $("#someFrame")[0].contentWindow.document; // contentWindow works in IE7 and FF
  d.open(); d.close(); // must open and close document object to start using it!

  // now start doing normal jQuery:
  $("body", d).append("<div>A</div><div>B</div><div>C</div>");

【讨论】:

有趣。你知道为什么要打开和关闭吗? 这太棒了!谢谢杰夫! 这是解决我在使用 codemirrors editor.getValue()时遇到的问题的完美解决方案!【参考方案3】:

有两种可靠的方法可以访问iframe 中的document 元素:

1. window.frames 属性:

var iframeDocument = window.frames['iframeName'].document; // or // var iframeDocument = window.frames[iframeIndex].document;

Demo

2. contentDocument 属性:

var iframeDocument = document.getElementById('iframeID').contentDocument; // or // var iframeDocument = document.getElementById('iframeID').contentWindow.document;

Demo

【讨论】:

完美,JSFiddle 非常有帮助。谢谢!【参考方案4】:

我在这里不顾一切,建议到目前为止提出的答案是不可能的。

如果这个 iframe 实际上有一个 src="somepage.html" (你应该指出,如果没有,使用 iframe 有什么意义?),那么我认为 Jquery 不能直接跨帧操作 html在所有浏览器中。根据我对这类事情的经验,包含页面不能直接从 iframe 页面调用函数或与 iframe 页面进行任何类型的 Javascript 联系。

您的“somepage.html”(在 iframe 中加载的页面)需要做两件事:

    将某种对象传递给可用作桥梁的包含页面 具有根据需要设置 HTML 的功能

例如,somepage.html 可能如下所示:

<!doctype html>
<html>
<head>
<script src="jquery.js">
</script>
<script language=JavaScript>
<!--//
    var bridge=
        setHtml:function(htm) 
            document.body.innerHTML=htm;
        
    

    $(function()  parent.setBridge(bridge); );

//--></script>
</head>
<body></body>
</html>

包含页面可能如下所示:

<!doctype html>
<html>
<head>
<script src="jquery.js">
</script>
<script language=JavaScript>
<!--//
var bridge;
var setBridge=function(br) 
    bridge=br;
    bridge.setHtml("<div>A</div><div>B</div><div>C</div>");
    
//-->
</script>
</head>
<body><iframe src="somepage.html"></iframe></body>
</html>

这可能看起来有点令人费解,但它可以在多个方向上进行调整,并且至少可以在 IE、FF、Chrome 以及可能的 Safari 和 Opera 中运行...

【讨论】:

感谢您的回答 - 但我想使用这个 iframe 来像富文本编辑器一样编写 HTML。我没有设置 src 属性,因为它将被清除并从“顶部”窗口重新组合。另外 - 我认为必须有可能接触到孩子的 DOM - 请参阅我在 OP 中的编辑。 有什么理由需要使用 iframe 而不是 div?似乎 div 会更容易并且不太可能跨越浏览器。 原来是有原因的。您需要放置外部 javascript,并且不希望它损坏您的页面。但是您还需要引用者来匹配您的***域。这是在页面上放置广告的最常用方法: + document.write('【参考方案5】:

我发现这是跨浏览器兼容的......以前的答案有点交叉和我自己的一些试验和错误。 :)

我正在使用它来下载报告,或者,如果发生错误(消息),它会显示在 iFrame 中。大多数用户可能会隐藏 iFrame,我正在使用它的多功能性。

问题是我每次单击报告下载按钮时都必须清除 iFrame 的内容 - 用户可以更改参数,但碰巧没有结果,然后在 iFrame 中显示为一条消息。如果有 个结果,iFrame 将保持为空 - 因为下面的代码已将其清除并且window.open(...) 方法会生成一个Content-Disposition: attachment;filename=... 文档。

var $frm = $("#reportIFrame");
var $doc = $frm[0].contentWindow ? $frm[0].contentWindow.document : $frm[0].contentDocument;
var $body = $($doc.body);
$body.html(''); // clear iFrame contents <- I'm using this...
$body.append('<i>Writing into the iFrame...</i>'); // use this to write something into the iFrame
window.open(Module.PATH + 'php/getReport.php' + Report.queryData, 'reportIFrame');

我没有支持contentDocument 的浏览器,但我已经以这种方式对其进行了编码,所以我将离开它。也许有人使用较旧的浏览器并且可以发布兼容性确认/问题?

【讨论】:

以上是关于使用 Javascript 或 jQuery 将元素写入子 iframe的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 javascript 或 Jquery 使用文件系统或操作?

防止用户使用 jquery 或 javascript 重新加载页面 [重复]

使用 Jquery 或 Javascript 保存数据

如何使用 JavaScript 或 jquery 选中/取消选中复选框?

使用 JavaScript 或 jQuery 拆分文件

使用 javascript 或 jQuery 生成 CSS 媒体查询