atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
2.1. 支持 ajax 与browExt模式 支持反射,直接继承调用后台api 3
2.2. sendNSCommand (nativeswing的实现) 3
3. (不通过反射)自定义方法的时候注册js 事件后台函数 4
1. 实现html5化界面的要解决的策略
1.1. Js交互
Firefox与Chrome也提供了external对象,例如,他们都默认的实现了opensearch的两个外部方法:
AddSearchProvider IsSearchProviderInstalled
Chrome下,可以在控制台输入window.external看到。
Firefox默认提供的外部方法稍稍多一些,也可以可以通过firebug看到。
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
1.2. 动态参数个数
Java的是obj[] 对象数组了。默认支持动态参数个数
C#的使用obj[]就不行兰..子能预保留
function sendNSCommand()
{
//arguments
var s=(arguments);
var argsArray = Array.prototype.slice.call(arguments);
window.external.sendNSCommand(argsArray[0],argsArray[1],argsArray[2],argsArray[4],argsArray[5],argsArray[6],argsArray[7]);
alert(window.external);
}
//供JS调用
public void sendNSCommand(Object message, Object message2, Object message3, Object message4, Object message5, Object message6, Object message7)
{
// Object[] objs = (Object[])message;
Console.WriteLine(message);
}
1.3. 事件监听
本文提到的事件,可以分为三种类型,分别是表单提交、超链接跳转、JavaScript 直接调用 BrowserFunction。其中 JavaScript 调用 BrowserFunction 由于无需刷新页面,可以直接执行,因此无需对其进行特殊监听。然而,Web 上最为常见的表单提交和超链接跳转,都需要刷新页面,而刷新页面时,则无法调用 BrowserFunction。那么如何对这些事件进行监听成为文章的一大难点。
Browser 提供了一个事件监听机制,可以为 Browser 添加地址变更监听器,也就是 LocationListener,这个接口有两个方法
1.4. 异常转换
如果桌面模型下,一般可以自动异常转换。
Web模型下,一般需要异常序列化传递,然后本地转换。
2. dwrC.exec
2.1. 支持 ajax 与browExt模式 支持反射,直接继承调用后台api
function btn_click()
{
try{
var mp=$("form").serialize();
mp= "&$method=com.attilax.license.LicenseX.calcSn&$exSerialFmt=json..&$callback=callback&machi_code="+$("#machi_code").val();
dwrC.exec(mp);
}catch(e)
{
showErr(e);}
}
2.2. sendNSCommand (nativeswing的实现)
οnclick="sendNSCommand('play','百度一下');"/
Window.external.对象就是我们后台的一个对象。。如果没有定义,就是null
2.3. --------nativeswing的实现
sendNSCommand('play',video);
2.4. C# swt都是自定义
3. (不通过反射)自定义方法的时候注册js 事件后台函数
3.1. C#版本
ScriptEvent.ScriptEventDic.Add("play", delegate(IList<object> args) {
MessageBox.Show((string)args[0]);
return null;
});
3.2. Java版
4. ------------code
4.1. 后台c#
// 修改webbrowser的属性使c#可以调用js方法:
webbrowser.ObjectForScripting = new ScriptEvent();
namespace ClassLibrary1.com.attilax.ui
{
[System.Runtime.InteropServices.ComVisible(true)]
public class ScriptEvent
{
public static Dictionary<String, javaEventHandler> ScriptEventDic = new Dictionary<string, javaEventHandler>();
public delegate Object javaEventHandler(IList<Object> args);//第一步:定义委托类型
//供JS调用
public void sendNSCommand(Object message, Object message2, Object message3, Object message4, Object message5, Object message6, Object message7)
{
// Object[] objs = (Object[])message;
Console.WriteLine(message);
String meth =(String) message;
IList<Object> li = new List<Object>();
li.Add(message2);
li.Add(message3); li.Add(message4); li.Add(message5); li.Add(message6); li.Add(message7);
javaEventHandler hdl = ScriptEventDic[meth];
hdl(li);
}
}
}
4.2. 通过反射调用java
@Override
public Object function(Object[] arg0) {
// logger.debug("ImageSelect");
String meth = arg0[0].toString();
List li = new ArrayList();
for (int i = 1; i < arg0.length; i++) {
li.add(arg0[i]);
}
Object object = eventMap.get(meth);
// p93 ref invok so ..should process all in one .include callback
if (object == null) {
String classname = refx.getClassName(meth);
String meth_name = refx.getMethodName(meth);
Object o;
try {
o = ConstructorUtils.invokeConstructor(
Class.forName(classname), null);
Object[] oa = getParams(li);
Object rzt = MethodUtils.invokeMethod(o, meth_name, oa);
String callbackHandle = (String) li.get(li.size() - 1);
if (rzt instanceof String) { // simple obj str,num
String js2 = callbackHandle + "('" + rzt + "');";
boolean r = this.brow.execute(js2);
System.out.println(r);
} else { // plex obj
String js2 = callbackHandle + "('" + core.toJsonStrO88(rzt)
+ "');";
this.brow.execute(js2);
}
return rzt;
} catch (Exception e) {
String params_urlparams_fmt = (String) li.get(0);
Map mp = new ParamX().urlParams2Map(params_urlparams_fmt);
String exSerialFmt = (String) mp.get("$exSerialFmt");
if (exSerialFmt.equals("json"))
return core.toJsonStrO88(e);
throw ExceptionUtil.convertToRuntimeEx4throwEx(e);
}
}
// def
Closure evet = (Closure) object;
try {
return evet.execute(li);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return super.function(arg0);
}
4.3. Dwrc
var dwrC={};
dwrC.exec=function(param,callback,approot)
{
try{
param.rdmStr=Math.random();
}catch(e){
param=param+"&rdmStr2="+Math.random();
}
//p93
if(callback==undefined)
{
var json=urlParams2json(param);
callback=json.$callback;
}
//
if( isExitsFunction("submit_befor_check"))
submit_befor_check();
//$iocx="aa";
$iocx_iner="";
if(isExitsVariable("$iocx"))
$iocx_iner=$iocx;
//jQuery.get("dwr.php?param="+param, [data], [callback])
if(window.location.host!="") //web envi
$.ajax(
{
type: "get",
url: approot+"/com.attilax/dwr.php?iocx="+$iocx_iner,
data:param,
dataType: "text",
success: function(data) {
// $("#divShow").html(data);
data=$.trim(data);
callback(data);
}
});
//-------------------
if( window.location.host=="") //cs envi
{
var json=urlParams2json(param);
var meth=json.method;
if(json.method==null) //or undefined undefined gengge null sh yyeod .
meth=json.$method;
// (meth,param1,,param2,param3,callback);
window.setTimeout(function(){
sendNSCommand(meth,param,callback);
},50);
}
}
5. 参考
Winform控件WebBrowser与JS脚本交互 - 冰 鱼 - 博客园
atitit.javascript调用java in swt attilax 总结 - attilax的专栏 - 博客频道 - CSDN.NET.html
WPF的WebBrowser 里面使用JavaScript调用外部方法的决解方法 - Lonely Bandit - 博客园.html
[转]JS调用WPF代码 执行了QueryInterface调用 请求提供COM可见的托管类 JavaScript调WinFrom_最黑de四季_新浪博客.html
Winform控件WebBrowser与JS脚本交互 - 冰 鱼 - 博客园.html
atitit.js 与c# java交互html5化的原理与总结.doc - attilax的专栏 - 博客频道 - CSDN.NET.htm