Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式


Posted in Javascript onJune 28, 2010

默认情况下,生成的页面代码可能与下面的代码类似:

<!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> 
<title>IRERTranscript</title> 
<style type="text/css"> 
html, body { 
height: 100%; 
overflow: auto; 
} 
body { 
padding: 0; 
margin: 0; 
} 
#silverlightControlHost { 
height: 100%; 
text-align:center; 
} 
</style> 
<script type="text/javascript" src="Silverlight.js"></script> 
<script type="text/javascript"> 
function onSilverlightError(sender, args) { 
var appSource = ""; 
if (sender != null && sender != 0) { 
appSource = sender.getHost().Source; 
} 
var errorType = args.ErrorType; 
var iErrorCode = args.ErrorCode; 
if (errorType == "ImageError" || errorType == "MediaError") { 
return; 
} 
var errMsg = "Unhandled Error in Silverlight Application " + appSource + "\n" ; 
errMsg += "Code: "+ iErrorCode + " \n"; 
errMsg += "Category: " + errorType + " \n"; 
errMsg += "Message: " + args.ErrorMessage + " \n"; 
if (errorType == "ParserError") { 
errMsg += "File: " + args.xamlFile + " \n"; 
errMsg += "Line: " + args.lineNumber + " \n"; 
errMsg += "Position: " + args.charPosition + " \n"; 
} 
else if (errorType == "RuntimeError") { 
if (args.lineNumber != 0) { 
errMsg += "Line: " + args.lineNumber + " \n"; 
errMsg += "Position: " + args.charPosition + " \n"; 
} 
errMsg += "MethodName: " + args.methodName + " \n"; 
} 
throw new Error(errMsg); 
} 
</script> 
</head> 
<body> 
<form id="form1" runat="server" style="height:100%"> 
<div id="silverlightControlHost"> 
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
<param name="source" value="ClientBin/example.xap"/> 
<param name="onError" value="onSilverlightError" /> 
<param name="background" value="white" /> 
<param name="minRuntimeVersion" value="4.0.50401.0" /> 
<param name="autoUpgrade" value="true" /> 
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50401.0" style="text-decoration:none"> 
<img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/> 
</a> 
</object><iframe id="slExample" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div> 
</form> 
</body> 
</html>

我们可以给object对象传递不同的参数,如xap包的加载地址,onLoad或onError事件句柄,背景色,最小版本号支持等等,完整的参数信息读者可以参考Silverlight 3中param参数列表汇总。object对象中一般会包含一段<a>标记,是用来显示当客户端浏览器未安装Silverlight插件时要显示的内容的,我们可以自定义其中的内容,如:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> 
<param name="source" value="ClientBin/example.xap"/> 
<param name="onError" value="onSilverlightError" /> 
<param name="background" value="white" /> 
<param name="minRuntimeVersion" value="4.0.50401.0" /> 
<param name="autoUpgrade" value="true" /> 
<img src="/images/NonSilverlight.jpg" style="border-style: none" usemap="#NonSilverlight" /> 
<map name="NonSilverlight" id="NonSilverlight"> 
<area shape="RECT" coords="154,87,362,183" title="Get Microsoft Silverlight" href="http://www.microsoft.com/silverlight/resources/install.aspx" target="_blank" /> 
</map> 
</object>

当客户端浏览器未安装Silverlight插件时,程序会在相应的区域显示一张带有热区的图片,热区指向的位置是Microsoft提供的Silverlight安装地址。理论上,你可以指定任何的自定义代码来显示nonSilverlight的效果,但是Silverlight默认没有提供低版本Silverlight情况下要显示的效果,也就是lowSilverlight的情况。
Silverlight可以自动实现向前兼容,也就是在低版本下编译的Silverlight包可以在高版本下运行,相反,在高版本下编译的Silverlight包不能再低版本下运行,此时Silverlight插件会显示一张默认的图片用来告知用户升级插件,并弹出一个提示框,如下图:

Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式

 

Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式

 

个人觉得这种用户体验并非很好,试想,如果当前页面上有多个Silverlight插件,岂不是要弹出多个提示框吗?那么如何来解决这个问题呢?事实上,我们除了直接在页面上添加object标记来呈现Silverlight外,还可以通过javascript脚本来动态添加Silverlight。Silverlight.js脚本为我们提供了一系列可用的方法,详细内容大家可以参考下msdn http://msdn.microsoft.com/zh-cn/library/cc838126(v=VS.95).aspx#isinstalled

以及如何通过脚本在页面上添加Silverlight,http://msdn.microsoft.com/zh-cn/library/cc265155(v=VS.95).aspx

msdn上给出了非常详细的例子来告诉我们如何使用这些脚本方法,有一点需要注意,使用Silverlight.js文件时一定要与当前Silverlight版本相一致,否则可能会有脚本错误,对应的Silverlight.js文件可以在微软的站点上下载,你会发现其实有很多个可用的版本,其中还包括支持调试的版本哦。

createObject方法参数在使用的时候有几个问题需要注意下:

1. 参数按顺序指定,如果有不需要传递的参数可用null代替。

2. parent element参数必须指定,也就是object标记的父元素,可直接将元素的id当做对象传入,但是在Firefox中不支持,此时可以使用document.getElementById('elementId')语句代替该参数即可。

3. param列表通过数组传递,参数名称与在object标记中使用的名称保持一致即可。

4. 事件列表如果没有对应的页面脚本则传null值,否则会报脚本错误。

5. 最后一个参数context如果不需要可以省去,不用传null或空值。

你应该注意到了,在使用createObject方法时我们可以顺便给Silverlight指定nonSilverlight效果,这个是通过param列表中的altHtml参数来指定的,实施上,我们在页面上直接使用object标记呈现Silverlight时也可以使用alt属性来指定nonSilverlight效果,这个与在object标记中直接插入html代码的效果相同。
通过使用createObject方法,我们完全可以自定义lowSilverlight效果了,下面是一个例子:

<div id="divSilverlightContent"> 
<script type="text/javascript"> 
if (Silverlight.isInstalled("4.0.50303.0")){ 
Silverlight.createObject("ClientBin/SilverlightApplication1.xap", 
document.getElementById('divSilverlightContent'), 
null, 
{ width: "532px", height: "380px", background: "white", version:"4.0.50303.0", windowless:"true" }, 
null, 
"param1=value1,param2=value2"); 
} 
else { 
document.write('<img src="images/NonSilverlight.jpg" style="border-style: none" usemap="#SLMap3D_NonSilverlight" />' 
+ '<map name="NonSilverlight" id="NonSilverlight">' 
+ '<area shape="RECT" coords="154,87,362,183" title="Get Microsoft Silverlight" href="http://www.microsoft.com/silverlight/resources/install.aspx" target="_blank" />' 
+ '</map>'); 
} 
</script> 
<iframe style='visibility: hidden; height: 0; width: 0; border: 0px'></iframe> 
</div>

使用Silverlight.isInstalled()方法可以判断客户端浏览器是否已经安装了指定版本的Silverlight插件,如果已经安装了,则使用Silverlight.createObject方法创建Silverlight对象,否则输出自定义的内容。

这里还有一篇文章个人觉得很有用,给大家分享下吧!

http://www.itstrike.cn/Question/Use-JavaScript-to-create-Silverlight-Object-createObject

Javascript 相关文章推荐
Javascript学习笔记7 原型链的原理
Jan 11 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
Apr 21 Javascript
jQuery 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
javascript函数中参数传递问题示例探讨
Jul 31 Javascript
javascript实现滚动效果的数字时钟实例
Jul 21 Javascript
AngularJS入门教程之链接与图片模板详解
Aug 19 Javascript
AngularJS入门教程之过滤器用法示例
Nov 02 Javascript
jstree的简单实例
Dec 01 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
微信小程序实现带缩略图轮播效果
Nov 04 Javascript
(开源)微信小程序+mqtt,esp8266温湿度读取
Apr 02 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 #Javascript
js getElementsByTagName的简写方式
Jun 27 #Javascript
两种简单实现菜单高亮显示的JS类代码
Jun 27 #Javascript
用apply让javascript函数仅执行一次的代码
Jun 27 #Javascript
验证javascript中Object和Function的关系的三段简单代码
Jun 27 #Javascript
jQuery选择头像并实时显示的代码
Jun 27 #Javascript
Javascript匿名函数的一种应用 代码封装
Jun 27 #Javascript
You might like
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
python 实现图片批量压缩的示例
2020/12/18 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
新浪网技术部笔试题
2016/08/26 面试题
美术师范毕业生自荐信
2013/11/16 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
中国梦团日活动总结
2014/07/07 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
车间质检员岗位职责
2015/04/08 职场文书
nginx服务器的下载安装与使用详解
2021/08/02 Servers
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers