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

简介:

我们在使用Visual Studio IDE创建Silverlight工程时,默认情况下都会自动生成一个用于调试和预览Silverlight的Web工程,该工程包含了html和aspx页面,以及Silverlight.js脚本文件。默认情况下,生成的页面代码可能与下面的代码类似:

复制代码
<! 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"   />  
          
< 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插件会显示一张默认的图片用来告知用户升级插件,并弹出一个提示框,如下图:

2010-6-28 16-10-24

 

2010-6-28 16-10-53

 

  个人觉得这种用户体验并非很好,试想,如果当前页面上有多个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


本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/archive/2010/06/28/1766804.html,如需转载请自行联系原作者

相关文章
|
6月前
|
开发框架 前端开发 JavaScript
在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
|
5月前
|
存储 前端开发 JavaScript
javascript 异常问题之为自定义异常提供丰富的上下文信息如何实现
javascript 异常问题之为自定义异常提供丰富的上下文信息如何实现
|
3月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
94 4
|
3月前
|
移动开发 前端开发 JavaScript
JavaScript 中的样式切换方法
JavaScript 中的样式切换方法
18 0
|
5月前
|
前端开发 微服务 API
微服务浪潮下的JSF革新:如何在分散式架构中构建统一而强大的Web界面
【8月更文挑战第31天】随着微服务架构的兴起,企业将应用拆分成小型、独立的服务以提高系统可维护性和可扩展性。本文探讨如何在微服务架构下构建和部署JavaServer Faces (JSF) 应用,通过RESTful服务实现前后端分离,提升灵活性和适应性。
68 1
|
5月前
|
前端开发 程序员
HTML+CSS+JavaScript制作动态七夕表白网页(含音乐+自定义文字)
一年一度的520情人节/七夕情人节/女朋友生日/程序员表白,是不是要给女朋友或者正在追求的妹子一点小惊喜呢,今天这篇博客就分享下前端代码如何实现HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)。赶紧学会了,来制作属于我们程序员的浪漫吧!
150 0
|
6月前
|
JavaScript NoSQL Serverless
函数计算产品使用问题之如何创建一个自定义运行时并指定Node.js版本
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
5月前
|
JavaScript 前端开发 数据安全/隐私保护
Vue.js 表单处理技巧大揭秘!v-model 与自定义验证综合运用,打造高效表单处理体验!
【8月更文挑战第31天】Vue.js 是一款备受欢迎的前端框架,其表单处理功能强大且灵活。v-model 指令可实现双向数据绑定,简化表单元素值与 Vue 实例数据的同步过程;结合自定义验证规则,则能确保用户输入数据符合特定要求。无论是简单的单字段校验还是复杂的多字段验证,Vue.js 均提供了简洁有效的解决方案,有效提升了表单处理效率及用户体验。通过综合运用 v-model 和自定义验证,开发者能够实时反馈错误信息并控制表单状态,从而增强应用的交互性与可靠性。
74 0
|
5月前
|
JavaScript PHP 开发者
PHP中的异常处理与自定义错误处理器构建高效Web应用:Node.js与Express框架实战指南
【8月更文挑战第27天】在PHP编程世界中,异常处理和错误管理是代码健壮性的关键。本文将深入探讨PHP的异常处理机制,并指导你如何创建自定义错误处理器,以便优雅地管理运行时错误。我们将一起学习如何使用try-catch块捕获异常,以及如何通过set_error_handler函数定制错误响应。准备好让你的代码变得更加可靠,同时提供更友好的错误信息给最终用户。
|
5月前
|
移动开发 前端开发 JavaScript
JavaScript 中的样式切换方法
JavaScript 中的样式切换方法
39 0