JavaScript注入WebView不适用于Android 2.3.6

JavaScript注入WebView不适用于Android 2.3.6,java,android,android-webview,Java,Android,Android Webview,我遇到的问题是在WebView中注入一些JavaScript。我只在Android版本2.3.6和更低版本上有这个问题,我假设没有比这个更低的测试设备。我的代码在安卓4+中运行良好,所以我不太清楚它为什么会失败。它似乎“提交”了表单,但没有填写2.3.6中的用户名和密码字段,因此总是失败。我的主要目标是用两个EditText在WebView中模拟表单填写和提交,这样用户就不必与WebView本身交互。当用户点击登录按钮时,将运行以下代码: //Set what needs to be f

我遇到的问题是在WebView中注入一些JavaScript。我只在Android版本2.3.6和更低版本上有这个问题,我假设没有比这个更低的测试设备。我的代码在安卓4+中运行良好,所以我不太清楚它为什么会失败。它似乎“提交”了表单,但没有填写2.3.6中的用户名和密码字段,因此总是失败。我的主要目标是用两个EditText在WebView中模拟表单填写和提交,这样用户就不必与WebView本身交互。当用户点击登录按钮时,将运行以下代码:

    //Set what needs to be filled out in the WebView
    String javaScript = "(function(){ " +
        "document.getElementById('user').value = '" + mUsername + "'; " +
        "document.getElementById('password').value = '" + mPassword + "'; " +
        "document.getElementById('form').submit(); " +
        "})()";
    //Load the javascript here
    mWebView.loadUrl("javascript: " + javaScript);
我还将我的WebView设置设置为:

    //Setup the WebView options/settings
    ...
    mWebView.getSettings().setSaveFormData(false);
    mWebView.getSettings().setJavaScriptEnabled(true);
    ...
我已经尝试过寻找为什么这在2.3.6上不起作用的任何原因,但没有找到任何答案。版本2.*中是否存在一些4+中没有的限制

编辑:运行上述代码的按钮仅在页面加载完成后启用。因此,当点击这个按钮时,上面的JS注入将运行

    @Override
    public void onPageFinished(WebView view, String url) {
        ...
        //Only allow the user to inject the JS when the page has loaded
        if(url.equals("...")
            button.setEnabled(true);
        ...
    }
解决方案:我不确定这是否真的是原因,但将JS代码中的单引号改为双引号似乎可以让它运行。比如:

    String javaScript = ... + "document.getElementById(\"user\").value = \"" + mUsername + "\"; "

据我所知,没有任何限制,但在不同版本的Android中遇到来自不同Javascript引擎的问题并不罕见。这很可能只是一个简单的问题,即尝试使用不同的语法来实现相同的结果,试图找到一个使该版本的Javascript满意的逻辑版本


包括JQuery并使用JQuery语法编写函数也可能是一个解决方案。因为JQuery本身似乎很擅长处理这些差异。

JavaScript URL在您的流中的哪一点加载?您确定此时加载了DOM并且引用的元素有效吗


在尝试执行JavaScript时,您是否在logcat中看到任何输出?这应该会显示JavaScript错误。

感谢您的回复。为此,我不也需要将JQuery注入WebView吗?如果可以的话,我真的很想避免这种情况。我甚至不确定您是否可以注入JQuery并使其工作。您需要将其包含在页面本身中。我专门将其用于本地HTML资产,因此该页面仅链接到资产文件夹中JQuery min的本地副本。所以,是的,如果这个内容是外部的,我想JQuery已经过时了;也许仅仅是不同的函数声明就足以让姜饼开心。我发现解决这些问题的唯一方法是在webview中添加WebChromeClient,覆盖onJsAlert,然后在javascript中添加警报。调试时,您应该能够看到正在调用onJsAlert,然后只需移动您的警报,直到它停止触发。然后你至少可以弄清楚你的函数中有什么不正常。尽管你说表单实际上正在提交…但你的函数似乎确实正常工作。如果这是一个真正的javascript语法问题,我想提交不会起作用。我有一个工作流设置,只有在页面加载完成后才启用按钮,这样在页面加载之前不会注入JS。我还可以看到网页本身也加载了WebView。不幸的是,我也没有在日志中看到任何JS错误。我在上面添加了一些onPageFinished()代码。谢谢你的建议!当你点击这个按钮时,你能运行任何JavaScript吗?还是仅仅是那个特定的代码片段不起作用?e、 g.如果您尝试使用console.log或弹出警报对话框,它是否工作?因此,在进行更多调试后,JS似乎开始运行,但2.3.6 webview没有正确存储一些cookie,这基本上完全破坏了webview登录,这是一个新问题。但是,在调用脚本时,旧版本的android不得在调用
submit
之前将文本呈现到字段中。我所做的是将JS更改为使用
“username\”
,而不是
“username”
,并删除了
提交
调用。单引号似乎无法正确识别,双引号修复了这一问题,并删除了
submit
确实正确地呈现了字段。