Android webView evaluateJavaScript 执行未定义函数

Android webView evaluateJavaScript executes undefined function

我正在开发一个包含 WebView 的 Android 应用程序。 我正在尝试覆盖 onKeyDown activity 的方法。

我想在每次按下 phone 的后退按钮时调用一个 javascript 方法,如果该方法未定义,我想执行其他本机指令(我想关闭 activity).

是这个意思:我天生就是这样做的

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (true) {
                    webView.evaluateJavascript(  "try{pageGoBack();}" +
                                                        "catch{window.JSInterface.noBackFunction();}",null);
                    webView.clearCache(true);
                }
                return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}

对于每个 jsp服务器端我想实现这样的东西:

<script>
        function pageGoBack() {
                       ---do something to go back---
                }
        }
</script>
...

每个 jsp 这个方法必须有相同的名称 "pageGoBack" 但可以有不同的内部代码

事实就是如此:在我使用 pageGoBack 方法加载其中一个 jsp 之前,一切正常(捕获错误 'undefined' 并执行 JSInterface 方法)。

当我加载其中一个页面的方法 "remains in cache (???)" 并且它总是被执行(也在那些没有它的页面中)。

(看我也加了webView.clearCache(true);但是问题依旧)

谢谢 -

[已解决]

这不是 Android 的 WebView 或缓存的问题。那是javascript的问题。 当一个函数定义为 "global" 时,它在第一次计算时假定为全局范围。因此,当我第一次访问包含 pageGoBack() 的 .jsp 时,该函数变得全局可见。

我的案例的解决方案:

我有很多 jsp 带有这样的图形组件 ◄ 这意味着 "go back to the previous page"。我需要将当前页面的 -jquery 按钮点击功能关联到 Android 后退按钮。 所以我:

  • 创建了一个空 css class .empty-class-for-back-button
  • 将这个 class 给所有那些 ◄ 组件
  • 像这样做了一个全局js函数
function pageGoBack() { 
 var backBtn = $('.empty-class-for-back-button');
 if (backBtn.length > 0){
  backBtn.tap();
 }
 else{
  throw "css class not found";
 }
}
  • Android代码和我在问题中写的一样

如果当前页面中没有 ◄ 元素,现在可以正确抛出异常。

希望这对某人有所帮助。