atitit.js javascript 調用c# java php後臺語言api html5交互的原理與總結p97javascript
1.1. Js交互 1html
1.2. 動態參數個數 2html5
1.3. 事件監聽 2java
1.4. 異常轉換 2web
2. dwrC.exec 3ajax
2.1. 支持 ajax 與browExt模式 支持反射,直接繼承調用後臺api 3json
2.2. sendNSCommand (nativeswing的實現) 3c#
2.3. --------nativeswing的實現 3api
3. (不經過反射)自定義方法的時候註冊js 事件後臺函數 4
Firefox與Chrome也提供了external對象,例如,他們都默認的實現了opensearch的兩個外部方法:
AddSearchProvider IsSearchProviderInstalled
Chrome下,能夠在控制檯輸入window.external看到。
Firefox默認提供的外部方法稍稍多一些,也能夠能夠經過firebug看到。
做者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
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);
}
本文提到的事件,能夠分爲三種類型,分別是表單提交、超連接跳轉、JavaScript 直接調用 BrowserFunction。其中 JavaScript 調用 BrowserFunction 因爲無需刷新頁面,能夠直接執行,所以無需對其進行特殊監聽。然而,Web 上最爲常見的表單提交和超連接跳轉,都須要刷新頁面,而刷新頁面時,則沒法調用 BrowserFunction。那麼如何對這些事件進行監聽成爲文章的一大難點。
Browser 提供了一個事件監聽機制,能夠爲 Browser 添加地址變動監聽器,也就是 LocationListener,這個接口有兩個方法
若是桌面模型下,通常能夠自動異常轉換。
Web模型下,通常須要異常序列化傳遞,而後本地轉換。
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);}
}
onclick="sendNSCommand('play','百度一下');"/
Window.external.對象就是咱們後臺的一個對象。。若是沒有定義,就是null
sendNSCommand('play',video);
ScriptEvent.ScriptEventDic.Add("play", delegate(IList<object> args) {
MessageBox.Show((string)args[0]);
return null;
});
// 修改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);
}
}
}
@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);
}
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);
}
}
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