Android WebView Injetar Javascript antes de html carregado

10

Estou usando o Android WebView para carregar algumas páginas da web. Preciso inserir um código JavaScript em todas as páginas antes de serem carregadas.

Estou tentando injetá-los no retorno de chamada do 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");

Código HTML:

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

Eu esperava que o código My Js fosse carregado antes do HTML. Mas às vezes o código JS é carregado depois do HTML.

Existe alguma maneira de resolver meu problema?

    
por wayne_bai 28.12.2012 в 05:31
fonte

6 respostas

3

Que tal carregar sua página via javascript?

Crie uma página html em branco nos seus recursos, que inclua seu script mais essa pequena função (estou usando o jquery para simplificar aqui, mas você pode usar outro framework ou não framework).

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

Em seguida, no seu aplicativo Android:

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

Nota: Eu não notei xxx.html poderia estar em seus ativos também e não em um servidor web em algum lugar, nesse caso, a consulta ajax falhará por razões de segurança, mas você pode esquecer o pedido de ajax, leia você html página em seqüência de seu aplicativo android e passá-lo como um argumento para uma função javascript ligeiramente modificada.

    
por Thomas 10.01.2013 / 19:50
fonte
2

Eu tive o mesmo problema e resolvi isso. Eu oculto WebView antes de carregar e mostrar após página carregada.

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);
    
por sagus_helgy 29.06.2016 / 14:20
fonte
0

você pode tentar colocar o seu script java dentro da página html, em seguida, usar a chamada de função do script java android pode ser útil

    
por Bhavdip Sagar 28.12.2012 / 07:03
fonte
0

Uma maneira, talvez não a mais simples, é usar um HttpClient para ler os dados do servidor da web, modificá-los e configurá-los na webview usando

webview.loadData(mydata, "text/html", null);
    
por yoah 09.01.2013 / 18:49
fonte
0

Eu usaria uma combinação de Phonegap e uma interface para JavaScript.

No arquivo principal .java, em OnCreate (), inclua isto:

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

E, em seguida, no arquivo .js, inclua isso (você precisa importar o Phonegap no mesmo arquivo, obviamente, para capturar o método onDeviceReady):

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

Isso acionaria seu método de JavaScript quando o dispositivo estiver pronto, durante o primeiro momento do lançamento do aplicativo.

    
por luisfer 10.01.2013 / 13:41
fonte
0

Você pode usar o% webView.addJavascriptInterface("test string", "output");
para injetar o objeto desejado, antes que a página da Web seja carregada.

    
por SharpZhang 18.04.2016 / 05:37
fonte