web-dev-qa-db-ja.com

jQuery/JavaScript:iframeのコンテンツにアクセスする

私はjQueryを使用してiframe内のHTMLを操作したいと思います。

私は、jQuery関数のコンテキストをiframeのドキュメントに設定することでこれを実行できると思いました。

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

しかしこれはうまくいかないようです。ちょっと調べてみると、iframeがロードされるのをしばらく待たない限り、frames['nameOfMyIframe']内の変数がundefinedであることがわかります。しかし、iframeがロードされたときに変数にアクセスすることはできません(permission denied-typeエラーが発生します)。

誰もがこれに対する回避策を知っていますか?

753
rz.

私はあなたがしていることは 同じOriginポリシー の影響を受けると思います。これが パーミッションがtype errorsを拒否している理由です。

368
Onur Bebin

<iframe>が同じドメインのものである場合、要素は次のように簡単にアクセスできます。

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

参照

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

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を介して外部ページを編集する方法の例です。

41
basysmith

つかいます

iframe.contentWindow.document

の代わりに

iframe.contentDocument
30
user

私はこの方法がきれいだと思います:

var $iframe = $("#iframeID").contents();
$iframe.find('selector');
29
zupa

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でページをロードしているなら、あなたはセキュリティ制限のためにそれにアクセスすることができません。

26
Andreas Grech

Window.postMessageを使用して、ページと彼のiframeの間に関数を呼び出すことができます(クロスドメインかどうかにかかわらず)。

ドキュメンテーション

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>
19
B.Asselin

私はアクセスするために他の変種を使うのを好みます。親から、子のiframe内の変数にアクセスできます。 $も変数であり、window.iframe_id.$を呼び出すだけでアクセスできます。

例えば、window.view.$('div').hide() - idが 'view'のiframe内のすべてのdivを非表示にする

しかし、FFではうまくいきません。より良い互換性のためにあなたが使うべきです

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

4
Evgeny Karpov

サンプルコードを作成します。 iframeのコンテンツにアクセスできない、異なるドメインから簡単に理解できるようになりました。

私のコードを共有します。このコードを実行してコンソールを確認してください。コンソールでimage srcを印刷します。 4つのiframe、同じドメインからの2つのiframe、および他のドメインからの2つのiframe(サードパーティ)があります。2つの画像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つの許可エラーが表示されます(2エラー:許可が拒否されましたアクセスプロパティ 'document'

function(a){return 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>
2
Zisu

JQueryの組み込みのready関数を使ってロードが完了するのを待って、クラシックを試しましたか?

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

K

2
Khb

私はjqueryなしでiframeのコンテンツを取得することを探してここで終わりました。

document.querySelector('iframe[name=iframename]').contentDocument
1
Jeff Davis

さらに堅牢性のために:

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();
  ...
}
...
0

この解決策は、iFrameと同じように機能します。他のWebサイトからすべてのコンテンツを取得できるPHPスクリプトを作成しました。最も重要なのは、カスタムjQueryをその外部コンテンツに簡単に適用できることです。他のWebサイトからすべてのコンテンツを取得できる次のスクリプトを参照してください。そうすれば、カスタム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;
}
0
Ahsan Horani