簡體   English   中英

將JavaScript匿名函數作為參數傳遞給WebView

[英]Passing JavaScript anonymous function as parameter to WebView

我有一個Native應用程序,里面有一個WebView。 我在WebView中添加了一個類,以便能夠從JavaScript中調用它,如下所示:

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);

這是有效的,但如果用戶想要傳入匿名函數而不是普通的命名函數,我會陷入困境。 IE

<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未定義。

有關正確方法的任何想法,因為我覺得我迷路了嗎?

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

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);

現在你可以給它類似“function(message){alert(message);}”的東西,它會起作用。 順便讓我讓用戶在這里運行任意代碼我會非常小心。 很難說沒有看到更多,但這種事情可能很容易暴露安全漏洞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM