JavaScript iframe的相互操作淺析
一、頁(yè)面
三個(gè)頁(yè)面:父頁(yè)面和兩個(gè)子頁(yè)面,兩個(gè)子頁(yè)面在父頁(yè)面的兩個(gè)iframe里。
1、父頁(yè)面MainForm.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MainForm.aspx.cs" Inherits="Test.MainForm" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<ul>
<li>
父頁(yè)面(文本失去焦點(diǎn)可看結(jié)果):<input id="txtParent" name="txtParent" type="text" value="parent" onblur="iframeTest()" />
</li>
<li>
<iframe src="FrameA.aspx" id="iframeA"></iframe>
</li>
<li>
<iframe src="FrameB.aspx" id="iframeB"></iframe>
</li>
</ul>
</div>
<script type="text/javascript">
function iframeTest() {
}
</script>
</form>
</body>
</html>
2、子頁(yè)面A
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FrameA.aspx.cs" Inherits="Test.FrameA" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
//子頁(yè)面與父頁(yè)面之間的操作
function getParent() {
}
//當(dāng)前子頁(yè)面與另外一個(gè)子頁(yè)面之間的操作
function getAnotherChild() {
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
子頁(yè)面1(文本失去焦點(diǎn)可看結(jié)果):<input id="txtUserName" name="txtUserName" type="text" value="jeff wong" onblur="getParent()" />
</div>
</form>
</body>
</html>
3、子頁(yè)面B
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FrameB.aspx.cs" Inherits="Test.FrameB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
子頁(yè)面2(文本失去焦點(diǎn)可看結(jié)果):<input id="txtUserNameB" name="txtUserNameB" type="text" value="jeffery zhao"/>
</div>
</form>
</body>
</html>
二、操作
1、父頁(yè)面操作子頁(yè)面
這個(gè)毫無(wú)疑問(wèn)要在父頁(yè)面MainForm.aspx文件里實(shí)現(xiàn)。我們修改父頁(yè)面的javascript函數(shù)iframeTest,看父頁(yè)面如何獲取和操作子頁(yè)面元素的:
function iframeTest() {
var frame1 = document.getElementById("iframeA");
var frame2 = document.getElementById("iframeB");
var frameA = document.frames["iframeA"]; //等價(jià)于 var frameAa = document.frames.iframeA;
var frameB = document.frames["iframeB"]; //等價(jià)于 var frameBb = document.frames.iframeB;
//**********************************************
alert(frame1 == frameA); //false
alert(frame2 == frameB); //false
alert(frame1.src); //FrameA.aspx
alert(frame1.location); //undefined
alert(frameA.src); //undefined
alert(frameA.location); //location
alert(frameA.document.location);
alert(frame1.document.body.innerHTML); //這里返回的是MainForm.aspx的body里的innerHTML
alert(frame1.document.documentElement.innerHTML); //這里返回的是MainForm.aspx的html里的innerHTML
alert(frameA.document.body.innerHTML); //這里返回的是FrameA.aspx的body里的innerHTML
alert(frameA.document.documentElement.innerHTML); //這里返回的是FrameA.aspx的html里的innerHTML
//**********************************************
var childFrameDoc = undefined;
//取FrameA.aspx內(nèi)的input文本
if (document.all) {//IE
childFrameDoc = frameA.document; //*** 如果是frame1,就取不到FrameA.aspx頁(yè)面里的input ***
} else {//Firefox
childFrameDoc = frameA.contentDocument;
}
alert(childFrameDoc.body.innerHTML);
var childTxt = childFrameDoc.getElementById("txtUserName");
var childTxtByName = childFrameDoc.getElementsByName("txtUserName");
alert(childTxt == childTxtByName[0]); //true
alert(childTxt.value); //jeff wong
alert(childTxtByName[0].value); // jeff wong
//取FrameB.aspx內(nèi)的input文本
childFrameDoc = undefined;
if (document.all) {//IE
childFrameDoc = frameB.document;
} else {//Firefox
childFrameDoc = frameB.contentDocument;
}
alert(childFrameDoc.body.innerHTML);
var childTxt = childFrameDoc.getElementById("txtUserNameB");
var childTxtByName = childFrameDoc.getElementsByName("txtUserNameB");
alert(childTxt == childTxtByName[0]); //true
alert(childTxt.value); //jeffery zhao
alert(childTxtByName[0].value); // jeffery zhao
}
小結(jié):
a、通過(guò)iframe對(duì)象所在頁(yè)面的對(duì)象模型(通過(guò)document.getElementById("iframeId")獲?。?,你可以訪問(wèn)iframe對(duì)象的屬性,但不能訪問(wèn)其內(nèi)容。
b、frames集合提供了對(duì)iframe內(nèi)容的訪問(wèn)(通過(guò)document.frames["iframeName"]獲取)。通常情況下我們都使用frames集合讀寫iframe內(nèi)包含的元素。
c、 如果只想改變iframe的src或者border, scrolling等attributes(與property不是一個(gè)概念,property是不能寫在標(biāo)簽內(nèi)的,比 如:scrollHeight,innerHTML等),就需要用到document.getElementById方法.
d、要想使用iframe內(nèi)的函數(shù)或dom元素(比如想得到iframe的document.body的內(nèi)容),變量就必須通過(guò)frames集合.因?yàn)樗〉氖且粋€(gè)完整的DOM模型,而通過(guò)id獲取的方法只是取出了一個(gè)object而已.
e、如果在iframe的頁(yè)面未完全裝載的時(shí)候,調(diào)用iframe的dom模型,會(huì)發(fā)生錯(cuò)誤.
2、子頁(yè)面操作父頁(yè)面
這里以子頁(yè)面FrameA.aspx舉例。在子頁(yè)面A中,我們通過(guò)函數(shù)getParent獲取MainForm.aspx的dom元素,然后按照正常的dom元素操作就是了:
//子頁(yè)面與父頁(yè)面之間的操作
function getParent() {
if (self != top) {
var oDoc = top.parent.document;
alert(oDoc.body.innerHTML);
alert(oDoc.documentElement.innerHTML);
alert(oDoc.frames.length); //返回結(jié)果:2 表明父頁(yè)面有兩個(gè)iframe
//操作父頁(yè)面的文本框
var oTxt = oDoc.getElementById("txtParent");
alert(oTxt.value);
}
else alert("不在框架中");
}
3、子頁(yè)面操作子頁(yè)面
這個(gè)還要借助主頁(yè)面間接獲取另一個(gè)子頁(yè)面。這里還以子頁(yè)面A來(lái)舉例。通過(guò)主頁(yè)面,我們間接獲取了子頁(yè)面B,然后像正常操作dom一樣,子頁(yè)面A完成對(duì)子頁(yè)面B的控制和操作。
先修改getAnotherChild()函數(shù):
//當(dāng)前子頁(yè)面與另外一個(gè)子頁(yè)面之間的操作
function getAnotherChild() {
alert(self.location.href); //當(dāng)前頁(yè)面的url
//通過(guò)父頁(yè)面,間接獲取另外一個(gè)子頁(yè)面
if (self != top) {
var oDoc = top.parent.document;
var oAnotherFrame = oDoc.frames["iframeB"]; //返回另外一個(gè)iframe
alert(oAnotherFrame.location);
alert(oAnotherFrame.document.body.innerHTML);
alert(oAnotherFrame.document.documentElement.innerHTML);
var oTxt = oAnotherFrame.document.getElementById("txtUserNameB");
alert(oTxt.value); //jeffery zhao
}
}
注意:修改完getAnotherChild()函數(shù),然后將子頁(yè)面A(FrameA.aspx)中的textUserName的onblur事件改為 onblur="getAnotherChild()"就可以看到結(jié)果了.
- 微信jssdk在iframe頁(yè)面失效問(wèn)題的解決措施
- JavaScript實(shí)現(xiàn)iframe自動(dòng)高度調(diào)整和不同主域名跨域
- JavaScript iframe數(shù)據(jù)共享接口實(shí)現(xiàn)方法
- js檢測(cè)iframe是否加載完成的方法
- js實(shí)現(xiàn)防止被iframe的方法
- iframe里使用JavaScript控制主頁(yè)轉(zhuǎn)向的方法
- JS獲取iframe中l(wèi)ongdesc屬性的方法
- js實(shí)現(xiàn)iframe動(dòng)態(tài)調(diào)整高度的代碼
- js實(shí)現(xiàn)的真正的iframe高度自適應(yīng)(兼容IE,FF,Opera)
- JavaScript使ifram跨域相互訪問(wèn)及與PHP通信的實(shí)例
相關(guān)文章
js解析xml字符串和xml文檔實(shí)現(xiàn)原理及代碼(針對(duì)ie與火狐)
分別針對(duì)ie和火狐分別作了對(duì)xml文檔和xml字符串的解析,考慮到了瀏覽器的兼容性,至于在ajax環(huán)境下解析xml,其實(shí)原理是一樣的,只不過(guò)放在了ajax里,還是要對(duì)返回的xml進(jìn)行解析,感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)js解析xml有所幫助2013-02-02
Javascript快速實(shí)現(xiàn)瀏覽器系統(tǒng)通知
這篇文章給大家介紹了Javascript快速實(shí)現(xiàn)瀏覽器系統(tǒng)通知的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-08-08
js+html5實(shí)現(xiàn)可在手機(jī)上玩的拼圖游戲
這篇文章主要介紹了js+html5實(shí)現(xiàn)可在手機(jī)上玩的拼圖游戲,涉及javascript結(jié)合html5進(jìn)行圖形操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
javascript實(shí)現(xiàn)table表格隔行變色的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)table表格隔行變色的方法,涉及javascript針對(duì)表格元素與樣式的操作技巧,需要的朋友可以參考下2015-05-05
JS小知識(shí)之如何將CSV轉(zhuǎn)換為JSON字符串
CSV文件一般是以逗號(hào)為分隔值的文件(Comma-Separated?Values,CSV,有時(shí)也稱為字符分隔值,因?yàn)榉指糇址部梢圆皇嵌禾?hào)),其文件以純文本形式存儲(chǔ)表格數(shù)據(jù)(數(shù)字和文本),下面這篇文章主要給大家介紹了JS小知識(shí)之如何將CSV轉(zhuǎn)換為JSON字符串的相關(guān)資料,需要的朋友可以參考下2023-06-06
一文詳解javascript語(yǔ)言中的類(class)
class類是一種抽象的體現(xiàn),用來(lái)表示具有相同特性的一類事物,是面向?qū)ο缶幊滩豢扇鄙俚墓ぞ?下面這篇文章主要介紹了javascript語(yǔ)言中類class的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
IE innerHTML,outerHTML所引起的問(wèn)題
我們?cè)谟胘avascript創(chuàng)建一個(gè)遮蓋層(div)后,如果點(diǎn)擊關(guān)閉用到了2009-06-06
原生JavaScript+LESS實(shí)現(xiàn)瀑布流
這篇文章主要介紹了原生JavaScript+LESS實(shí)現(xiàn)瀑布流的方法,附上了具體實(shí)例,這里推薦給有需要的小伙伴。2014-12-12
webpack多頁(yè)面開(kāi)發(fā)實(shí)踐
這篇文章主要介紹了webpack多頁(yè)面開(kāi)發(fā)實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12

