子窗口、父窗口和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 相关文章推荐
在IE下:float属性会影响offsetTop的取值
Dec 22 Javascript
网上抓的一个特效
May 11 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
Dec 27 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
Jun 14 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
Dec 11 Javascript
Vue.js 表单校验插件
Aug 14 Javascript
详解JavaScript模块化开发
Dec 04 Javascript
js仿微信公众平台打标签功能
Apr 08 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
May 02 Javascript
浅谈Webpack核心模块tapable解析
Sep 11 Javascript
vue使用nprogress实现进度条
Dec 09 Javascript
uni-app如何页面传参数的几种方法总结
Apr 28 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
php中文验证码实现方法
2015/06/18 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
单链表反转python实现代码示例
2018/02/08 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
linux环境下Django的安装配置详解
2019/07/22 Python
python函数的作用域及关键字详解
2019/08/20 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
学校消防演习方案
2014/02/19 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
英文慰问信范文
2015/03/24 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python