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

发布于 2024-12-25 22:42:51 字数 1360 浏览 2 评论 0原文

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

它说回调成功未定义。

当我觉得我迷路了时,有什么正确的方法可以做到这一点吗?

I have a Native application, which has a WebView in it.
I add a class to the WebView to be able to call it from JavaScript like so:

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

I then call the JavaScriptInterface class from JavaScript. My HTML/JavaScript looks like:

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

I then callback into the JavaScript like so:

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

This works, but I am kind of stuck on if the user wants to pass in an anonymous function instead of a normal named function. I.E.

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

When I pass this in to my Java class

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

It says callbackSuccess is undefined.

Any ideas on the proper way to do this as I feel im getting lost going the wrong way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独留℉清风醉 2025-01-01 22:42:51

将其设置为变量。你可以这样做:

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

Set it to a variable. You can do something like:

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

Then if it's a method it'll resolve to:

var a = sleepAlertCallbackSuccess; a(message);

or if it's anonymous:

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

Since you're passing it in the location bar, you'll have to URI encode it, etc. but the approach should work.

Update:

Here's something like what I mean:

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

Now you can give it something like "function(message) { alert(message); }" and it'll work. I'd be pretty careful about letting the user run arbitrary code here by the way. Hard to say without seeing more, but this kind of thing can risk exposing security holes fairly easily.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文