การฉีดจาวาสคริปต์ Android Webview

ฉันกำลังพยายามแทรกจาวาสคริปต์ลงในหน้าเว็บที่ฉันโหลดใน webview ตัวอย่างเช่น ฉันกำลังวางค่าลงในกล่องข้อความที่กำหนดโดยแทนที่ 'onPageFinished' ภายในคลาส WebViewClient ที่กำหนดเอง:

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';");
    }
}

สิ่งนี้ทำงานได้อย่างถูกต้องเมื่อเรียกดูเว็บไซต์และคลิกลิงก์ แต่เมื่อฉันกดปุ่มย้อนกลับ ดูเหมือนว่า java/javascript จะทำงานไม่ถูกต้อง (กล่องข้อความไม่ได้กรอกอย่างถูกต้อง

ฟังก์ชัน onPageFinished จะถูกเรียกเมื่อกดปุ่มย้อนกลับ แต่ดูเหมือนว่าจะกำลังเรียกใช้งานจาวาสคริปต์บนหน้าปัจจุบัน ไม่ใช่บนหน้าที่ถูกส่งกลับ


person xur17    schedule 19.04.2014    source แหล่งที่มา
comment
ดูเพิ่มเติมที่ stackoverflow.com/q/21552912/32453   -  person rogerdpack    schedule 01.08.2017


คำตอบ (2)


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

ขั้นตอนที่ 1 : สร้างคลาสที่เรียกโดยจาวาสคริปต์

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


ขั้นตอนที่ 2 : ลงทะเบียนอินเทอร์เฟซสำหรับจาวาสคริปต์

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


ขั้นตอนที่ 3 : แทรกจาวาสคริปต์ลงในเพจ

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
ไม่ทำงาน :( ฉันพยายามฉีด เนื้อหานี้ ในไฟล์ js แยกต่างหากของฉันซึ่งอยู่ภายในโฟลเดอร์ทรัพย์สิน - person Narendra Singh; 17.08.2018

ฉันไม่รู้ข้อมูลเฉพาะของ Android WebView (ฉันแค่กำลังเรียนรู้เกี่ยวกับมันในตอนนี้) แต่สิ่งนี้อาจช่วยได้... ในการพัฒนาเว็บโดยทั่วไป คุณสามารถบังคับให้ออนโหลดเริ่มทำงานเมื่อเข้าถึงเพจผ่านปุ่มย้อนกลับ เช่น ดังนั้น:

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

หมายเหตุ: window.onunload ไม่ใช่ window.onload

person BuvinJ    schedule 02.05.2014