2012-01-09 130 views
3

我有一個本機應用程序,它有一個WebView。 我一個類添加到網頁視圖,以便能夠從JavaScript調用它像這樣:將JavaScript匿名函數作爲參數傳遞給WebView

webView.addJavascriptInterface(new JavascriptInterface(webView, handler), "Android.JSI"); 

我再從JavaScript調用的JavaScriptInterface類。我的HTML/JavaScript的樣子:

<input type="button" value="Sleep Alert" onclick="sleepAlert(sleepAlertCallbackSuccess, sleepAlertCallbackFail, 'Hi Sleep Alert');" /> 

function sleepAlert(callBackSuccess, callBackFailure, message) 
{      
    window.Android.JSI.sleepAlert(callBackSuccess.name, callBackFailure.name, message); 
} 

function sleepAlertCallbackSuccess(message) 
{ 
    alert("success: " + message); 
} 

function sleepAlertCallbackFail(message) 
{ 
    alert("fail: " + message); 
} 

我然後回調到JavaScript的,像這樣:

js = "javascript:" + callbackSuccess + "('" + message + "')"; 
webView.loadUrl(js); 

這工作,但如果用戶希望在一個匿名函數來傳遞我有點憋屈而不是一個正常的命名函數。 I.E.

<input type="button" value="Anonymous call back" onclick="sleepAlert(function(message) { alert(message); }, sleepAlertCallbackFail, 'anonymous sleep alert');" /> 

當我通過這在我的Java類

public void sleepAlert(final String callbackSuccess, String callbackFail, final String message) 

它說的CallbackSuccess是不確定的。

正確的方式做任何想法,因爲我覺得我迷路了錯誤的方式嗎?

回答

1

將其設置爲變量。你可以這樣做:

var a = <whatever>; a(message); 

那麼,如果它是,它會解決的方法:

var a = sleepAlertCallbackSuccess; a(message); 

,或者如果它是匿名:

var a = function(message) { ... }; a(message); 

既然你路過它地址欄,你必須對它進行URI編碼等等,但這種方法應該可行。

更新:

這裏的東西像什麼,我的意思是:

js = "javascript: var a=" + callbackSuccess + ";a(message);"; 
String url = "javascript:" + Uri.encode(js); 
webView.loadUrl(url); 

現在,你可以把它像 「功能(消息){警報(消息);}」,它會工作。順便讓用戶在這裏運行任意代碼,我會非常小心。很難說沒有看到更多,但這種事情可能很容易暴露安全漏洞。

+0

不知道我得到它。回調已經是sleepAlert中的變量了嗎? – 2012-01-09 20:48:46

+0

更新後給你舉例 – kabuko 2012-01-09 21:10:45

+0

工作得很好。萬分感謝! – 2012-01-09 21:42:17

相關問題