17

我正在使用 Android WebView 加载一些网页。我需要在所有页面加载之前插入一段 Javascript 代码。

我正在尝试将它们注入 WebViewClient onPageStart 回调。

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient(){

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        loadUrl("javascript:var output='test string';");
        }
})

mWebView.loadUrl("xxx.html");

HTML 代码:

<html>
<script>document.write(output);</script>
</html>

我希望我的 Js 代码在 HTML 之前加载。但有时 JS 代码加载在 HTML 之后。

有什么办法可以解决我的问题吗?

4

8 回答 8

7

我有同样的问题,我解决了。我在加载前隐藏WebView并在页面加载后显示。

webView.getSettings().setJavaScriptEnabled(true);
b.webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            b.webView.evaluateJavascript("javascript:window.document.getElementsByTagName('body')[0].style.color='white';", null);
        }
        else
        {
            b.webView.loadUrl("javascript:window.document.getElementsByTagName('body')[0].style.color='white';");
        }
        b.webView.setVisibility(View.VISIBLE);
    }

});

b.webView.setVisibility(View.INVISIBLE);
b.webView.loadUrl(PreferenceHelper.EULA_URL);
于 2016-06-29T12:20:14.430 回答
3

通过 javascript 加载页面怎么样?

在您的资产中创建一个空白 html 页面,其中包括您的脚本和这个小功能(为了简单起见,我在这里使用 jquery,但您可以使用另一个框架或根本不使用框架)。

window.loadPage = function (url) {
    $.get(url, function(page) {
        $('html').replace(page);
    });
};

然后,在您的 android 应用程序上:

mWebView.loadUrl("javascript: loadPage('xxx.html')");

注意:我没有注意到 xxx.html 也可能在您的资产中,而不是在某处的 Web 服务器中,在这种情况下,出于安全原因,ajax 查询将失败,但您可以忘记 ajax 请求,阅读您的 html 页面字符串从您的 android 应用程序中,并将其作为参数传递给稍作修改的 javascript 函数。

于 2013-01-10T18:50:15.110 回答
2

您可以在页面加载之前注入您的 javascript,如下所示:

  val mimeType = "text/html"
  val encoding = "utf-8"
  val injection = "<script type='text/javascript'>
        //Your JavaScript code here

       //**This line is important**
        window.location.replace('ACTUAL_URL');</script>"
  webView.loadDataWithBaseURL('ANY_DUMMY_URL', injection, mimeType, encoding, null)

ACTUAL_URL 应该是您实际要加载的 URL。DUMMY_URL 可以是任何 URL,最好与 ACTUAL_URL 保持一致。

于 2018-12-28T11:17:57.950 回答
2

我必须和你做同样的事情,因为在我的例子中,网页的加载取决于需要通过 JavaScript 从应用程序设置的一些变量。

在页面加载之前尝试了加载 javascript 的所有不同排列之后,这最终对我有用:

webView.loadUrl(url)
webView.settings.javaScriptEnabled = true
webView.settings.javaScriptCanOpenWindowsAutomatically = true

val javascript = "alert('some javascript message');window.JAVASCRIPT_GLOBAL_VARIABLE=true;"

webView.webViewClient = object : WebViewClient() {
    override fun onLoadResource(view: WebView?, url: String?) {
         super.onLoadResource(view, url)
         webView.evaluateJavascript(javascript) {}
    }    
}

如果您需要在 web 视图加载时使用 javascript 注入的变量或方法 - 例如,为了验证用户身份,我还必须在 javascript 代码中添加以下内容以使其在每次打开 web 时可靠地工作看法。

window.location.replace('$url'); \\ this is the same url you want to inject the javascript into

addJavascriptInterface如果您想要/可以为您的 Javascript 方法附​​加一些前缀,则使用唯一的作品。就我而言,这不是一个选择,因为相同的代码也适用于 iOS。

于 2019-11-19T11:13:24.873 回答
0

一种可能不是最简单的方法是使用 HttpClient 自己从 Web 服务器读取数据,然后对其进行修改并将其设置到 webview 中使用

webview.loadData(mydata, "text/html", null);
于 2013-01-09T17:49:22.143 回答
0

我会结合使用 Phonegap 和 JavaScript 接口。

在主 .java 文件的 OnCreate() 中,包括以下内容:

super.appView.addJavascriptInterface(new Object()
        {
          public void setOutput()
          {
            // here the body of your method in Android
          }
        }, "myInterface");

然后,在 .js 文件中,包含以下内容(显然,您必须在同一个文件中导入 Phonegap 才能捕获 onDeviceReady 方法):

function onDeviceReady() {
        myInterface.setOutput();
      }

当设备准备就绪时,这将在应用程序启动的第一刻从 JavaScript 触发您的方法。

于 2013-01-10T12:41:07.810 回答
-1

您可以尝试将您的 java 脚本放在 html 页面中,然后使用 android java script 函数调用可能会有所帮助

于 2012-12-28T06:03:45.067 回答
-1

您可以
webView.addJavascriptInterface("test string", "output");
在加载网页之前使用注入所需的对象。

于 2016-04-18T03:37:01.707 回答