子窗口、父窗口和Silverlight之间的相互调用


Posted in Javascript onAugust 16, 2010

其实,他们之间的调用还是很简单的~
基础篇
一、父页面调用子页面中的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加载完成后就出触发子页面的这个函数 函数名可以更改

Javascript 相关文章推荐
如何做到打开一个页面,过几分钟自动转到另一页面
Apr 20 Javascript
javascript 操作Word和Excel的实现代码
Oct 26 Javascript
jQuery编写widget的一些技巧分享
Oct 28 Javascript
Jquery知识点二 jquery下对数组的操作
Jan 15 Javascript
动态的创建一个元素createElement及删除一个元素
Jan 24 Javascript
JavaScript 学习笔记之操作符
Jan 14 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
Sep 19 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
Dec 06 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 Javascript
Vue数字输入框组件示例代码详解
Jan 15 Javascript
three.js利用射线Raycaster进行碰撞检测
Mar 12 Javascript
Vue 自适应高度表格的实现方法
May 13 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
Aug 16 #Javascript
JavaScript实用技巧(一)
Aug 16 #Javascript
IE6下js通过css隐藏select的一个bug
Aug 16 #Javascript
新手常遇到的一些jquery问题整理
Aug 16 #Javascript
使用jQuery轻松实现Ajax的实例代码
Aug 16 #Javascript
jQuery实现原理的模拟代码 -6 代码下载
Aug 16 #Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
Aug 13 #Javascript
You might like
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
python创建学生成绩管理系统
2019/11/22 Python
Python过滤序列元素的方法
2020/07/31 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
50道外企软件测试面试题
2014/08/18 面试题
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
工程安全员岗位职责
2014/03/09 职场文书
王老吉广告词
2014/03/20 职场文书
个人担保书格式范文
2014/05/12 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
2014年档案室工作总结
2014/12/01 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书