稳扎稳打Silverlight(27) - 2.0网页之可脚本化, 与DOM的交互, 与JavaScript的交互

简介:


[索引页]

[源码下载]


稳扎稳打Silverlight(27) - 2.0网页之可脚本化, 与DOM的交互, 与JavaScript的交互


作者: webabcd


介绍
Silverlight 2.0 使用c#开发可脚本化的代码,Silverlight与宿主页面的DOM之间的交互,Silverlight与宿主页面的JavaScript之间的交互
    ScriptableMemberAttribute - 需要脚本化的属性、方法、事件要标记为此
    HtmlPage.RegisterScriptableObject - 将可脚本化对象注册到客户端
    HtmlElement -  表示网页的文档对象模型 (DOM) 中的 HTML 元素
    HtmlWindow - 提供 JavaScript 的 window 对象的 Silverlight 端的托管表示形式


在线DEMO
http://webabcd.blog.51cto.com/1787395/342779


示例
1、Silverlight对可脚本化的支持
Scriptable.cs
InBlock.gif using System; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Ink; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif using System.Windows.Browser; 
InBlock.gif 
InBlock.gif namespace Silverlight20.WebPage 
InBlock.gif
InBlock.gif         /* 
InBlock.gif         * 脚本化的类必须是 public 的 
InBlock.gif         * 需要脚本化的属性、方法、事件要标记为 [ScriptableMember] 
InBlock.gif         * 如果类被标记为 [ScriptableType],则意味着其属性、方法、事件都是ScriptableMemberAttribute 
InBlock.gif         */
 
InBlock.gif 
InBlock.gif         /// <summary> 
InBlock.gif         /// 用于演示脚本化的类 
InBlock.gif         /// </summary> 
InBlock.gif         // [ScriptableType] 
InBlock.gif         public  class Scriptable 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 当前服务端的时间 
InBlock.gif                 /// </summary> 
InBlock.gif                [ScriptableMember] 
InBlock.gif                 public DateTime CurrentTime { get; set; } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Hello 方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="name">名字</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                [ScriptableMember] 
InBlock.gif                 public  string Hello( string name) 
InBlock.gif                { 
InBlock.gif                         return  string.Format( "Hello: {0}", name); 
InBlock.gif                } 
InBlock.gif                 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 开始事件 
InBlock.gif                 /// </summary> 
InBlock.gif                [ScriptableMember] 
InBlock.gif                 public  event EventHandler<StartEventArgs> Start; 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 触发开始事件所调用的方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="dt"></param> 
InBlock.gif                 public  void OnStart(DateTime dt) 
InBlock.gif                { 
InBlock.gif                         if (Start !=  null
InBlock.gif                        { 
InBlock.gif                                Start( thisnew StartEventArgs() 
InBlock.gif                                { 
InBlock.gif                                        CurrentTime = dt 
InBlock.gif                                }); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         /// <summary> 
InBlock.gif         /// 开始事件的 EventArgs 
InBlock.gif         /// </summary> 
InBlock.gif         public  class StartEventArgs : EventArgs 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 当前服务端的时间 
InBlock.gif                 /// </summary> 
InBlock.gif                [ScriptableMember] 
InBlock.gif                 public DateTime CurrentTime { get; set; } 
InBlock.gif        } 
InBlock.gif}
 
ScriptableDemo.xaml.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif using System.Windows.Browser; 
InBlock.gif 
InBlock.gif namespace Silverlight20.WebPage 
InBlock.gif
InBlock.gif         public partial  class ScriptableDemo : UserControl 
InBlock.gif        { 
InBlock.gif                System.Threading.Timer _timer; 
InBlock.gif                System.Threading.SynchronizationContext _syncContext; 
InBlock.gif 
InBlock.gif                 public ScriptableDemo() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                         this.Loaded +=  new RoutedEventHandler(ScriptableDemo_Loaded); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void ScriptableDemo_Loaded( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // UI 线程 
InBlock.gif                        _syncContext = System.Threading.SynchronizationContext.Current; 
InBlock.gif 
InBlock.gif                        Scriptable s =  new Scriptable() { CurrentTime = DateTime.Now }; 
InBlock.gif 
InBlock.gif                         // 将 Scriptable 对象注册到客户端中,所对应的客户端的对象名为 scriptable 
InBlock.gif                        HtmlPage.RegisterScriptableObject( "scriptable", s); 
InBlock.gif 
InBlock.gif                        _timer =  new System.Threading.Timer(MyTimerCallback, s, 0, 1000); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void MyTimerCallback( object state) 
InBlock.gif                { 
InBlock.gif                        Scriptable s = state  as Scriptable; 
InBlock.gif 
InBlock.gif                         // 每秒调用一次 UI 线程上的指定的方法 
InBlock.gif                        _syncContext.Post(OnStart, s); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void OnStart( object state) 
InBlock.gif                { 
InBlock.gif                        Scriptable s = state  as Scriptable; 
InBlock.gif 
InBlock.gif                         // 调用 Scriptable 对象的 OnStart() 方法,以触发 Start 事件 
InBlock.gif                        s.OnStart(DateTime.Now); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
ScriptableDemo.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 > 
         < title >Silverlight20 </title> 
         < style  type ="text/css" > 
                html, body 
                { 
                        height: 100%; 
                        overflow: auto; 
                } 
                body 
                { 
                        padding: 0; 
                        margin: 0; 
                } 
                #silverlightControlHost 
                { 
                        height: 100%; 
                } 
         </style> 

         < script  type ="text/javascript"  src ="../Silverlight.js" > </script> 

         < script  type ="text/javascript" > 
                function scriptableDemo() { 

                        // scriptable - Silverlight 注册到客户端的对象 
                        var obj = document.getElementById("xaml1").content.scriptable; 
                        var output = document.getElementById('result'); 

                        output.innerHTML += obj.CurrentTime 
                        output.innerHTML += ' < br  />'; 

                        output.innerHTML += obj.Hello("webabcd"); 
                        output.innerHTML += ' < br  />'; 

                        // obj.Start = responseStart; 
                        // addEventListener - 添加事件监听器 
                        // removeEventListener - 移除事件监听器 
                        obj.addEventListener("Start", responseStart); 
                } 

                function responseStart(sender, args) { 
                        document.getElementById('result').innerHTML += args.CurrentTime; 
                        document.getElementById('result').innerHTML += ' < br  />'; 
                } 
         </script> 

</head> 
< body > 
         < div  style ="font-size: 12px"  id ="result" > 
         </div> 
         < div  style ="font-size: 12px"  onclick ="scriptableDemo();" > 
                加载了 Silverlight20.WebPage.ScriptableDemo 后,单击这里以测试 Silverlight 对可脚本化的支持 </div> 
         < div  id ="silverlightControlHost" > 
                <object id="xaml1" data="data:application/x-silverlight-2," type="application/x-silverlight-2" 
                        width="100%" height="100%"> 
                         < param  name ="source"  value ="../ClientBin/Silverlight20.xap"  /> 
                         < param  name ="EnableHtmlAccess"  value ="true"  /> 
                 </object> 
                 < iframe  style ='visibility: hidden; height: 0; width: 0; border: 0px' > </iframe> 
         </div> 
</body> 
</html>
 
 
2、Silverlight与网页的DOM之间的交互
DOMDemo.xaml
<UserControl x:Class="Silverlight20.WebPage.DOMDemo" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Margin="5"> 

                <TextBox x:Name="txtMsg" /> 
                 
        </StackPanel> 
</UserControl>
 
DOMDemo.xaml.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif using System.Windows.Browser; 
InBlock.gif 
InBlock.gif namespace Silverlight20.WebPage 
InBlock.gif
InBlock.gif         public partial  class DOMDemo : UserControl 
InBlock.gif        { 
InBlock.gif                 public DOMDemo() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                        Demo(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void Demo() 
InBlock.gif                { 
InBlock.gif                         // 获取当前页面的 id 为 hello 的DOM,并设置其样式 
InBlock.gif                        HtmlElement container = HtmlPage.Document.GetElementById( "hello"); 
InBlock.gif                        container.SetStyleAttribute( "display""block"); 
InBlock.gif 
InBlock.gif                         // 创建一个 ul    
InBlock.gif                        HtmlElement ul = HtmlPage.Document.CreateElement( "ul"); 
InBlock.gif 
InBlock.gif                         for ( int i = 0; i < 10; i++) 
InBlock.gif                        { 
InBlock.gif                                 // 创建一个 li ,并设置其显示的内容 
InBlock.gif                                HtmlElement li = HtmlPage.Document.CreateElement( "li"); 
InBlock.gif                                li.SetAttribute( "innerText""hi: DOM"); 
InBlock.gif 
InBlock.gif                                 // 将 li 添加到 ul 内 
InBlock.gif                                ul.AppendChild(li); 
InBlock.gif                        } 
InBlock.gif 
InBlock.gif                         // 将 ul 添加到 id 为 hello 的 DOM 内 
InBlock.gif                        container.AppendChild(ul); 
InBlock.gif 
InBlock.gif 
InBlock.gif                         // 创建一个页面的 button ,并设置其 value 属性和 onclick 事件 
InBlock.gif                        HtmlElement button = HtmlPage.Document.CreateElement( "button"); 
InBlock.gif                        button.SetProperty( "value""hi: Silverlight"); 
InBlock.gif                        button.AttachEvent( "onclick"new EventHandler<HtmlEventArgs>(HelloClick)); 
InBlock.gif 
InBlock.gif                         // 将 button 添加到 id 为 hello 的 DOM 内 
InBlock.gif                        container.AppendChild(button); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void HelloClick( object sender, HtmlEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // 页面的 button 单击后所需执行的逻辑 
InBlock.gif                        txtMsg.Text +=  "hi: Silverlight\r\n"
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
DOMDemo.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 > 
         < title >Silverlight20 </title> 
         < style  type ="text/css" > 
                html, body 
                { 
                        height: 100%; 
                        overflow: auto; 
                } 
                body 
                { 
                        padding: 0; 
                        margin: 0; 
                } 
                #silverlightControlHost 
                { 
                        height: 100%; 
                } 
         </style> 

         < script  type ="text/javascript"  src ="../Silverlight.js" > </script> 

</head> 
< body > 
         <! --由 Silverlight 控制此 id 为 hello 的 DOM-- > 
         < div  style ="font-size: 12px; display: none"  id ="hello" > 
         </div> 
         < div  style ="font-size: 12px" > 
                加载 Silverlight20.WebPage.DOMDemo 后,测试 Silverlight 和页面 DOM 的交互 </div> 
         < div  id ="silverlightControlHost" > 
                <object id="xaml1" data="data:application/x-silverlight-2," type="application/x-silverlight-2" 
                        width="100%" height="100%"> 
                         < param  name ="source"  value ="../ClientBin/Silverlight20.xap"  /> 
                         < param  name ="EnableHtmlAccess"  value ="true"  /> 
                 </object> 
                 < iframe  style ='visibility: hidden; height: 0; width: 0; border: 0px' > </iframe> 
         </div> 
</body> 
</html> 
 
 
3、Silverlight与网页的JavaScript之间的交互
JSDemo.xaml
<UserControl x:Class="Silverlight20.WebPage.JSDemo" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Margin="5"> 

                <Button Margin="5" x:Name="invokeJS" Content="调用JavaScript" Click="invokeJS_Click" /> 
                 
                <TextBox Margin="5" x:Name="txtMsg" /> 

        </StackPanel> 
</UserControl>
 
JSDemo.xaml.cs
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Net; 
InBlock.gif using System.Windows; 
InBlock.gif using System.Windows.Controls; 
InBlock.gif using System.Windows.Documents; 
InBlock.gif using System.Windows.Input; 
InBlock.gif using System.Windows.Media; 
InBlock.gif using System.Windows.Media.Animation; 
InBlock.gif using System.Windows.Shapes; 
InBlock.gif 
InBlock.gif using System.Windows.Browser; 
InBlock.gif 
InBlock.gif namespace Silverlight20.WebPage 
InBlock.gif
InBlock.gif         public partial  class JSDemo : UserControl 
InBlock.gif        { 
InBlock.gif                 public JSDemo() 
InBlock.gif                { 
InBlock.gif                        InitializeComponent(); 
InBlock.gif 
InBlock.gif                         this.Loaded +=  new RoutedEventHandler(JSDemo_Loaded); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  void invokeJS_Click( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                         // 调用页面的 JavaScript 方法 
InBlock.gif                        HtmlPage.Window.Invoke( "silverlightInvokeJS""webabcd"); 
InBlock.gif 
InBlock.gif                         // 执行任意 JavaScript 语句 
InBlock.gif                        HtmlPage.Window.Eval( "silverlightInvokeJS('webabcd2')"); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 void JSDemo_Loaded( object sender, RoutedEventArgs e) 
InBlock.gif                { 
InBlock.gif                        HtmlPage.Document.GetElementById( "btnHello").SetStyleAttribute( "display""inline"); 
InBlock.gif 
InBlock.gif                         // 将此对象注册到客户端中,所对应的客户端的对象名为 silverlightObject 
InBlock.gif                        HtmlPage.RegisterScriptableObject( "silverlightObject"this); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Hello 方法 
InBlock.gif                 /// 暴露给页面的方法,调用后在 Silverlight 中显示结果 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="name">名字</param> 
InBlock.gif                [ScriptableMember]  // 脚本化此方法 
InBlock.gif                 public  void hello( string name) 
InBlock.gif                { 
InBlock.gif                        txtMsg.Text +=  string.Format( "Hello: {0}\r\n", name); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
JSDemo.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 > 
         < title >Silverlight20 </title> 
         < style  type ="text/css" > 
                html, body 
                { 
                        height: 100%; 
                        overflow: auto; 
                } 
                body 
                { 
                        padding: 0; 
                        margin: 0; 
                } 
                #silverlightControlHost 
                { 
                        height: 100%; 
                } 
         </style> 

         < script  type ="text/javascript"  src ="../Silverlight.js" > </script> 

         < script  type ="text/javascript" > 
                function silverlightInvokeJS(name) { 
                        // Silverlight 调用 JavaScript 方法,在页面上显示结果 
                        document.getElementById('result').innerHTML += "hello: " + name + " < br  />"; 
                } 

                function jsInvokeSilverlight(name) { 
                        // JavaScript 调用 Silverlight 方法,在 Silverlight 上显示结果 
                        var obj = document.getElementById("xaml1").content.silverlightObject; 
                        obj.hello(name); 
                } 
         </script> 

</head> 
< body > 
         < div  style ="font-size: 12px"  id ="result" > 
         </div> 
         < div  style ="font-size: 12px" > 
                加载 Silverlight20.WebPage.JSDemo 后,测试 Silverlight 和页面 JavaScript 的交互   
                <input type="button" id="btnHello" value="HelloSilverlight" 
                        style="display: none" /> 
         </div> 
         < div  id ="silverlightControlHost" > 
                <object id="xaml1" data="data:application/x-silverlight-2," type="application/x-silverlight-2" 
                        width="100%" height="100%"> 
                         < param  name ="source"  value ="../ClientBin/Silverlight20.xap"  /> 
                         < param  name ="EnableHtmlAccess"  value ="true"  /> 
                 </object> 
                 < iframe  style ='visibility: hidden; height: 0; width: 0; border: 0px' > </iframe> 
         </div> 
</body> 
</html>
 
 
 


     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/343915 ,如需转载请自行联系原作者
相关文章
|
3天前
|
缓存 JavaScript 前端开发
【JavaScript 技术专栏】DOM 操作全攻略:从基础到进阶
【4月更文挑战第30天】本文深入讲解JavaScript与DOM交互,涵盖DOM基础、获取/修改元素、创建/删除元素、事件处理结合及性能优化。通过学习,开发者能掌握动态改变网页内容、结构和样式的技能,实现更丰富的交互体验。文中还讨论了DOM操作在实际案例、与其他前端技术结合的应用,助你提升前端开发能力。
|
3天前
|
前端开发 JavaScript
结合CSS和JavaScript创建动态网页
【4月更文挑战第21天】结合CSS和JavaScript创建动态网页
19 4
|
2天前
|
前端开发 JavaScript UED
CSS顶部与JS后写:网页渲染的奥秘
CSS顶部与JS后写:网页渲染的奥秘
|
2天前
|
前端开发 JavaScript UED
深入理解 JavaScript 同步和异步,让网页灵动起来!
深入理解 JavaScript 同步和异步,让网页灵动起来!
|
3天前
|
JavaScript 前端开发
Playwright执行 JavaScript 脚本:探索浏览器自动化的新境界
在Web自动化中,Playwright提供`page.evaluate()`和`page.evaluate_handle()`来执行JavaScript脚本。`page.evaluate()`返回脚本执行结果,而`page.evaluate_handle()`返回JSHandle。示例展示了如何使用它们,如打印网页标题、操作元素及获取页面内容。通过这些方法,可以处理常规方法难以操作的网页元素。
10 2
|
3天前
|
JavaScript 前端开发 NoSQL
【MongoDB 专栏】MongoDB 的 JavaScript 引擎与脚本执行
【5月更文挑战第11天】MongoDB 的 JavaScript 引擎允许在服务器端直接执行脚本,提升效率并实现定制化操作。脚本环境提供独立但与数据库关联的运行空间,引擎负责脚本的解析、编译和执行。执行过程包括脚本提交、解析、编译和执行四个步骤。掌握脚本逻辑设计和 JavaScript 语言特性对于高效利用这一功能至关重要。例如,通过脚本可以计算商品总销售额,增强数据库操作的灵活性。
【MongoDB 专栏】MongoDB 的 JavaScript 引擎与脚本执行
|
3天前
|
JavaScript 前端开发
JavaScript 提供了多种方法来操作 DOM(文档对象模型)
【5月更文挑战第11天】JavaScript 用于DOM操作的方法包括获取元素(getElementById, getElementsByClassName等)、修改内容(innerHTML, innerText, textContent)、改变属性、添加/删除元素(appendChild, removeChild)和调整样式。此外,addEventListener用于监听事件。注意要考虑兼容性和性能当使用这些技术。
9 2
|
3天前
|
JavaScript 前端开发
JS实现网页页面的框架(demo)
JS实现网页页面的框架(demo)
10 1
|
3天前
|
JavaScript 前端开发 安全
javascript操作DOM的方法
javascript操作DOM的方法
14 0
|
3天前
|
JavaScript 前端开发 容器
js操作dom元素
js操作dom元素
16 0