【问题标题】:Passing JavaScript anonymous function as parameter to WebView将 JavaScript 匿名函数作为参数传递给 WebView
【发布时间】:2012-01-09 19:52:20
【问题描述】:

我有一个本机应用程序,其中有一个 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 未定义。

当我觉得我走错了路时,有什么正确的方法吗?

【问题讨论】:

    标签: javascript android android-webview


    【解决方案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); }”的东西,它会起作用的。顺便说一句,我会非常小心地让用户在这里运行任意代码。很难说没有看到更多,但这种事情很容易暴露安全漏洞。

    【讨论】:

    • 不确定我明白了。回调已经是 sleepAlert 中的变量了吗?
    • 更新给你一个例子
    • @GregRandall 传递给 Java 的回调函数字符串始终为“未定义”。你遇到过这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2019-11-23
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多