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