解決思路:
每一個窗口其實(shí)也是一個對象,窗口內(nèi)的對象或函數(shù)就相當(dāng)于對象內(nèi)的對象或方法,問題的關(guān)鍵是如何取得窗口對象的控制句柄,不同的窗口的控件句柄是不一樣的,下面分三種窗口討論。
具體步驟:
1.用window.open()打開的一般窗口。
<script>
var sub
function sub_win(){
sub=window.open() //sub為子窗口句柄
//以數(shù)據(jù)流方式向子窗口輸出HTML代碼 ,sub_function()為子窗口的演示函數(shù)
sub.document.write("<script>function sub_function(){alert(’子窗口函數(shù)’)}<\/script><button onClick=’opener.par_function()’>調(diào)用父窗口函數(shù)</button>")
sub.document.close() //關(guān)閉子窗口的輸出流
}
function par_function(){//父窗口的演示函數(shù)
alert("父窗口函數(shù)")
}
</script>
<button onClick="sub_win()">打開子窗口</button><button onClick="sub.sub_function()">調(diào)用子窗口內(nèi)函數(shù)</button>
代碼運(yùn)行效果如圖1.5.6所示。
圖1.5.6 在父窗口訪問子窗口的函數(shù)
從上面的代碼中可以發(fā)現(xiàn),父窗口調(diào)用子窗口的函數(shù)或?qū)ο?,需要在對象前加上子窗口句?上例中的變量sub)作前綴,要訪問子窗口中的sub_function()函數(shù),就是sub.sub_function(),反過來,在子窗口中訪問父窗口的函數(shù)或?qū)ο?,需要在前面加上opener,如opener.par_function()。
提示:這里只是為了演示方便,以數(shù)據(jù)流方式向子窗口中輸出HTML代碼,在實(shí)際應(yīng)用時直接在彈出頁中按上面所說的方法調(diào)用就行了。
2.用showModalDialog打開的模式窗口。
<script>
function smdWin(){
win=window.showModelessDialog("demo.htm",window,"dialogWidth=200px;dialogHeight=200px;status=0;scroll=no")
}
</script>
<button onclick="smdWin()">打開模式窗口</button>
<input id="oInput">
demo.htm:
<input id="sInput">
<button onClick="dialogArguments.oInput.value=sInput.value">傳遞文字</button>
代碼運(yùn)行效果如圖1.5.7所示。
圖1.5.7 在子窗口訪問父窗口的對象
注意:在模式對話框的父窗口中無法通過鼠標(biāo)操作控制訪問模式對話框的對象,但可以通過設(shè)置自動執(zhí)行的腳本來實(shí)現(xiàn)訪問,方法同無模式對話框。
3.用showModelessDialog方法打開的無模式窗口
<script>
var win
function smdWin(){
win=window.showModelessDialog("demo.htm",window,"dialogWidth=200px;dialogHeight=200px;status=0;scroll=no")
}
</script>
<button onclick="smdWin()">打開無模式窗口</button>
<input id="oInput">
<button onClick="win.sInput.value=oInput.value">傳遞文字</button>
demo.htm:
<input id="sInput">
<button onClick="dialogArguments.oInput.value=sInput.value">傳遞文字</button>
代碼運(yùn)行效果:
圖1.5.8 在父窗口中訪問子窗口的對象
圖1.5.9 在子窗口中訪問父窗口的對象
可以看出,父窗口和子窗口的數(shù)據(jù)傳遞基本方法是一樣,只是模式窗口和無模式窗口在向父窗口傳遞數(shù)據(jù)時把一般窗口的opener換成了dialogArguments
注意:打開模式窗口或無模式窗口的第二個參數(shù)須為window,模式窗口的父窗口無法以常規(guī)方式即時向它傳遞數(shù)據(jù),因?yàn)樗母复翱跓o法獲得焦點(diǎn)。
技巧:父窗口要給子窗口傳遞數(shù)據(jù),還可以通過給頁地址后添加參數(shù),然后在子窗口用location.search取值的方式來完成,還可以通過打開子窗口的第二個參數(shù)來完成,如:
<script>
var sub
function sub_win(){
sub=window.open("","demo","width=100,height=100")
sub.document.write("<script>alert(window.name)<\/script>")
sub.document.close()
}
</script>
<button onClick="sub_win()">打開子窗口</button>
圖1.5.10 通過open方法的第二個參數(shù)傳遞數(shù)據(jù)
特別提示
對于第一種情況,代碼運(yùn)行后,先單擊【打開子窗口】按鈕,然后再單擊【調(diào)用子窗口內(nèi)函數(shù)】和【調(diào)用父窗口函數(shù)】按鈕看效果;第二、三種情況的代碼運(yùn)行后在模式/無模式窗口的文本框中填寫內(nèi)容后再單擊【傳遞文字】按鈕。
特別說明
通過本例的學(xué)習(xí),讀者朋友應(yīng)該掌握父窗口與子窗口的相互訪問方法,還有對象的概念。
例如,父窗口這樣寫:
……
<head>
<script> function F() { alert("父窗口函數(shù)"); } </script>
</head>
<body onload="open('2.htm')">
<input type=hidden id=F1 onclick="F()">
在子窗口中這樣寫:
<input type=button value="執(zhí)行父窗口函數(shù)" onclick="javascript:window.opener.document.all.F1.click()">
或者干脆這樣寫:<input type=button value="執(zhí)行父窗口函數(shù)2" onclick="javascript:opener.F()">
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。