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

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

(0)

相关推荐

  • js 父窗口控制子窗口的行为-打开,关闭,重定位,回复

    测试的时候,注意当前目录中,有代码中的html文件. 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head&

  • 子窗口给父窗口赋值实现思路及案例演示

    今天Insus.NET练习JavaScript,实现从父窗口打开一个子窗口,在子窗口处理一些结果之后,把结果赋值于父窗口的文本框内.可看效果:  在站点创建两个aspx页面,一个是PageA.aspx另一个是PageB.aspx: 在PageA.aspx的<head>节点内,写Javascript脚本,脚本有两个方法,一个是打开子窗口,一个是为文本框设值的方法: 复制代码 代码如下: <script type="text/javascript"> functio

  • JavaScript子窗口ModalDialog中操作父窗口对像

    在ModalDialog中操作父窗口对象 1.不能使用window.parent Window.parent是用来在frame中进行操作的,在对话框中不能用来操作父窗口对象 2.正确的做法 调用modaldialog时通过传参数的方式操作 例: 需求 父窗口页面为a.html 子窗口页面为b.html.a.html中有文本框id为test1,在打开的对话框中点击按钮,将a.html的文本框值改为"子窗口值". 实现 打开对话框时把test1作为参数传给子窗口,在子窗口中获取参数,将参数

  • 父窗口获取弹出子窗口文本框的值

    <script defer>function browser.onclick(){var nW = window.open("","","width=170,height=200");nW.moveTo(300,100);nW.document.write("<script defer>\r"+"var m=true;\r"+"function insert.onclick

  • iframe 父窗口和子窗口相互的调用方法集锦

    一.父窗口调用iframe子窗口方法 1.HTML语法:<iframe name="myFrame" src="child.html"></iframe> 2.父窗口调用子窗口:myFrame.window.functionName(); 3.子窗品调用父窗口:parent.functionName(); 简单地说,也就是在子窗口中调用的变量或函数前加个parent.就行 4.父窗口页面源码: 复制代码 代码如下: <html>

  • 用javascript父窗口控制只弹出一个子窗口

    近来网上经常流传一些关于如何在父窗口控制只弹出一个子窗口 问题,我查看了一些,大部分都是只能解决部分或者很麻烦,还不算完美.比如有人是实现的这样,使用的是Cookie,以下是例子. 主页上做了一个弹出窗口,如何使其只弹出一次,返回主页时不再弹出了. --------------------------------------------------------------- <script> window.open("http://www.yeboss.com.cn",&q

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

    其实,他们之间的调用还是很简单的~ 基础篇 一.父页面调用子页面中的JS 我们先创建一个子窗体 复制代码 代码如下: var win $(function () { Root = $('#Root').val();//设置根目录 }); function OpenPlayer(id, type, add) { //这里是用来限制同一个窗口只能弹出一次的 //其实就算不做限制,只要window.open参数中的name相同,就不会重复打开 //window.open中的参数可以参考别的文章,有很多

  • 关于Iframe父页面与子页面之间的相互调用

    iframe元素就是文档中的文档. window对象: 浏览器会在其打开一个HTML文档时创建一个对应的window对象.但是,如果一个文档定义了一个或者多个框架(即:包含一个或者多个frame或者iframe标签),浏览器就会为原始文档创建一个window对象,再为每个iframe创建额外的window对象,这些额外的window对象是原始窗口的子窗口. contentWindow: 是指指定的iframe或者iframe所在的window对象 Demo1 父页面fu.html: <!DOCT

  • pyqt 多窗口之间的相互调用方法

    * 在编程开发中,一个程序不可避免的需要多窗口操作来实现具体的功能. 实现此功能的基本步骤(以三个窗口为例,使用主窗口调用其它两个窗口) # 主窗口 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600)

  • 如何实现springboot中controller之间的相互调用

    springboot controller之间相互调用 SpringBoot之间内部调用 @Autowired private RestTemplate restTemplate ;//自动装配restTemplate -------------------返回json字符串类型---------------------------------- @RequestMapping("/selectHospatal") @ResponseBody public String selectH

  • 浅析Activity之间的相互调用

    Activity1 复制代码 代码如下: //在按键按下后,调用第二个实体,第二个实体处理完数据后再传给第一个实体      btn3.setOnClickListener(new Button.OnClickListener() {          public void onClick(View v) {              final int RG_REQUEST = 0;              Intent intent = new Intent();            

  • C语言与Lua之间的相互调用详解

    前言 第一次接触Lua是因为Unity游戏中需要热更,但是一直没搞懂Lua是怎么嵌入到别的语言中执行的,如何互相调用的. lua是扩展性非常良好的语言,虽然核心非常精简,但是用户可以依靠lua库来实现大部分工作.除此之外,lua还可以通过与C函数相互调用来扩展程序功能.在C中嵌入lua脚本既可以让用户在不重新编译代码的情况下修改lua代码更新程序,也可以给用户提供一个自由定制的接口,这种方法遵循了机制与策略分离的原则.在lua中调用C函数可以提高程序的运行效率.lua与C的相互调用在工程中相当实

  • JavaScript子窗口调用父窗口变量和函数的方法

    本文实例讲述了JavaScript子窗口调用父窗口变量和函数的方法.分享给大家供大家参考.具体如下: 示例1:子窗口是新打开的窗口 父窗口: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=" http://www.w3.

  • Android Activity之间相互调用与传递参数的原理与用法分析

    本文实例讲述了Android Activity之间的相互调用与传递参数.分享给大家供大家参考,具体如下: Activity之间是如何调用的 在javaWeb程序中,jsp与jsp之间的调用是通过重定向完成的,而在Android中,Activity与Activity之间的切换是通过Intent来完成的. 所谓Intent,它是Android中非常重要的内置组件,他可以理解为"我要干一件什么事情".在Android中有3大组件:Activity,Service.Broadcast,他们之间

  • C#中父窗口和子窗口之间控件互操作实例

    本文实例讲述了C#中父窗口和子窗口之间控件互操作的方法.分享给大家供大家参考.具体分析如下: 很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异: 第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如: 复制代码 代码如下: public static yourMainWindow pCurrentWin =

  • 子父窗口之间的操作

    子父窗口的操作 var win=null; function op(){ win=window.open("about:blank","win","width=200,height=200"); win.document.write(""); win.document.write(""); } [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

随机推荐