Injeksi Javascript Tampilan Web Android

Saya mencoba memasukkan javascript ke halaman yang saya muat di tampilan web. Misalnya, saya menempatkan nilai ke dalam kotak teks tertentu dengan mengganti 'onPageFinished' dalam kelas WebViewClient khusus:

public class MyAppWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url)
    {
        super.onPageFinished(view, url);
        view.loadUrl("javascript:" +
            "document.getElementById('elid').value = 'texthere';");
    }
}

Ini berfungsi dengan benar ketika menjelajahi situs web, dan mengklik tautan, tetapi ketika saya menekan tombol kembali, java/javascript tampaknya tidak dijalankan dengan benar (kotak teks tidak terisi dengan benar.

Fungsi onPageFinished dipanggil ketika tombol kembali ditekan, tetapi tampaknya javascript dijalankan pada halaman saat ini, bukan pada halaman tujuan kembali.


person xur17    schedule 19.04.2014    source sumber
comment
Lihat juga stackoverflow.com/q/21552912/32453   -  person rogerdpack    schedule 01.08.2017


Jawaban (2)


https://github.com/henrychuangtw/Android-Javascript-Injection

Langkah 1 : buat kelas yang dipanggil dengan javascript

class MyJavaScriptInterface
{
    @JavascriptInterface
    public void processHTML(String html)
    {
        //called by javascript
    }
}


Langkah 2 : daftarkan antarmuka untuk javascript

webview1.addJavascriptInterface(new MyJavaScriptInterface(), "MYOBJECT");


Langkah 3 : menyuntikkan javascript ke halaman

webview1.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);

        StringBuilder sb = new StringBuilder();
        sb.append("document.getElementsByTagName('form')[0].onsubmit = function () {");
        sb.append("var objPWD, objAccount;var str = '';");
        sb.append("var inputs = document.getElementsByTagName('input');");
        sb.append("for (var i = 0; i < inputs.length; i++) {");
        sb.append("if (inputs[i].type.toLowerCase() === 'password') {objPWD = inputs[i];}");
        sb.append("else if (inputs[i].name.toLowerCase() === 'email') {objAccount = inputs[i];}");
        sb.append("}");
        sb.append("if (objAccount != null) {str += objAccount.value;}");
        sb.append("if (objPWD != null) { str += ' , ' + objPWD.value;}");
        sb.append("window.MYOBJECT.processHTML(str);");
        sb.append("return true;");
        sb.append("};");

        view.loadUrl("javascript:" + sb.toString());
    }

});
person HenryChuang    schedule 22.12.2014
comment
tidak berfungsi :( Saya mencoba memasukkan konten ini ke file js terpisah saya yang berada di dalam folder aset. - person Narendra Singh; 17.08.2018

Saya tidak tahu secara spesifik tentang Android WebView (Saya baru mempelajarinya sekarang), tapi ini mungkin bisa membantu... Secara umum pengembangan web, Anda dapat memaksa onload untuk diaktifkan ketika halaman dibuka melalui tombol kembali seperti Jadi:

//This Ensures onLoad() Functions Fire When 
//This Page Is Left & Then Returned To Via The Back Button
window.onunload = function(){};

CATATAN: window.onunload BUKAN window.onload

person BuvinJ    schedule 02.05.2014