在浏览器中展示页面;
http://192.168.1.100/1.htm为目标地址
1 browser.Navigate(new Uri("http://192.168.1.100/1.htm", UriKind.Absolute));
浏览器接受页面的值
在页面上放两个按钮
1 <input type="button" value="10086" onclick="window.external.notify('phone|10086')"/> 2 <input type="button" value="10086" onclick="window.external.notify('camera')"/>
给游览器注册ScriptNotify事件
1 private void browser_ScriptNotify(object sender, NotifyEventArgs e) 2 { 3 //MessageBox.Show(e.Value); 4 string[] strs = e.Value.Split('|'); 5 string cmd = strs[0]; 6 if (cmd == "phone") 7 { 8 string p1 = strs[1]; 9 PhoneCallTask pcTask = new PhoneCallTask(); 10 pcTask.PhoneNumber = p1; 11 pcTask.Show(); 12 } 13 else if (cmd == "camera") 14 { 15 CameraCaptureTask ccTask = new CameraCaptureTask(); 16 ccTask.Show(); 17 } 18 }
Notify是一个非常强大的功能;具体有什么用呢?比如我们的游览器可以调用手机的拍照功能,我们就可以提供一个平台,开放一些特有的功能,比如拍照,这样网页的开发人员或者客户就可以针对我们开放的一些功能进行轻松的调用(命令式编程)
浏览器还可以调用页面的Jscript方法,并且传参数!同时接受返回值,注意返回值必须是字符串。
给页面写下面这个方法,
1 <script type="text/javascript"> 2 3 function hello(arg1,arg2) 4 { 5 document.getElementById("btn1").value="thankyou!"+arg1+"爱上了"+arg2; 6 return document.getElementById("txt1").value; 7 8 } 9 10 </script>
给按钮注册点击事件
1 private void button3_Click(object sender, RoutedEventArgs e) 2 { 3 string str =(string) browser.InvokeScript("hello","jim","tom");//无参数的话就直接写方法名InvokeScript(“hello”) 4 MessageBox.Show(str); 5 }
上面可以直接调用页面里面已经有的方法,但是在浏览器访问的都是未知的页面,怎么能都知道页面里面有什么方法呢!比如游览器的后退功能。页面里面并没有提供给我们页面的后退功能,我们怎么实现呢?先看下面一段代码
1 <script type="text/javascript"> 2 function myexec() 3 { 4 execScript("document.getElementById('btn1').value='exec';"); 5 } 6 </script> 7 <input type="button" value="execScript" onclick="myexec()"/>
我们点击button按钮,发现通过execScript 我们执行了document.getElementById('btn1').value='exec';这段代码;
所以我们就可以这样写来达到我们浏览器的后退功能
执行页面的后退方法history.back()
1 browser.InvokeScript("execScript","history.back()");
但是我们要的不仅仅是调用页面里有的方法,我们希望能从页面拿到我们想要的信息!那么我们怎么给未知的页面注册一个方法,并且得到我们想要的返回值呢?
回个上面的例子 browser.InvokeScript("execScript","obj"); 我们发现obj是字符串
并且obj相当于内嵌到网页上,并执行!这个时候,我们设想可不可以页面传一个我们想要实现的方法,并且得到我们想要的返回值呢?答案是肯定的
1 错误的写法: 2 //string s=(string) browser.InvokeScript("execScript", "var t =document.title;return 'aaa'+t;");
1 //Guid生成一个方法名,避免和页面中的方法冲突 2 string funcName = "f"+Guid.NewGuid().ToString("N"); 3 //执行定义 4 browser.InvokeScript("execScript", "window." + funcName + "=function(){var t =document.title;return 'aaa'+t;}"); 5 string s = (string)browser.InvokeScript(funcName);//调用 6 browser.InvokeScript("execScript", "window."+funcName+"=null;");//销毁方法 7 MessageBox.Show(s);
这个时候我们就可以在页面上获取我们想要的值,比如标题return document.title
动态生成一个页面:
1 StringBuilder sb = new StringBuilder(); 2 sb.AppendLine("<html><head></head><body>"); 3 sb.AppendLine("当前时间:"+DateTime.Now.ToString()); 4 sb.AppendLine("</body></html>"); 5 6 string str = ConvertExtendedAscii(sb.ToString()); 7 browser.NavigateToString(str);
附加一个游览器中文转码的方法:
1 private static string ConvertExtendedAscii(string html) 2 { 3 StringBuilder sb = new StringBuilder(); 4 foreach (var c in html) 5 { 6 int charInt = Convert.ToInt32(c); 7 if (charInt > 127) 8 sb.AppendFormat("&#{0};", charInt); 9 else 10 sb.Append(c); 11 } 12 return sb.ToString(); 13 }