【问题标题】:Android WebView - detect whether a JS function is definedAndroid WebView - 检测是否定义了JS函数
【发布时间】:2012-04-09 08:17:00
【问题描述】:

我正在编写一个在 Android 上的 WebView 下运行的 HTML/JS 应用程序。在某些情况下,可能无法加载包含该应用程序的页面,或者可能是另一个页面(例如 404 页面或类似页面)。一般来说,我需要在应用程序页面上运行一组 JS 函数,或者在应用程序页面没有加载的情况下执行另一组操作。

我试图通过检测适当的 JS 是否可用来检测是否已加载正确的页面,但我似乎找不到任何同步的方法 - 只能通过调用 JS 函数并期望通过回调JavasctiptInterface。虽然这种方法是可行的,但我想知道是否有更好、更优雅、更可靠的方法来实现这一点。

我当然不能通过分析页面的 URL 来做到这一点 - 它可能是正确的,但内容有误。

有什么想法吗?

【问题讨论】:

  • 为什么你认为回调不是“优雅可靠的方式”?
  • '因为我希望开发平台能够提供直接通信接口,而不是调用javascript:... 协议——这就是你 6-7 年前在 IE 上所做的事情。老实说,我希望 Android 能够提供更直接的工具来做一些像调用 JS 方法这样微不足道的事情,但到目前为止,我的搜索一直很不走运,但我想也许我找错了地方——因此是这个问题。
  • 从 "javascript:..." 调用它看起来很 hacky,但它看起来不像回调。为什么它不可靠?
  • 因为我无法确定 JS 回调需要多长时间才能响应。我可能会让用户挂起一段时间,直到发生某些事情。我需要一种方法来探测页面脚本而不依赖于它们的完整性。我可以这样做:调用 JS 测试函数 -> 启动计时器 -> 如果我在计时器结束之前得到回调,则正确的 JS 是活动的 |如果计时器滴答作响,那么它不是 - 但 this 可能是最丑陋的做事方式。我想知道有没有更好的方法。
  • Erm.. 只需检查一下,JS 中存在该函数:javascript:typeof someFunc == "function"。这是时间确定的代码。

标签: javascript android webview


【解决方案1】:
@JavascriptInterface
public void onLoaded(String result) {
    if (result.equals("function")) {
        // defined
    } else {
       // not defined
    }
}

private void checkJSFunction() {
    loadUrl("javascript:yourJSInterfaceName.onLoaded(typeof yourFunctionName)");
}

更新: 这段代码会检查“typeof”定义的JS函数,并通过javascript接口“onLoaded”将结果返回给java。

【讨论】:

  • 请解释这段代码的作用以及它如何回答问题。此外,它还包含语法错误。
【解决方案2】:

我认为你可以做到,请看PhoneGap项目,你会找到答案的。

PhoneGap 是一个很棒的移动平台免费框架。

【讨论】:

  • PhoneGap 是一个优秀的平台,毫无疑问。不幸的是,在我的案例中,HTML 应用程序已经开发完成,几乎无法触摸。无论如何,这里的 JS-to-Native 通信不是问题,这是不使用 .loadUrl('javascript:...) 的 Native-to-JS 的问题。
猜你喜欢
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多