代码之家  ›  专栏  ›  技术社区  ›  rz.

jQuery/JavaScript:访问iframe的内容

  •  742
  • rz.  · 技术社区  · 16 年前

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

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

    然而,这似乎不起作用。通过一点检查,我发现 frames['nameOfMyIframe'] undefined permission denied -类型错误)。

    有人知道有什么办法可以解决这个问题吗?

    14 回复  |  直到 8 年前
        1
  •  1011
  •   RevanthKrishnaKumar V. Glen Best    9 年前

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

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

    Reference

        2
  •  398
  •   Onur Bebin    16 年前

    我认为你所做的事受法律约束 same origin policy . 这应该是你得到的原因 权限拒绝类型 错误。

        3
  •  96
  •   Narendra Jadhav    5 年前

    .contents() jQuery的方法。

    .contents()

    $(document).ready(function(){
        $('#frameID').load(function(){
            $('#frameID').contents().find('body').html('Hey, i`ve changed content of <body>! Yay!!!');
        });
    });
    
        4
  •  46
  •   brasofilo Gary    5 年前

    如果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>
    

        5
  •  33
  •   RevanthKrishnaKumar V. Glen Best    9 年前

    使用

    iframe.contentWindow.document
    

    iframe.contentDocument
    
        6
  •  33
  •   zupa    8 年前

    我觉得这样更干净:

    var $iframe = $("#iframeID").contents();
    $iframe.find('selector');
    
        7
  •  27
  •   Andreas Grech    16 年前

    您需要将事件附加到iframe的onload处理程序,并在其中执行js,以便确保iframe在访问它之前已完成加载。

    $().ready(function () {
        $("#iframeID").ready(function () { //The function below executes once the iframe has finished loading
            $('some selector', frames['nameOfMyIframe'].document).doStuff();
        });
    };
    

    上述操作将解决“尚未加载”问题,但关于权限,如果您正在iframe中加载来自不同域的页面,则由于安全限制,您将无法访问该页面。

        8
  •  21
  •   Sevle Jean Louw    9 年前

    您可以使用window.postMessage在页面和他的iframe之间调用函数(跨域或非跨域)。

    Documentation

    page.html

    <!DOCTYPE html>
    <html>
    <head>
        <title>Page with an iframe</title>
        <meta charset="UTF-8" />
        <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
        <script>
        var Page = {
            id:'page',
            variable:'This is the page.'
        };
    
        $(window).on('message', function(e) {
            var event = e.originalEvent;
            if(window.console) {
                console.log(event);
            }
            alert(event.origin + '\n' + event.data);
        });
        function iframeReady(iframe) {
            if(iframe.contentWindow.postMessage) {
                iframe.contentWindow.postMessage('Hello ' + Page.id, '*');
            }
        }
        </script>
    </head>
    <body>
        <h1>Page with an iframe</h1>
        <iframe src="iframe.html" onload="iframeReady(this);"></iframe>
    </body>
    </html>
    

    iframe.html

    <!DOCTYPE html>
    <html>
    <head>
        <title>iframe</title>
        <meta charset="UTF-8" />
        <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
        <script>
        var Page = {
            id:'iframe',
            variable:'The iframe.'
        };
    
        $(window).on('message', function(e) {
            var event = e.originalEvent;
            if(window.console) {
                console.log(event);
            }
            alert(event.origin + '\n' + event.data);
        });
        $(window).on('load', function() {
            if(window.parent.postMessage) {
                window.parent.postMessage('Hello ' + Page.id, '*');
            }
        });
        </script>
    </head>
    <body>
        <h1>iframe</h1>
        <p>It's the iframe.</p>
    </body>
    </html>
    
        9
  •  4
  •   Evgeny Karpov    11 年前

    从父级可以访问子iframe中的变量。 $ 也是一个变量,您可以接收对其just调用的访问 window.iframe_id.$

    例如 window.view.$('div').hide() -隐藏id为“视图”的iframe中的所有div

    但是,它在FF中不起作用。为了更好的兼容性,您应该使用

    $('#iframe_id')[0].contentWindow.$

        10
  •  2
  •   Khb    16 年前

    您是否尝试过使用jQuery的内置就绪函数等待加载完成的经典方法?

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

        11
  •  2
  •   Zisu    9 年前

    我创建了一个示例代码。现在,您可以从无法访问的不同域轻松理解 iframe的内容。。我们可以访问iframe内容的同一个域

    我与您共享我的代码,请运行此代码 检查控制台。我在控制台上打印图像src。有四个iframe,两个iframe来自同一个域&其他两个来自其他域(第三方)。您可以看到两个图像src( https://www.google.com/logos/doodles/2015/googles-new-logo-5078286822539264.3-hp2x.gif

    https://www.google.com/logos/doodles/2015/arbor-day-2015-brazil-5154560611975168-hp2x.gif ) 在控制台上,还可以看到两个权限错误( 2. 错误:访问属性“文档”的权限被拒绝

    …irstChild)},内容:函数(a){返回m.nodeName(a,“iframe”)?a.contentDocument。。。

    )来自第三方iframe。

    <body id="page-top" data-spy="scroll" data-target=".navbar-fixed-top">
    <p>iframe from same domain</p>
      <iframe frameborder="0" scrolling="no" width="500" height="500"
       src="iframe.html" name="imgbox" class="iView">
    
    </iframe>
    <p>iframe from same domain</p>
    <iframe frameborder="0" scrolling="no" width="500" height="500"
       src="iframe2.html" name="imgbox" class="iView1">
    
    </iframe>
    <p>iframe from different  domain</p>
     <iframe frameborder="0" scrolling="no" width="500" height="500"
       src="https://www.google.com/logos/doodles/2015/googles-new-logo-5078286822539264.3-hp2x.gif" name="imgbox" class="iView2">
    
    </iframe>
    
    <p>iframe from different  domain</p>
     <iframe frameborder="0" scrolling="no" width="500" height="500"
       src="http://d1rmo5dfr7fx8e.cloudfront.net/" name="imgbox" class="iView3">
    
    </iframe>
    
    <script type='text/javascript'>
    
    
    $(document).ready(function(){
        setTimeout(function(){
    
    
            var src = $('.iView').contents().find(".shrinkToFit").attr('src');
        console.log(src);
             }, 2000);
    
    
        setTimeout(function(){
    
    
            var src = $('.iView1').contents().find(".shrinkToFit").attr('src');
        console.log(src);
             }, 3000);
    
    
        setTimeout(function(){
    
    
            var src = $('.iView2').contents().find(".shrinkToFit").attr('src');
        console.log(src);
             }, 3000);
    
             setTimeout(function(){
    
    
            var src = $('.iView3').contents().find("img").attr('src');
        console.log(src);
             }, 3000);
    
    
        })
    
    
    </script>
    </body>
    
        12
  •  1
  •   Dominique Fortin    6 年前

    要获得更高的健壮性,请执行以下操作:

    function getIframeWindow(iframe_object) {
      var doc;
    
      if (iframe_object.contentWindow) {
        return iframe_object.contentWindow;
      }
    
      if (iframe_object.window) {
        return iframe_object.window;
      } 
    
      if (!doc && iframe_object.contentDocument) {
        doc = iframe_object.contentDocument;
      } 
    
      if (!doc && iframe_object.document) {
        doc = iframe_object.document;
      }
    
      if (doc && doc.defaultView) {
       return doc.defaultView;
      }
    
      if (doc && doc.parentWindow) {
        return doc.parentWindow;
      }
    
      return undefined;
    }
    

    ...
    var frame_win = getIframeWindow( frames['nameOfMyIframe'] );
    
    if (frame_win) {
      $(frame_win.contentDocument || frame_win.document).find('some selector').doStuff();
      ...
    }
    ...
    
        13
  •  1
  •   Jeff Davis    6 年前

    我在这里寻找的是在没有jquery的情况下获取iframe的内容,因此对于其他任何人来说,这只是:

    document.querySelector('iframe[name=iframename]').contentDocument
    
        14
  •  1
  •   Ahsan Horani    6 年前

    此解决方案的工作原理与iFrame相同。我创建了一个PHP脚本,可以从其他网站获取所有内容,最重要的是,您可以轻松地将自定义jQuery应用于该外部内容。请参考下面的脚本,它可以从其他网站获取所有内容,然后您也可以应用cusom jQuery/JS。此内容可以在任何位置、任何元素或任何页面内使用。

    <div id='myframe'>
    
      <?php 
       /* 
        Use below function to display final HTML inside this div
       */
    
       //Display Frame
       echo displayFrame(); 
      ?>
    
    </div>
    
    <?php
    
    /* 
      Function to display frame from another domain 
    */
    
    function displayFrame()
    {
      $webUrl = 'http://[external-web-domain.com]/';
    
      //Get HTML from the URL
      $content = file_get_contents($webUrl);
    
      //Add custom JS to returned HTML content
      $customJS = "
      <script>
    
          /* Here I am writing a sample jQuery to hide the navigation menu
             You can write your own jQuery for this content
          */
        //Hide Navigation bar
        jQuery(\".navbar.navbar-default\").hide();
    
      </script>";
    
      //Append Custom JS with HTML
      $html = $content . $customJS;
    
      //Return customized HTML
      return $html;
    }