Cảnh báo JavaScript không hoạt động trong Android WebView


91

Trong ứng dụng của tôi, tôi đang sử dụng WebViewvà trong đó tôi đang sử dụng JavaScript alert( )phương pháp nhưng nó không hoạt động, không có cửa sổ bật lên nào xuất hiện.

trong tệp kê khai của tôi, tôi đã thêm

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

và trong tệp hoạt động tôi đã thêm

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

Trong tệp xml bố cục tôi đã thêm

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

Bất kỳ đầu mối làm thế nào để kích hoạt tính năng đầy đủ JavaScripttrong WebView?


Cập nhật

Cảm ơn đánh dấu
các alert()phương pháp trong các htmltập tin đang làm việc bây giờ :).

Bây giờ có hai vấn đề trong WebView:
1: Tôi đang sử dụng một <textarea>trong tệp html mà tôi đang tải vào WebViewvà cố gắng viết bằng phông chữ tiếng Hindi trong đó, nhưng khi tôi cố viết văn bản tiếng Hindi, nó hiển thị dưới dạng ký hiệu (ký hiệu hình chữ nhật như []).

khi tôi làm tương tự trong trình duyệt firefox trên máy tính để bàn, nó hoạt động tốt. bất kỳ manh mối làm thế nào để cung cấp hỗ trợ cho nhiều ngôn ngữ textareatrong WebView?

2: Khi tôi nhấp vào gửi và cố gắng mở giá trị của văn bản trong alert()phương thức trong một tập lệnh java khác, nó không hoạt động, có nghĩa là ngay cả sau khi sử dụng WebChromeClient nó chỉ áp dụng cho trang html được tải hiện tại và không javascriptsđược gọi từ trang đó?


6
Đó là "JavaScript", không phải "Java Script", "java-script" hoặc "Java script" (tất cả đều xuất hiện trong câu hỏi ban đầu của bạn). Tôi đã sửa nó cho bạn.
TJ Crowder

3
@TJCrowder Tôi muốn nói rằng nó nên được gọi là Javascript .
Kris Selbekk

7
@KrisSelbekk: Không. :-) "JavaScript" là nhãn hiệu đã đăng ký của Oracle (chắc chắn phải thích hợp nhất và mua lại) và được Mozilla sử dụng (với sự cho phép) để triển khai chúng. Trong cả hai trường hợp, với chữ S. Đó là hình thức quy chuẩn duy nhất của tên đó. Tất nhiên, tên gọi khác của ngôn ngữ là ECMAScript (hoặc ES), nhưng không ai thực sự sử dụng nó ngoại trừ khi nói về ES5 .
TJ Crowder

Câu trả lời:


89

Kiểm tra liên kết này và nhận xét cuối cùng, Bạn phải sử dụng WebChromeClientcho mục đích của mình.


8
cảm ơn bạn! webView.setWebChromeClient (new WebChromeClient () {@Override public boolean onJsAlert (WebView view, String url, String message, JsResult result) {return super.onJsAlert (view, url, message, result);}});
nurnachman

bình luận của bạn đã giúp tôi .. cũng như câu trả lời của Nikhil bên dưới.
Vamsi Challa

Hoạt động như sự quyến rũ. Nhưng sau đó .... liệu WebClient có bất kỳ lợi thế nào so với WebChromeClient.
Josh

3
Đó có thể là một câu hỏi ngu ngốc, nhưng dù sao đi nữa: tại sao lại ghi đè một phương thức để chỉ gọi phương thức của một siêu có cùng tham số?
Dmitry Andrievsky

1
Đừng quên thêmwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov

119

Như những người khác đã chỉ ra, cần thiết lập WebChromeClient alert()để hoạt động. Chỉ cần đặt WebChromeClient () mặc định là đủ:

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

Cảm ơn cho tất cả các ý kiến ​​dưới đây. Bao gồm cả John Smith's, người đã chỉ ra rằng bạn cần bật JavaScript.


vâng nhưng hầu hết các lần bạn muốn tinh chỉnh với các sự kiện trong WebChromeClient như vậy ...
Radu Simionescu

10
Cuối cùng tôi đã quản lý để nó hoạt động bằng cách thêm vào mWebView.getSettings().setJavaScriptEnabled(true);trước dòngmWebView.setWebChromeClient(new WebChromeClient());
John Smith Tùy chọn

2
Đừng quên thêmwebview.getSettings().setJavaScriptEnabled(true);
Jemshit Iskenderov

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

Điều này hoạt động tuyệt vời, nhưng khi tôi gọi prompttừ javascript, thay vì hiển thị văn bản nhắc, nó nói, "Trang tại https: // ... nói:" hoàn toàn phá vỡ sự đắm chìm của WebView được nhúng trong ứng dụng
Michael

5

Đoạn mã sau sẽ hoạt động:

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

Bạn có thể thử với cái này, nó hiệu quả với tôi

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

nếu bạn muốn ẩn URL khỏi người dùng, hãy Hiển thị một AlertDialog như bên dưới.

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;
            }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.