亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

利用JS對iframe父子(內外)頁面進行操作的方法教程

2019-11-19 16:20:01
字體:
來源:轉載
供稿:網友

本文主要給大家介紹了關于利用JS對iframe父子(內外)頁面進行操作的方法,分享出來供大家參考學習,下面來一起看看詳細的介紹:

一、獲取iframe里的內容

在開始之前,首先我們來看看如何獲取iframe里的內容,獲取iframe中內容主要的兩個API就是contentWindow,和contentDocument iframe.contentWindow, 獲取iframe的window對象 iframe.contentDocument, 獲取iframe的document對象 這兩個API只是DOM節點提供的方式(即getELement系列對象)

 var iframe = document.getElementById("iframe1"); var iwindow = iframe.contentWindow; var idoc = iwindow.document;  console.log("window",iwindow);//獲取iframe的window對象  console.log("document",idoc); //獲取iframe的document  console.log("html",idoc.documentElement);//獲取iframe的html  console.log("head",idoc.head); //獲取head  console.log("body",idoc.body); //獲取body

實際情況如:

另外更簡單的方式是,結合Name屬性,通過window提供的frames獲取.

<iframe src ="/index.html" id="ifr1" name="ifr1" scrolling="yes"> <p>Your browser does not support iframes.</p></iframe><script type="text/javascript"> console.log(window.frames['ifr1'].window);console.dir(document.getElementById("ifr1").contentWindow);</script>

其實window.frames[‘ifr1']返回的就是window對象,即

window.frames['ifr1']===window

這里就看你想用哪一種方式獲取window對象,兩者都行,不過本人更傾向于第二種使用frames[xxx].因為,字母少啊喂~ 然后,你就可以操控iframe里面的DOM內容。

二、在iframe中獲取父級內容

同理,在同域下,父頁面可以獲取子iframe的內容,那么子iframe同樣也能操作父頁面內容。在iframe中,可以通過在window上掛載的幾個API進行獲取.

  • window.parent 獲取上一級的window對象,如果還是iframe則是該iframe的window對象
  • window.top 獲取最頂級容器的window對象,即,就是你打開頁面的文檔
  • window.self 返回自身window的引用??梢岳斫?window===window.self(腦殘)

如圖:

獲取了之后,我們就可以進行相關操作了。 在同域的iframe中,我們可以巧妙的使用iframe的黑科技來實現一些trick.

iframe的輪詢

話說在很久很久以前,我們實現異步發送請求是使用iframe實現的~! 怎么可能!!! 真的史料為證(自行google), 那時候為了不跳轉頁面,提交表單時是使用iframe提交的?,F在,前端發展尼瑪真快,websocket,SSE,ajax等,逆天skill的出現,顛覆了iframe, 現在基本上只能活在IE8,9的瀏覽器內了。 但是,寶寶以為這樣就可以不用了解iframe了,而現實就是這么殘酷,我們目前還需要兼容IE8+。所以,iframe 實現長輪詢和長連接的trick 我們還是需要涉獵滴。

iframe長輪詢

如果寫過ajax的童鞋,應該知道,長輪詢就是在ajax的readyState = 4的時,再次執行原函數即可。 這里使用iframe也是一樣,異步創建iframe,然后reload, 和后臺協商好, 看后臺哥哥們將返回的信息放在,然后獲取里面信息即可. 這里是直接放在body里.

var iframeCon = docuemnt.querySelector('#container'), text; //傳遞的信息 var iframe = document.createElement('iframe'), iframe.id = "frame", iframe.style = "display:none;", iframe.name="polling", iframe.src="target.html"; iframeCon.appendChild(iframe); iframe.onload= function(){ var iloc = iframe.contentWindow.location, idoc = iframe.contentDocument; setTimeout(function(){ text = idoc.getElementsByTagName('body')[0].textContent; console.log(text); iloca.reload(); //刷新頁面,再次獲取信息,并且會觸發onload函數 },2000); }

這樣就可以實現ajax的長輪詢的效果。 當然,這里只是使用reload進行獲取,你也可以添加iframe和刪除iframe的方式,進行發送信息,這些都是根據具體場景應用的。另外在iframe中還可以實現異步加載js文件,不過,iframe和主頁是共享連接池的,所以還是很蛋疼的,現在基本上都被XHR和hard calllback取締了,這里也不過多介紹了。

1.js在iframe子頁面操作父頁面元素代碼:

window.parent.document.getElementByIdx_x("父頁面元素id");

2.js在父頁面獲取iframe子頁面元素代碼如下:

window.frames["iframe_ID"].document.getElementByIdx_x("子頁面元素id");

3. jquery在iframe子頁面獲取父頁面元素代碼如下:

$("#objid",parent.document)

4. jquery在父頁面獲取iframe子頁面的元素

$("#objid",document.frames('iframename').document)

5.在iframe中調用父頁面中定義的方法和變量:

window.parent.window.parentMethod();window.parent.window.parentValue;

6.在父頁面操作iframe子頁面的方法和變量

window.frames["iframe_ID"].window.childMethod();window.frames["iframe_ID"].window.childValue;

一、同域下父子頁面的通信

父頁面parent.html

<html><head> <script type="text/javascript">  function say(){   alert("parent.html");  }  function callChild(){   myFrame.window.say();   myFrame.window.document.getElementById("button").value="調用結束";  } </script></head><body> <input id="button" type="button" value="調用child.html中的函數say()" onclick="callChild()"/> <iframe name="myFrame" src="http://caibaojian.com/child.html"></iframe></body></html>

子頁面child.html

<html><head> <script type="text/javascript">  function say(){   alert("child.html");  }  function callParent(){   parent.say();   parent.window.document.getElementById("button").value="調用結束";  } </script></head><body> <input id="button" type="button" value="調用parent.html中的say()函數" onclick="callParent()"/></body></html>

注意事項

要確保在iframe加載完成后再進行操作,如果iframe還未加載完成就開始調用里面的方法或變量,會產生錯誤。判斷iframe是否加載完成有兩種方法:

      1. iframe上用onload事件

      2. 用document.readyState=="complete"來判斷

二、跨域父子頁面通信方法

如果iframe所鏈接的是外部頁面,因為安全機制就不能使用同域名下的通信方式了。

1.父頁面向子頁面傳遞數據

實現的技巧是利用location對象的hash值,通過它傳遞通信數據。在父頁面設置iframe的src后面多加個data字符串,然后在子頁面中通過某種方式能即時的獲取到這兒的data就可以了,例如:

1.1 在子頁面中通過setInterval方法設置定時器,監聽location.href的變化即可獲得上面的data信息

1.2. 然后子頁面根據這個data信息進行相應的邏輯處理

2.子頁面向父頁面傳遞數據

實現技巧就是利用一個代理iframe,它嵌入到子頁面中,并且和父頁面必須保持是同域,然后通過它充分利用上面第一種通信方式的實現原理就把子頁面的數據傳遞給代理iframe,然后由于代理的iframe和主頁面是同域的,所以主頁面就可以利用同域的方式獲取到這些數據。使用 window.top或者window.parent.parent獲取瀏覽器最頂層window對象的引用。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品视频在线免费观看| 视频一区视频二区国产精品| 久久九九国产精品怡红院| 久久视频在线直播| 亚洲精品永久免费精品| 日韩精品中文字幕视频在线| 91精品视频专区| 国产精品99久久久久久久久久久久| 久久精品成人动漫| 国产综合久久久久久| yw.139尤物在线精品视频| 日韩av免费在线看| 国产成人精品免高潮在线观看| 亚洲成年人影院在线| 一区二区欧美久久| 日韩精品在线观看一区二区| 精品国产福利视频| 亚洲美女av电影| 热久久这里只有| 日韩大片在线观看视频| 69影院欧美专区视频| 国产精品成熟老女人| 成人信息集中地欧美| 国产精品入口免费视| 性欧美长视频免费观看不卡| 深夜成人在线观看| 国产精品91视频| 日韩精品中文字幕在线| 青青久久av北条麻妃黑人| 欧美性xxxx极品高清hd直播| 8x拔播拔播x8国产精品| 九九久久精品一区| 日韩精品中文字幕在线观看| 亚洲一区二区在线播放| 成人情趣片在线观看免费| 欧美性猛交xxxx免费看漫画| 日韩在线一区二区三区免费视频| 韩国视频理论视频久久| 亚洲黄色av网站| 亚洲视频自拍偷拍| 日韩av综合网站| 国产999精品| 欧美国产精品人人做人人爱| 亚洲国产精品一区二区三区| 成人免费看黄网站| 日韩影视在线观看| 国产日韩精品在线播放| 国产日本欧美在线观看| 久久精品国产一区二区三区| 亚洲国产欧美在线成人app| 超碰97人人做人人爱少妇| 欧美日韩免费区域视频在线观看| 色综合亚洲精品激情狠狠| 最近2019年手机中文字幕| 欧美在线免费看| 日韩一区二区欧美| 欧美另类高清videos| 成人444kkkk在线观看| 欧美成人亚洲成人| 国产成人在线一区二区| 久久在线观看视频| 欧美电影在线观看完整版| 在线观看精品自拍私拍| 国产91色在线|免| 亚洲在线www| 欧美寡妇偷汉性猛交| 亚洲自拍中文字幕| 夜夜嗨av一区二区三区四区| 成人av色在线观看| 成人福利视频网| 日韩欧美国产成人| 影音先锋日韩有码| 国产欧美日韩精品在线观看| 国模私拍视频一区| 亚洲一区二区免费| 欧美成人精品在线| 欧美日韩久久久久| 日韩欧美a级成人黄色| 永久免费看mv网站入口亚洲| 日韩av在线直播| 亚洲精品一区中文字幕乱码| 国产亚洲综合久久| 欧洲亚洲免费视频| 亚洲图片欧洲图片av| 欧美中文在线免费| 国产精品丝袜白浆摸在线| 欧美日韩裸体免费视频| 久久成人亚洲精品| 欧美精品成人在线| 国产97色在线|日韩| 国产日韩精品一区二区| 国产精品女主播| 亚洲第一黄色网| 亚洲高清福利视频| 久久精品国产一区二区三区| 91在线直播亚洲| 4438全国亚洲精品在线观看视频| 日韩在线欧美在线国产在线| 亚洲成人av在线播放| 亚洲精品视频网上网址在线观看| 中文字幕欧美亚洲| 欧美激情亚洲激情| 91精品久久久久久久久| 国产一区二区三区三区在线观看| 亚洲的天堂在线中文字幕| 国产精品久久久久久久久久久久久久| 中文字幕日本欧美| 久久久噜噜噜久久中文字免| 亚洲国产精品女人久久久| 亚洲综合中文字幕在线观看| 久久亚洲精品国产亚洲老地址| 欧美日韩久久久久| 国产美女扒开尿口久久久| 综合136福利视频在线| 另类图片亚洲另类| 国产欧美精品va在线观看| 欧美一区视频在线| 懂色av一区二区三区| 久久精品国产精品| 国产精品国语对白| 久久久国产精彩视频美女艺术照福利| 亚洲视频在线播放| 欧美激情亚洲自拍| 粗暴蹂躏中文一区二区三区| 成人美女av在线直播| 久久久久久国产| 色午夜这里只有精品| 国产亚洲欧美日韩一区二区| 91精品在线国产| 久久久久久这里只有精品| 91久久国产综合久久91精品网站| 亚洲欧美精品伊人久久| 国产一区二区三区网站| 国产精品美女主播| 国产va免费精品高清在线观看| 久久久久久成人精品| 亚洲欧美成人一区二区在线电影| 久久99热这里只有精品国产| 欧美综合在线观看| 青青a在线精品免费观看| 国产在线一区二区三区| 亚洲精品国产福利| 日韩av电影在线免费播放| 日韩高清电影好看的电视剧电影| 欧美电影在线观看高清| 91成人在线视频| 久久影视三级福利片| 日韩国产一区三区| 91情侣偷在线精品国产| 日韩电影中文字幕| 国产精品久久久久久久久久久不卡| 久久亚洲一区二区三区四区五区高| 国产中文日韩欧美| 成人羞羞国产免费| 欧美日韩国产精品一区二区三区四区| 国产日韩欧美在线视频观看| 美女视频黄免费的亚洲男人天堂| 91手机视频在线观看| 日韩精品久久久久久福利| 国产精品九九久久久久久久| 久久久精品999| 青青草国产精品一区二区| 国产精品久久91| 日本精品va在线观看|