DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> 子窗口、父窗口和Silverlight之間的相互調用
子窗口、父窗口和Silverlight之間的相互調用
編輯:關於JavaScript     
其實,他們之間的調用還是很簡單的~
基礎篇
一、父頁面調用子頁面中的JS
我們先創建一個子窗體
復制代碼 代碼如下:
var win
$(function () {
Root = $('#Root').val();//設置根目錄
});
function OpenPlayer(id, type, add) {
//這裡是用來限制同一個窗口只能彈出一次的
//其實就算不做限制,只要window.open參數中的name相同,就不會重復打開
//window.open中的參數可以參考別的文章,有很多
if (win == null || win.closed) {
win = window.open('http://loaclhost/sl.aspx', 'win', 'width=870,height=650,top=1,left=0,scrollbars=0,resizable=0,status=1', true);
}

那怎麼調用呢?
復制代碼 代碼如下:
this.alert('hello world!');
win.alert('hello world!');
win.onload = function () { this.alert('test'); };

眾所周知,第一行是在本窗口彈出一個提示框(this可以一般都會省略~)
那其實,this和win指向的是同類型,不同的對象罷了
所以,他們的方法都是一樣的。
第二行就是在子窗口中彈出一個提示框的代碼。
你還可以在父窗體中寫子窗體的事件~
第三行的作用是,當子窗體加載完成後,父窗口彈出提示框。
二、子窗體調用父窗體
這個和上面差不多,當父窗體打開一個子窗體後,你可以這樣訪問到父窗體
window.opener
這個對象就是父窗體,直接調用相應的函數即可
三、子窗體調用silverlight函數或對象
這個在MSND上有詳細介紹,中文的~在這裡,我幫大家提一下主要的幾個步驟(調用silverlight對象的方法就不貼出來了,裡面有)
另附 傳送門:
1、現在silverlight中,給需要被調用的函數加上一個attribute——ScriptableMember
復制代碼 代碼如下:
// MyScriptableManagedType.cs
using System.Windows.Browser;
namespace HB {
public class MyScriptableManagedType {
[ScriptableMember()]
public string MyToUpper(string str) {
return str.ToUpper();
}
[ScriptableMember()]
public string Name { get; set; }
}
}

2、在構造函數中注冊這個對象
復制代碼 代碼如下:
MyScriptableManagedType smt = new MyScriptableManagedType();
HtmlPage.RegisterScriptableObject("mySLapp", smt);
//如果這個函數不是外部類中的函數,而是sl主體的函數,那直接傳入this指針就可以了

3、打開slverlight所在的頁面
在 Silverlight 對象標記中,添加具有值"pluginLoaded"的 onLoad 屬性。
下面的示例演示用於 Silverlight 控件引用的 HTML 標記。
復制代碼 代碼如下:
<object data="data:application/x-silverlight-2,"
type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/HB.xap"/>
<param name="onerror" value="onSilverlightError" />
<param name="onLoad" value="pluginLoaded" />
<!-- ... -->
</object>

4、在頁上現有的 script 元素中,添加 pluginLoaded 方法的 JavaScript 函數。
使用 getHost 方法獲取對 Silverlight 控件的引用。下面的示例演示 pluginLoaded 方法的 JavaScript 代碼。
復制代碼 代碼如下:
<script type="text/javascript">
var slCtl=null;
function pluginLoaded(sender,args){ // HTML version
slCtl = sender.getHost();
alert( slCtl.Content.mySLapp.MyToUpper("test string"));
}
</script>

四、silverlight調用子窗體中的js
同樣,也是MSDN上的文章~ 傳送門:
這個超級簡單,直接:
HtmlPage.Window.Invoke("MethodName", args);
前面一個參數是函數名,後面的參數是這個函數需要傳入的參數
提高篇
五、父頁面打開子頁面的時候,直接給silverlight傳入參數
這個主要是在初始化的時候用到
在第一部部分中,我們打開了 http://loaclhost/sl.aspx 這個子窗口
這時候,我們可以用GET方式傳入一些參數 例如:http://loaclhost/sl.aspx?id=1
然後在silverlight中這樣訪問:

string id = HtmlPage.Document.QueryString["id"];

六、怎麼樣才能把子窗口前置?
我的子頁面中的silverlight應用程序其實是一個音樂播放器,然後,所以子頁面一般是最小化的。
但是,當我在silverlight應用程序裡彈出MessageBox的時候它還是處於最小化狀態… 這樣對用戶很不友好。
想要把子窗口前置的話,只能通過在父窗口中調用 win.focus() 函數
但是,我們只要稍微處理一下,在父窗口,子窗口,sl中就都可以實現這個目的了
所以可以這樣做:
1、在父窗口中寫一個函數,叫Focus()
然後調用 win.focus();
2、在子窗口中寫一個函數,叫Focus()
調用 window.opener.Focus()
3、最後,如果想讓silverlight應用程序前置,你在父窗口或者子窗口中調用Focus()這個函數,也可以再silverlight中調用子窗口的Focus()函數

七、怎麼判斷silverlight已經加載完成?
下面有幾個思路,有對有錯
(√)在silverlight應用程序的構造函數中,調用子頁面或者父頁面(通過子頁面)的js 【這個方法可行,但是略顯麻煩】
(×)在子頁面中 寫 window.onload 事件 【這個事件觸發的時候silverlight不一定加載完成】
(√)還記得第三部分,第3步裡的這個嗎? <param name="onLoad" value="pluginLoaded" /> 【推薦做法】
加入這條以後,silverlight加載完成後就出觸發子頁面的這個函數 函數名可以更改
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved