子視窗、父視窗和Silverlight之間的相互調用

來源:互聯網
上載者:User

其實,他們之間的調用還是很簡單的~
基礎篇
一、父頁面調用子頁面中的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載入完成後就出觸發子頁面的這個函數 函數名可以更改

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.