ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript は、iframe の自動高さ調整と、異なるメイン ドメイン名間のクロスドメイン クロスドメインを実装します_JavaScript スキル

JavaScript は、iframe の自動高さ調整と、異なるメイン ドメイン名間のクロスドメイン クロスドメインを実装します_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 15:13:121340ブラウズ

Js には同一オリジン ポリシーがあることは誰もが知っています。これは、異なるメイン ドメイン名にネストされた iframe では Js の通信が許可されないことを意味します。

たとえば、Web サイトを持っており、その Web サイトのページを Web サイトに埋め込みたいと考えています。次に、iframe を使用してサードパーティの Web サイトのアドレスを参照できます。

ただし、問題は、iframe の高さが固定されており、サードパーティの Web サイトとうまく統合できないことです。たとえば、サードパーティの Web サイトでは、ローリング中に高さを自動的に計算するためにウォーターフォール フロー プラグインが使用されます。 iframe が Web サイト A.com B.com A に配置され、B.com を参照する場合、最初にクロスドメインについて話しましょう。iframe main ドメイン名にはさまざまなクロスドメイン メソッドがあります。この場合、B の J は B.com になります。 .com は A.com にアクセスできません。クロスドメイン JS は同じオリジン、つまり同じメイン ドメイン名を持つ必要があります。ではどうすればよいでしょうか。

B.com に iframe を導入できます。この iframe は A.com に Web ページをロードします。ここでは C と呼びます。このようにして、同じソースが存在する場合、B.com の iframe 内の Web ページは A.com と通信できます。次に、B と C が通信している限り、C と A が通信して B->A 通信が完了するようにします。これにより、B の高さが変更された場合は C に通知され、C は A に iframe の高さを調整するように通知されます。
B と C の間の通信は、実際には URL アドレスを通じて実現できます。B.com iframe は非表示に設定されており、C は src アドレスが変更されるとそれを受信できます。

くだらない話はやめて、コードに取り組みましょう

A.com/index.html

<html>
  <script src="{$smarty.const.STATIC_URL}/js/jquery-1.7.1.min.js"></script>
  <script>
   var test = function() {
     $('#h1').html('test');
   }
   </script>
<body>
<h1 id="h1">nba.alltosun.net</h1>
<iframe id="ifm" width="760" height="100" src="http://***.sinaapp.com/"></iframe>
</body>
</html>


B.com/index.html

<html>
<head></head>
<body>
  <h1>**.appsina.com</h1>
  <button id="button">设置高度</button>
  <div id="div" style="height:200px;display:none;"></div>
  <script src="http://nba.alltosun.net/js/jquery-1.7.1.min.js"></script>
  <script>
  $(function(){
    window.ifrH = function(e){
      var searchUrl = window.location.search;
      var b = null;
       
      var getParam = function(url, param) {
        var q = url.match(new RegExp( param + "=[^&]*")),
        n = "";
        if (q && q.length) {
          n = q[0].replace(param + "=", "");
        }
        return n;
      }
       
      var f = getParam(searchUrl,"url"),
        h = getParam(searchUrl, "ifmID"),
        k = getParam(searchUrl, "cbn"),
        g = getParam(searchUrl, "mh");
       
 
      var iframeId = 'testiframe';
      var iframe = document.getElementById(iframeId);
      var divId = 'alltosun';
       
      if (!iframe){
        var iframe = document.createElement('iframe');
        iframe.id = iframeId;
        iframe.style.display = "none";
        iframe.width = 0;
        iframe.height = 0;
        document.body.appendChild(iframe);
      }
       
      if (e && e.type == "onload" && h) {
        b.parentNode.removeChild(b);
        b = null;
      }
       
      if (!b) {
        b = document.createElement("div");
        b.id = divId;
        b.style.cssText = "clear:both;"
        document.body.appendChild(b);
      }
       
      var l = b.offsetTop + b.offsetHeight;
      iframe.src = (decodeURIComponent(f) || 
          "http://*****/test2") + "&h=" + l + "&ifmID=" + (h || "ifm") + "&cbn=test" + "&mh=" + g + "&t=" + ( (+ new Date()));
       
      if (e && e.type =="onload") {
        window.onload = null;
      }
    }
     
    window.onload = function() {
      ifrH({type: "onload"});
    }
     
    // ifrH();
    $('button').click(function(){
      $('div').show();
      ifrH();
    })
  })
  </script>
</body>
</html>


C プロキシ ファイル

<script>
var search = window.location.search,
getSearchParam = function (search, key) {
  var mc = search.match (new RegExp ( key + "=([^\&]*)") ),
    ret="";
  mc && mc.length && (ret = mc[0].replace( key + "=",""));
  return ret;
},
// 参数h 
h = getSearchParam(search,"h"),
ifmID = getSearchParam(search,"ifmID"),
cbn = getSearchParam(search,"cbn"),
// 宽高
mh = getSearchParam(search,"mh") || h,
isFunction = function(fn){
  return !!fn && !fn.nodeName && fn.constructor != String 
      && fn.constructor != RegExp && fn.constructor != Array 
      && (/function/i).test(fn + "");
};
 
try{
  if(parent && parent.parent){
    ifm = parent.parent.document.getElementById(ifmID);
    ifm && mh && (ifm.height=mh);
    fn=parent.parent[cbn];
    isFunction(fn) && fn.call();
    ifm=null;
  }
}catch(ex){
  console.log(ex);
}
 
</script>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。