atitit.jsjavascript调用c#javaphp后台语言apihtml5交互的原理与总结p97
1.实现html5化界面的要解决的策略
1.1.Js交互
Firefox与Chrome也提供了external对象,例如,他们都默认的实现了opensearch的两个外部方法:AddSearchProviderIsSearchProviderInstalledChrome下,可以在控制台输入window.external看到。Firefox默认提供的外部方法稍稍多一些,也可以可以通过firebug看到。
作者::老哇的爪子Attilax艾龙,EMAIL:1466519819@
转载请注明来源:/attilax
1.2.动态参数个数
Java的是obj[]对象数组了。默认支持动态参数个数
C#的使用obj[]就不行兰..子能预保留
functionsendNSCommand()
{
//arguments
vars=(arguments);
varargsArray=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调用
publicvoidsendNSCommand(Objectmessage,Objectmessage2,Objectmessage3,Objectmessage4,Objectmessage5,Objectmessage6,Objectmessage7)
{
//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
functionbtn_click()
{
try{
varmp=$("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(IListargs){
MessageBox.Show((string)args[0]);
returnnull;
});
3.2.Java版
4.------------code
4.1.后台c#
//修改webbrowser的属性使c#可以调用js方法:
webbrowser.ObjectForScripting=newScriptEvent();
.attilax.ui
{
[System.Visible(true)]
publicclassScriptEvent
{
publicstaticDictionaryScriptEventDic=newDictionary();
publicdelegateObjectjavaEventHandler(IListargs);//第一步:定义委托类型
//供JS调用
publicvoidsendNSCommand(Objectmessage,Objectmessage2,Objectmessage3,Objectmessage4,Objectmessage5,Objectmessage6,Objectmessage7)
{
//Object[]objs=(Object[])message;
Console.WriteLine(message);
Stringmeth=(String)message;
IListli=newList();
li.Add(message2);
li.Add(message3);li.Add(message4);li.Add(message5);li.Add(message6);li.Add(message7);
javaEventHandlerhdl=ScriptEventDic[meth];
hdl(li);
}
}
}
4.2.通过反射调用java
@Override
publicObjectfunction(Object[]arg0){
//logger.debug("ImageSelect");
Stringmeth=arg0[0].toString();
Listli=newArrayList();
for(inti=1;i
li.add(arg0[i]);
}
Objectobject=eventMap.get(meth);
//p93refinvokso..shouldprocessallinone.includecallback
if(object==null){
Stringclassname=refx.getClassName(meth);
Stringmeth_name=refx.getMethodName(meth);
Objecto;
try{
o=ConstructorUtils.invokeConstructor(
Class.forName(classname),null);
Object[]oa=getParams(li);
Objectrzt=MethodUtils.invokeMethod(o,meth_name,oa);
StringcallbackHandle=(String)li.get(li.size()-1);
if(rztinstanceofString){//simpleobjstr,num
Stringjs2=callbackHandle+"('"+rzt+"');";
booleanr=this.brow.execute(js2);
System.out.println(r);
}else{//plexobj
Stringjs2=callbackHandle+"('"+core.toJsonStrO88(rzt)
+"');";
this.brow.execute(js2);
}
returnrzt;
}catch(Exceptione){
Stringparams_urlparams_fmt=(String)li.get(0);
Mapmp=newParamX().urlParams2Map(params_urlparams_fmt);
StringexSerialFmt=(String)mp.get("$exSerialFmt");
if(exSerialFmt.equals("json"))
returncore.toJsonStrO88(e);
throwExceptionUtil.convertToRuntimeEx4throwEx(e);
}
}
//def
Closureevet=(Closure)object;
try{
returnevet.execute(li);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnsuper.function(arg0);
}
4.3.Dwrc
vardwrC={};
dwrC.exec=function(param,callback,approot)
{
try{
param.rdmStr=Math.random();
}catch(e){
param=param+"&rdmStr2="+Math.random();
}
//p93
if(callback==undefined)
{
varjson=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!="")//webenvi
$.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=="")//csenvi
{
varjson=urlParams2json(param);
varmeth=json.method;
if(json.method==null)//orundefinedundefinedgenggenullshyyeod.
meth=json.$method;
//(meth,param1,,param2,param3,callback);
window.setTimeout(function(){
sendNSCommand(meth,param,callback);
},50);
}
}
5.参考
Winform控件WebBrowser与JS脚本交互-冰鱼-博客园
atitit.javascript调用javainswtattilax总结-attilax的专栏-博客频道-.html
WPF的WebBrowser里面使用JavaScript调用外部方法的决解方法-LonelyBandit-博客园.html
[转]JS调用WPF代码执行了QueryInterface调用请求提供COM可见的托管类JavaScript调WinFrom_最黑de四季_新浪博客.html
Winform控件WebBrowser与JS脚本交互-冰鱼-博客园.html
atitit.js与c#java交互html5化的原理与总结.doc-attilax的专栏-博客频道-.htm