在WebViewClient中启用常规JavaScript


72

在google中寻找答案时,似乎我不是唯一一个似乎无法解决的问题。

我设法用自定义WebViewClient创建了一个WebView-这使我可以进行流程对话,并在无法加载URL的情况下显示错误消息。

但这给JavaScript造成了问题。我正在加载的URL包含一些JavaScript,这些JavaScript更改了一些HTML元素CSS样式(显示或隐藏元素)或重定向到onclick的另一个位置-甚至可能希望显示警报框。但是通过使用WebViewClient,这些都不起作用。

这是我加载页面的方式:

public void loadUrl(String url)
{
    final ProgressDialog dialog = ProgressDialog.show(myActivity.this, "",  getString(R.string.loading), true);
            final WebView myWebView = (WebView) findViewById(R.id.webview);
            myWebView.setVerticalScrollBarEnabled(false);
            myWebView.setHorizontalScrollBarEnabled(false);
            WebSettings webSettings = myWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);                                         


            myWebView.setWebViewClient(new WebViewClient() 
            {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) 
                {
                    Toast.makeText(myActivity.this, url, Toast.LENGTH_SHORT).show(); //Debugging purposes
                if (url.endsWith(".mp4")) 
                {
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setDataAndType(Uri.parse(url), "video/mp4");
                        view.getContext().startActivity(intent);  
                }
                else
                {                           
                        view.loadUrl(url);
                    }

                    return true;
                }

                public void onPageFinished(WebView view, String url) 
                {
                    //Toast.makeText(myActivity.this, "Oh no!", Toast.LENGTH_SHORT).show();
                    dialog.dismiss();
                }

                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
                {
                    Toast.makeText(myActivity.this, description, Toast.LENGTH_SHORT).show();
                    String summary = "<html><body><strong>" + getString(R.string.lost_connection) + "</body></html>";
                    myWebView.loadData(summary, "text/html", "utf-8");   
                }              

             }); //End WebViewClient

            myWebView.loadUrl(url);     
        }

这可能以更聪明的方式完成,但是我在Java和Android开发中都是新手。

我是否可以完全为WebViewClient启用JavaScript?删除WebViewClient可以解决问题,但是当页面错误或加载完成时,我无法捕获事件。

Answers:


152

我不知道您的确切问题是什么,但是我可以毫无问题地启用JavaScript和自定义WebViewclient

WebView vistaWeb = (WebView) findViewById(R.id.webview);
vistaWeb.setWebChromeClient(new MyCustomChromeClient(this));
vistaWeb.setWebViewClient(new MyCustomWebViewClient(this));
vistaWeb.clearCache(true);
vistaWeb.clearHistory();
vistaWeb.getSettings().setJavaScriptEnabled(true);
vistaWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

12
看来WebChromeClient是解决方案。通过添加myWebView.setWebChromeClient(new WebChromeClient()); 对我的代码来说,它解决了JavaScript问题。希望我的问题将来对其他Google员工有所帮助。谢谢。
Repox 2011年

5
是的,这是神秘的黑客之一。for Monodroid C#,添加了wv.SetWebChromeClient(new WebChromeClient()); 工作

@Repox也许您应该添加它作为答案,因为它很简单并且似乎可行。
ban-geoengineering

同意,WebChromeClient是解决方案
danisupr4'3

@mdelolmo嗨,您能在这里stackoverflow.com/questions/63498385/…帮我吗?
Pratik vekariya

7

试试这个启用JavaScript

WebView myWebView = (WebView) findViewById(R.id.webView);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient());
myWebView.loadUrl(url);

5

启用JavaScript的正确方法是添加以下两行:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

即使添加后不起作用,也请尝试添加以下行。

mWebView.getSettings().setDomStorageEnabled(true);

现在它应该工作了。:)


2

我的情况是什么:我正在提供本地html文件,并且在申请时

    web.getSettings().setJavaScriptEnabled(true);
    web.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

但是后来我的网址停止工作了。使JS和本地href都起作用的解决方案是添加

    web.getSettings().setAllowFileAccess(true);
    web.getSettings().setAllowFileAccessFromFileURLs(true);

哪里

    web = (WebView) findViewById(R.id.embedded_web);

2

->您好,请尝试此代码此代码运行良好

->有关文档的更多信息,请访问 https://developer.android.com/guide/webapps/webview#java

->此链接于2019年11月正常运行目前我不知道

->您的XML设计代码是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

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


</LinearLayout>

->而您的后端Java代码是

package com.developer.harshil.kaneria.webview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView myWebView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        myWebView.loadUrl("https://github.com/Harshil-Kaneria");
    }
}

->在Java代码中

WebSettings webSettings = myWebView.getSettings();

和这个

webSettings.setJavaScriptEnabled(true);

->允许在页面加载时运行JavaScript

->非常感谢您的阅读。


1

是否通过“ Javascript-URL”进行路由shouldOverrideUrlLoading?尝试检查,如果是,则返回false类似的链接(以便Webview处理该链接,而不是您的WebViewClient)


0

与@mdelolmo答案类似,但在Kotlin中:

    webview.setWebChromeClient(WebChromeClient())
    webview.setWebViewClient(WebViewClient())
    webview.clearCache(true)
    webview.clearHistory()
    webview.getSettings().setJavaScriptEnabled(true)
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true)

您的答案不会像Java一样帮助任何人,并且Kotlin没什么特别的。
alizeyn

1
@Ali Zeynali如果有人开始使用Kotlin作为他们的第一门编程语言并且不熟悉Java,那么这个答案很有用
Jerry Chong

0

如何在其他答案中以编程方式启用答案。但是,如果你的JavaScript的一些没有工作的WebViewnestedscrollview。删除它并添加webSettings.setJavaScriptEnabled(true);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.