JavaScript實(shí)現(xiàn)iframe自動(dòng)高度調(diào)整和不同主域名跨域
大家都知道Js有同源策略,就是主域名不同嵌套的iframe不允許Js通信的。
比如我有一個(gè)網(wǎng)站,網(wǎng)站中要嵌入其網(wǎng)站的頁(yè)面。那么我可以使用iframe引用第三方網(wǎng)站的地址即可。
但是問(wèn)題也來(lái)的iframe的高度是固定的不能與第三方網(wǎng)站很好的融合,又例如第三方網(wǎng)站使用了瀑布流插件,要滾動(dòng)加載自動(dòng)計(jì)算高度,那么先說(shuō)跨域:iframe主域名不同跨域方法,假如網(wǎng)站 A.com B.com A 里面放入一個(gè)iframe 引用了B.com,這種情況下B.com里面的Js是無(wú)法訪問(wèn)到A.com的。JS跨域必須是同源,就是同一個(gè)主域名,那腫么辦呢?
我們可以在B.com中在引入一個(gè)iframe,暫且叫C吧 這個(gè)iframe加載A.com中的一個(gè)網(wǎng)頁(yè)。這樣同源就有了B.com中的iframe中的網(wǎng)頁(yè)就可以和A.com通訊了。下面只要B和C通訊,讓C和A通訊就完成B->A通訊,這樣當(dāng)B高度變化時(shí)通知C,讓C通知A把iframe高度調(diào)整。
B和C通訊,其實(shí)通過(guò)url地址就可以實(shí)現(xiàn)通訊了,B.com iframe設(shè)置為隱藏,改變src地址時(shí)候C就可以接收。
廢話不說(shuō)了上代碼
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">設(shè)置高度</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; }, // 參數(shù)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>
- php main 與 iframe 相互通訊類(lèi)(js+php同域/跨域)
- javascript iframe跨域詳解
- JS未跨域操作iframe里的DOM
- AngularJS iframe跨域打開(kāi)內(nèi)容時(shí)報(bào)錯(cuò)誤的解決辦法
- js iframe跨域訪問(wèn)(同主域/非同主域)分別深入介紹
- js跨域問(wèn)題之跨域iframe自適應(yīng)大小實(shí)現(xiàn)代碼
- 跨域傳值即主頁(yè)面與iframe之間互相傳值
- IFrame跨域高度自適應(yīng)實(shí)現(xiàn)代碼
- 詳解iframe跨域的幾種常用方法(小結(jié))
- JS實(shí)現(xiàn)iframe中子父頁(yè)面跨域通訊的方法分析
相關(guān)文章
小程序?qū)崿F(xiàn)tab標(biāo)簽頁(yè)
這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)tab標(biāo)簽頁(yè),可點(diǎn)擊切換,滑動(dòng)切換頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Bootstrap 響應(yīng)式實(shí)用工具實(shí)例詳解
Bootstrap 提供了一些輔助類(lèi),以便更快地實(shí)現(xiàn)對(duì)移動(dòng)設(shè)備友好的開(kāi)發(fā)。這些可以通過(guò)媒體查詢結(jié)合大型、小型和中型設(shè)備,實(shí)現(xiàn)內(nèi)容對(duì)設(shè)備的顯示和隱藏。下面通過(guò)本文給大家分享Bootstrap 響應(yīng)式實(shí)用工具,一起看看吧2017-03-03JavaScript中的簡(jiǎn)寫(xiě)語(yǔ)法分享
這篇文章主要為大家整理了12個(gè)JavaScript中常用的簡(jiǎn)寫(xiě)語(yǔ)法技巧,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以收藏一下2023-04-04微信小程序定義和調(diào)用全局變量globalData的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序定義和調(diào)用全局變量globalData的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11JavaScript 利用StringBuffer類(lèi)提升+=拼接字符串效率
JavaScript 利用StringBuffer類(lèi)提升+=拼接字符串效率,需要的朋友可以參考下。2009-11-11微信小程序分享卡片花樣玩法之私密消息和動(dòng)態(tài)消息
用戶可以發(fā)送小程序卡片給微信好友或者群,點(diǎn)擊小程序卡片可以直接進(jìn)入小程序,這篇文章主要給大家介紹了關(guān)于微信小程序分享卡片花樣玩法之私密消息和動(dòng)態(tài)消息的相關(guān)資料,需要的朋友可以參考下2023-11-11基于HTML+JS實(shí)現(xiàn)簡(jiǎn)單的年齡計(jì)算器
JavaScript提供了一些內(nèi)置的日期和時(shí)間函數(shù),有助于從日期(出生日期)開(kāi)始計(jì)算年齡。本文主要介紹了使用這些JavaScript方法,制作一個(gè)簡(jiǎn)單的年齡計(jì)算器,快來(lái)跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12