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: मैं <textarea>उस html फ़ाइल में उपयोग कर रहा हूं जिसे मैं लोड WebViewकर रहा हूं और उसमें हिंदी भाषा का फ़ॉन्ट लिखने का प्रयास कर रहा हूं, लेकिन जब मैं हिंदी पाठ लिखने की कोशिश करता हूं तो यह प्रतीक के रूप में प्रदर्शित होता है (आयत प्रतीक जैसे [])।

जब मैं डेस्कटॉप पर फ़ायरफ़ॉक्स ब्राउज़र में ऐसा ही करता हूं तो यह ठीक काम करता है। किसी भी सुराग कैसे में एक से अधिक भाषा के लिए समर्थन देने के लिए textareaमें WebView?

2: जब मैं सबमिट पर क्लिक कर रहा हूं और alert()किसी अन्य जावा स्क्रिप्ट में विधि के पाठ को खोलने की कोशिश कर रहा हूं तो यह काम नहीं करता है, क्या इसका मतलब WebChromeClient केवल वर्तमान लोड किए गए HTML पेज के लिए इसके लागू होने के बाद भी है और javascriptsउस पृष्ठ से नहीं बुलाया गया है?


6
यह "जावास्क्रिप्ट" है, न कि "जावा स्क्रिप्ट", "जावा-स्क्रिप्ट", या "जावा स्क्रिप्ट" (यह सब आपके अन्य प्रश्न में दिखाई दिया)। मैंने आपके लिए इसे ठीक कर दिया है।
— टीजे क्राउडर

3
@TJCrowder मैं यह कहना चाहूंगा कि इसे जावास्क्रिप्ट कहा जाना चाहिए ।
— क्रिश सेलबक

7
@ क्रिस्सेलबेक: नहीं। :-) "जावास्क्रिप्ट" ओरेकल का एक पंजीकृत ट्रेडमार्क है (प्यार के विलय और अधिग्रहण), और उनके कार्यान्वयन के लिए मोज़िला द्वारा उपयोग (अनुमति के साथ) । राजधानी एस के साथ दोनों मामलों में, यह उस नाम का एकमात्र आदर्श रूप है। भाषा का दूसरा नाम, बेशक, ECMAScript (या ES) है, लेकिन ES5 के बारे में बात करने के अलावा कोई भी इसका उपयोग नहीं करता है ।
— टीजे क्राउडर

जवाबों:


89

इस लिंक की जाँच करें , और अंतिम टिप्पणी, आपको WebChromeClientअपने उद्देश्य के लिए उपयोग करना है।


8
धन्यवाद! webView.setWebChromeClient (नया WebChromeClient () {@Override जनता का बूलियन onJsAlert (WebView देखें, स्ट्रिंग url, स्ट्रिंग संदेश, JsResult परिणाम) (वापसी super.onJsAlert (दृश्य, यूआरएल, संदेश, परिणाम);})};
— नूरचमन 12

आपकी टिप्पणी ने मेरी मदद की .. जैसा कि निखिल का जवाब नीचे दिया गया है।
— वामसी चल्ला

आकर्षण जैसा काम करता है। लेकिन फिर .... क्या WebClient का WebChromeClient पर कोई लाभ है।
— जोश

3
यह एक बेवकूफी भरा सवाल हो सकता है, लेकिन वैसे भी: क्यों एक विधि को केवल एक ही पैरामस के साथ एक सुपर विधि को ओवरराइड करना है?
— दिमित्री एंड्रीव्स्की

1
जोड़ना मत भूलनाwebview.getSettings().setJavaScriptEnabled(true);
— Jemshit Iskenderov

119

जैसा कि दूसरों ने संकेत दिया है, काम करने के लिए WebChromeClient की स्थापना की आवश्यकता है alert()। यह केवल डिफ़ॉल्ट WebChromeClient () सेट करने के लिए पर्याप्त है:

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

नीचे सभी टिप्पणियों के लिए धन्यवाद। जिसमें जॉन स्मिथ शामिल हैं जिन्होंने संकेत दिया कि आपको जावास्क्रिप्ट सक्षम करने की आवश्यकता है।


हां, लेकिन अधिकांश बार जब आप WebChromeClient की घटनाओं के साथ ट्वीक करना चाहते हैं ...
— Radu Simionescu

10
मैं अंत mWebView.getSettings().setJavaScriptEnabled(true);में लाइन से पहले जोड़कर यह काम करने में कामयाब रहा mWebView.setWebChromeClient(new WebChromeClient());
— जॉन स्मिथ वैकल्पिक

2
जोड़ना मत भूलनाwebview.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);
    }
});

यह बहुत अच्छा काम करता है, लेकिन जब मैं promptजावास्क्रिप्ट से कॉल करता हूं , तो वह शीघ्र पाठ प्रदर्शित करने के बजाय कहता है, "https: // ... पर पेज" कहता है: "ऐप में एम्बेड किए जा रहे वेबव्यू के विसर्जन को पूरी तरह से तोड़ना
— माइकल

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;
            }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.