将JavaScript匿名函数作为参数传递给WebView

时间:2012-01-09 19:52:21

标签: javascript android android-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);

这样可行,但如果用户想要传入匿名函数而不是普通的命名函数,我会陷入困境。即。

<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 个答案:

答案 0 :(得分: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);

现在你可以给它类似“function(message){alert(message);}”的东西,它会起作用。顺便让我让用户在这里运行任意代码我会非常小心。很难说没有看到更多,但这种事情可能会很容易暴露安全漏洞。

相关问题