Android WebView在加载html之前注入Javascript

时间:2012-12-28 04:31:10

标签: javascript android webview

我正在使用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 code:

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

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

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

8 个答案:

答案 0 :(得分:4)

我有同样的问题,我解决了。我在加载之前隐藏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);

答案 1 :(得分: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函数。

答案 2 :(得分:1)

您可以在页面加载之前注入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保持相同。

答案 3 :(得分:0)

你可以尝试把你的java脚本放在html页面里然后使用android java脚本函数调用可能会有所帮助

答案 4 :(得分:0)

一种方式,也许不是最简单的方法,是使用HttpClient自己从Web服务器读取数据,然后修改它并使用

将其设置到webview中
webview.loadData(mydata, "text/html", null);

答案 5 :(得分: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触发您的方法。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我必须做与您相同的事情,因为就我而言,网页的加载取决于需要通过应用程序通过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) {}
    }    
}

如果您需要在网络视图加载时使用javascript注入的变量或方法(例如,为了对用户进行身份验证),则还必须在javascript代码中添加以下内容,以使其能够可靠地运行,每次您打开Web视图。

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

仅当您想要/可以在Javascript方法中添加一些前缀时,才使用addJavascriptInterface。就我而言,这不是一个选择,因为相同的代码也适用于iOS。