การแจ้งเตือน JavaScript ไม่ทำงานใน Android WebView


91

ในแอปพลิเคชันของฉันฉันกำลังใช้WebViewและฉันกำลังใช้JavaScript alert( )วิธีการนั้น แต่ใช้งานไม่ได้ไม่มีป๊อปอัปปรากฏขึ้น

ในไฟล์รายการของฉันฉันได้เพิ่ม

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

และในไฟล์กิจกรรมฉันได้เพิ่ม

mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("file:///android_asset/demo.html");

ในไฟล์ xml เลย์เอาต์ฉันได้เพิ่ม

<WebView 
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

เงื่อนงำใดวิธีการเปิดใช้งานเต็มรูปแบบJavaScriptในWebView?


อัปเดต

ขอบคุณเครื่องหมายวิธีการในไฟล์กำลังทำงานในขณะนี้ :)
alert()html

ตอนนี้มีสองปัญหาในWebView:
1: ฉันใช้ a <textarea>ในไฟล์ html ที่ฉันกำลังโหลดWebViewและพยายามเขียนด้วยแบบอักษรภาษาฮินดีในนั้น แต่เมื่อฉันพยายามเขียนข้อความภาษาฮินดีมันจะแสดงเป็นสัญลักษณ์ (สัญลักษณ์สี่เหลี่ยมผืนผ้าเช่น [])

เมื่อฉันทำเช่นเดียวกันในเบราว์เซอร์ firefox บนเดสก์ท็อปมันก็ใช้ได้ดี มีเงื่อนงำใด ๆ ในการให้การสนับสนุนสำหรับหลายภาษาtextareaในWebView?

2: เมื่อฉันคลิกส่งและพยายามเปิดค่าของข้อความในalert()วิธีการในสคริปต์ java อื่นมันใช้งานไม่ได้หมายความว่าแม้ว่าจะใช้WebChromeClient มันใช้ได้กับหน้า html ที่โหลดในปัจจุบันเท่านั้นและไม่ได้ถูกjavascriptsเรียกจากหน้านั้น?


6
มันคือ "JavaScript" ไม่ใช่ "Java Script", "java-script" หรือ "Java script" (ทั้งหมดนี้ปรากฏในคำถามเดิมของคุณ) ฉันได้แก้ไขให้คุณแล้ว
TJ Crowder

3
@TJCrowder ฉันจะกล้าที่จะบอกว่ามันควรจะเรียกว่าJavascript
Kris Selbekk

7
@KrisSelbekk: ไม่. :-) "JavaScript" เป็นเครื่องหมายการค้าจดทะเบียนของ Oracle (ต้องชอบการควบรวมและซื้อกิจการ) และใช้ (โดยได้รับอนุญาต) โดย Mozillaสำหรับการนำไปใช้งาน ในทั้งสองกรณีด้วยตัวพิมพ์ใหญ่ S. นั่นเป็นรูปแบบบรรทัดฐานเดียวของชื่อนั้น ชื่ออื่น ๆ สำหรับภาษาของหลักสูตรคือ ECMAScript (หรือ ES) แต่ไม่มีใครจริงๆใช้มันยกเว้นเมื่อพูดคุยเกี่ยวกับES5
TJ Crowder

คำตอบ:


89

ตรวจสอบลิงค์นี้และความคิดเห็นล่าสุดคุณต้องใช้WebChromeClientเพื่อวัตถุประสงค์ของคุณ


8
ขอขอบคุณ! webView.setWebChromeClient (WebChromeClient ใหม่ () {@Override บูลีนสาธารณะ onJsAlert (มุมมอง WebView, สตริง URL, ข้อความสตริง, ผลลัพธ์ JsResult) {ส่งคืน super.onJsAlert (มุมมอง, URL, ข้อความ, ผลลัพธ์);}});
nurnachman

ความคิดเห็นของคุณช่วยฉัน .. เช่นเดียวกับคำตอบของ Nikhil ด้านล่าง
Vamsi Challa

ใช้งานได้เหมือนมีเสน่ห์ แต่แล้ว .... WebClient มีข้อได้เปรียบเหนือ WebChromeClient หรือไม่
Josh

3
อาจเป็นคำถามโง่ ๆ แต่อย่างไรก็ตาม: ทำไมจึงแทนที่ method เพื่อเรียกเฉพาะ method ของ super ด้วย params เดียวกัน?
Dmitry Andrievsky

1
อย่าลืมเพิ่มwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov

120

ตามที่คนอื่นระบุการตั้งค่า WebChromeClient เป็นสิ่งจำเป็นเพื่อalert()ให้ทำงานได้ การตั้งค่า WebChromeClient เริ่มต้นก็เพียงพอแล้ว ():

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());

ขอบคุณสำหรับความคิดเห็นทั้งหมดด้านล่าง รวมถึงของ John Smith ที่ระบุว่าคุณต้องเปิดใช้งาน JavaScript


ใช่ แต่ส่วนใหญ่คุณต้องการปรับแต่งเหตุการณ์ของ WebChromeClient ดังนั้น ...
Radu Simionescu

10
ในที่สุดฉันก็สามารถทำงานได้โดยเพิ่ม mWebView.getSettings().setJavaScriptEnabled(true);ก่อนบรรทัดmWebView.setWebChromeClient(new WebChromeClient());
John Smith Optional

2
อย่าลืมเพิ่มwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov

23
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }
});

วิธีนี้ใช้งานได้ดี แต่เมื่อฉันเรียกใช้promptจากจาวาสคริปต์แทนที่จะแสดงข้อความแจ้งกลับระบุว่า "หน้าเว็บที่ https: // ... ระบุว่า:" ทำลายการฝังตัวของ WebView ที่ฝังอยู่ในแอปโดยสิ้นเชิง
Michael

5

รหัสต่อไปนี้จะใช้งานได้:

private WebView mWebView;
final Activity activity = this;

// private Button b;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            activity.setProgress(progress * 1000);
        }
    });

    mWebView.loadUrl("file:///android_asset/raw/NewFile1.html");
}

0

คุณสามารถลองสิ่งนี้ได้ผลสำหรับฉัน

WebView wb_previewSurvey=new WebView(this); 


       wb_previewSurvey.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            //Required functionality here
            return super.onJsAlert(view, url, message, result);
        }

    });

0

หากคุณต้องการซ่อน URL จากผู้ใช้ให้แสดง AlertDialog ดังต่อไปนี้

myWebView.setWebChromeClient(new WebChromeClient() {

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                Log.d(TAG, "onJsAlert url: " + url + "; message: " + message);
                AlertDialog.Builder builder = new AlertDialog.Builder(
                        mContext);
                builder.setMessage(message)
                        .setNeutralButton("OK", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int arg1) {
                                dialog.dismiss();
                            }
                        }).show();
                result.cancel();
                return true;
            }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.