Android WebView加载HTML前注入Javascript

19

我正在使用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之后加载。

是否有任何方法可以解决我的问题?


请告诉我们更多关于你的JS代码是做什么的... - Leonidos
1
嗨,wayne_bai,你能告诉我上述问题的解决方案吗?我也遇到了同样的问题。你能帮我解决这个问题吗?我没有得到完美的解决方案。我还需要在加载HTML之前注入JavaScript。 - GowriShankar
使用 window.loadPage=function(){}。在函数中编写 JavaScript。 - Maulik
8个回答

8

我曾经遇到过同样的问题,不过我已经解决了。在加载页面前,我先隐藏了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);

3

您是否考虑通过JavaScript加载您的网页?

在assets中创建一个空白的HTML页面,其中包括您的脚本以及这个小函数(为了简单起见,我在此使用jquery,但您也可以使用其他框架或不使用框架)。

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

然后,在您的安卓应用程序上:
mWebView.loadUrl("javascript: loadPage('xxx.html')");

注意:我没有注意到 xxx.html 可能也在你的资源中而不是在 Web 服务器上,在这种情况下,由于安全原因 ajax 查询将失败,但您可以忽略 ajax 请求,从您的 Android 应用程序中以 String 的形式读取 html 页面并将其作为参数传递给略微修改的 javascript 函数。


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相同。


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视图时都能可靠地工作。请保留HTML标签。
window.location.replace('$url'); \\ this is the same url you want to inject the javascript into

如果您想/可以在JavaScript方法中添加一些前缀,那么使用addJavascriptInterface就可以实现。但在我的情况下,这不是一个可选项,因为相同的代码也需要适用于iOS。


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触发您的方法。


0

一种方法,也许不是最简单的方法,是使用HttpClient自己从Web服务器读取数据,然后修改它并将其设置到Webview中。

webview.loadData(mydata, "text/html", null);

-2

您可以尝试将 JavaScript 放置在 HTML 页面中,然后使用 Android 的 JavaScript 函数调用可能会有所帮助。


-2
你可以使用
webView.addJavascriptInterface("test string", "output");
在网页加载之前注入你想要的对象。

1
这不仅仅是为了使Java对象在Webview Javascript范围内可访问吗?您能否使用它将javascript文件注入到每个页面中? - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接