Android Web Görünümü'nde JavaScript uyarısı çalışmıyor


91

Uygulamamda kullanıyorum WebViewve JavaScript alert( )yöntem kullanıyorum ama çalışmıyor, pop-up görünmüyor.

manifest dosyama ekledim

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

ve etkinlik dosyasına ekledim

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

Düzen xml dosyasında ekledim

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

Tam girişin nasıl etkinleştirileceği hakkında bir fikriniz JavaScriptvar WebViewmı?


Güncelleme

Teşekkür işaretlemek yöntem dosyası şimdi çalışıyoruz :).
alert()html

Şimdi iki sorun var WebView:
1: <textarea>Yüklediğim html dosyasında a kullanıyorum WebViewve içine Hintçe yazı tipinde yazmaya çalışıyorum, ancak Hintçe metin yazmaya çalıştığımda semboller olarak görüntüleniyor (dikdörtgen semboller gibi []).

aynısını masaüstünde firefox tarayıcısında yaptığımda iyi çalışıyor. herhangi bir ipucu nasıl birden dil için destek vermek textareade WebView?

2: Gönder'e tıkladığımda ve metnin değerini alert()başka bir java betiğinde yöntemdeki metnin değerini açmaya çalıştığımda çalışmıyor, WebChromeClient yalnızca geçerli yüklü html sayfası için geçerli olanı kullandıktan ve javascriptso sayfadan çağrılmadıktan sonra bile mi?


6
Bu "JavaScript", "Java Script", "java-script" veya "Java script" değil (tümü orijinal sorunuzda belirdi). Senin için düzelttim.
TJ Crowder

3
@TJCrowder Javascript olarak adlandırılması gerektiğini söylemeye cüret ediyorum .
Kris Selbekk 08

7
@KrisSelbekk: Hayır. :-) "JavaScript", Oracle'ın tescilli ticari markasıdır (birleşme ve satın almaları seviyorum) ve bunların uygulanması için Mozilla tarafından (izin alınarak) kullanılmaktadır . Her iki durumda da , büyük S ile bu ismin tek normatif biçimi. Dilin diğer adı elbette ECMAScript (veya ES), ancak ES5 hakkında konuşmak dışında kimse onu gerçekten kullanmıyor .
TJ Crowder

Yanıtlar:


89

Bu bağlantıyı ve son yorumu kontrol edin WebChromeClient, amacınız için kullanmalısınız .


8
teşekkür ederim! webView.setWebChromeClient (new WebChromeClient () {@Override public boolean onJsAlert (WebView view, String url, String message, JsResult result) {return super.onJsAlert (view, url, message, result);}});
nurnachman

Yorumunuz bana yardımcı oldu .. Nikhil'in aşağıdaki cevabı gibi.
Vamsi Challa

Cazibe gibi çalışır. Ama sonra .... WebClient'ın WebChromeClient'e göre herhangi bir avantajı var mı?
Josh

3
Aptalca bir soru olabilir, ama yine de: neden sadece aynı parametrelerle bir süperin yöntemini çağırmak için bir yöntemi geçersiz kılasınız?
Dmitry Andrievsky

1
webview.getSettings().setJavaScriptEnabled(true);
Eklemeyi

120

Diğerlerinin de belirttiği gibi, alert()işe başlamak için WebChromeClient'in ayarlanması gerekir . Varsayılan WebChromeClient () ayarını yapmanız yeterlidir:

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

Aşağıdaki tüm yorumlar için teşekkürler. JavaScript'i etkinleştirmeniz gerektiğini belirten John Smith'in dahil.


evet, ancak çoğu zaman WebChromeClient olayları ile ince ayar yapmak istersiniz, bu yüzden ...
Radu Simionescu

10
Sonunda mWebView.getSettings().setJavaScriptEnabled(true);satırın önüne ekleyerek çalışmasını sağlamayı başardım mWebView.setWebChromeClient(new WebChromeClient());
John Smith İsteğe Bağlı

2
webview.getSettings().setJavaScriptEnabled(true);
Eklemeyi

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

Bu harika çalışıyor, ancak promptjavascript'ten aradığımda , istem metnini görüntülemek yerine "https: // ... adresindeki sayfa şunu söylüyor:" Uygulamaya yerleştirilen Web Görünümü'nün daldırma sürecini tamamen bozuyor
Michael

5

Aşağıdaki kod çalışacaktır:

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

Bununla deneyebilirsin, benim için çalıştı

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'yi kullanıcıdan gizlemek isterseniz, aşağıdaki gibi bir AlertDialog Gösterin.

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;
            }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.