atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
atitit.js?javascript?調用c#?java?php后臺語言api?html5交互的原理與總結p97
?
?
1.?實現html5化界面的要解決的策略1
1.1.?Js交互1
1.2.?動態參數個數2
1.3.?事件監聽2
1.4.?異常轉換2
2.?dwrC.exec3
2.1.?支持?ajax?與browExt模式??支持反射,直接繼承調用后臺api3
2.2.?sendNSCommand?(nativeswing的實現)3
2.3.?--------nativeswing的實現3
2.4.?C#?swt都是自定義3
3.?(不通過反射)自定義方法的時候注冊js?事件后臺函數4
3.1.?C#版本4
3.2.?Java版4
4.?------------code4
4.1.?后臺c#4
4.2.?通過反射調用java5
4.3.?Dwrc7
5.?參考8
?
1.?實現html5化界面的要解決的策略
1.1.?Js交互
Firefox與Chrome也提供了external對象,例如,他們都默認的實現了opensearch的兩個外部方法:
AddSearchProvider?IsSearchProviderInstalled
Chrome下,可以在控制臺輸入window.external看到。
Firefox默認提供的外部方法稍稍多一些,也可以可以通過firebug看到。
?
作者::?老哇的爪子?Attilax?艾龍,??EMAIL:1466519819@qq.com
轉載請注明來源:?http://www.cnblogs.com/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
轉載于:https://www.cnblogs.com/attilax/p/4789546.html
總結
以上是生活随笔為你收集整理的atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#学习笔记--详解委托,事件与回调函数
- 下一篇: Android实例-MotionSens