jQuery/JavaScript:访问 iframe 的内容

IT技术 javascript jquery iframe same-origin-policy
2020-12-26 15:45:00

我想使用 jQuery 操作 iframe 中的 HTML。

我想我可以通过将 jQuery 函数的上下文设置为 iframe 的文档来做到这一点,例如:

$(function(){ //document ready
    $('some selector', frames['nameOfMyIframe'].document).doStuff()
});

但是,这似乎不起作用。一些检查表明,除非我等待 iframe 加载一段时间,否则变量是frames['nameOfMyIframe']存在的undefined但是,当 iframe 加载时,变量不可访问(我收到permission denied-type 错误)。

有谁知道解决这个问题的方法?

6个回答

如果<iframe>来自同一个域,则元素很容易访问

$("#iFrame").contents().find("#someDiv").removeClass("hidden");

参考

了解同源策略很棒,但这是 OP 想要的答案。为什么另一个答案被选为正确的答案?
2021-02-19 15:45:00

我认为你正在做的事情受到同源政策的约束这应该是您收到权限被拒绝类型错误的原因。

@Tracker1:您能否建议用于实现此代理解决方案的任何框架/api/设计模式。任何指向示例或教程等的链接?我试图搜索,但找不到任何。
2021-02-22 15:45:00

你可以使用.contents()jQuery的方法。

.contents()如果 iframe 与主页在同一域中,则方法还可用于获取 iframe 的内容文档。

$(document).ready(function(){
    $('#frameID').load(function(){
        $('#frameID').contents().find('body').html('Hey, i`ve changed content of <body>! Yay!!!');
    });
});

如果 iframe src 来自另一个域,您仍然可以这样做。您需要将外部页面读入 PHP 并从您的域中回显它。像这样:

iframe_page.php

<?php
    $URL = "http://external.com";

    $domain = file_get_contents($URL);

    echo $domain;
?>

然后是这样的:

display_page.html

<html>
<head>
  <title>Test</title>
 </head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>

<script>

$(document).ready(function(){   
    cleanit = setInterval ( "cleaning()", 500 );
});

function cleaning(){
    if($('#frametest').contents().find('.selector').html() == "somthing"){
        clearInterval(cleanit);
        $('#selector').contents().find('.Link').html('ideate tech');
    }
}

</script>

<body>
<iframe name="frametest" id="frametest" src="http://yourdomain.com/iframe_page.php" ></iframe>
</body>
</html>

以上是如何通过 iframe 编辑外部页面而不拒绝访问等的示例...

@geon 标记的意思是浏览器不会将任何用于外部域的 cookie 发送到您的域(例如,它不会从bank.comto发送 cookie mydomain.com),因此用户将看到该页面,因为它没有cookie(即注销)
2021-02-08 15:45:00
@Mark:据浏览器所知,不涉及外域。浏览器将与您的服务器通信(包括 cookie、发布的数据和标题),后者将依次与外部域通信。(除非它使用通过图像设置/读取 cookie 等技巧,这可以通过解析 HTML 并通过 PHP 路由它们来修复。)
2021-02-11 15:45:00
@geon:但浏览器不会将外部域的 cookie 发送到您的 PHP 脚本
2021-02-14 15:45:00
@Mark:如果您使用 curl 扩展来实现它,您可以轻松发送 cookie、发布的数据、HTTP 标头等等。php.net/manual/en/book.curl.php
2021-02-18 15:45:00
当然,因为您的服务器获取的是远程页面而不是用户的浏览器,所以不会将 cookie 发送到远程页面。天啊。
2021-02-21 15:45:00

iframe.contentWindow.document

代替

iframe.contentDocument
很好的答案。这适用于其他域中的 iFrame。我在 Safari 和 Firefox 的控制台中尝试了这个。
2021-02-11 15:45:00
我相信如果您从控制台进行操作,它只会对其他域有效。从脚本中,将不允许访问。
2021-02-11 15:45:00
对我来说 iframe.contentWindow.document 并不总是有效。当它没有时,我发现 $(elem).contents().get(0) 确实
2021-02-18 15:45:00
您可以在浏览器控制台中选择“根文档”。当您选择“顶部”时,它将无法作为跨域访问。如果你选择代表 iframe 访问文档,它当然会给你访问权限。仅仅因为您不是浏览器,而是浏览器所有者。
2021-02-21 15:45:00
这应该是公认的答案。当 iframe 来自不同的域时,挽救了我的生命和工作;尽管如前所述,仅在控制台中。
2021-03-03 15:45:00