在 WebViewClient 中启用通用 JavaScript

在谷歌上搜索答案的时候,我似乎不是唯一一个被困在一个看起来不可能解决的问题中的人。

我已经设法创建了一个自定义 WebViewClient 的 WebView-这使我有可能有一个进程对话框,并显示一个错误消息,如果一个 URL 无法加载。

但这给 JavaScript 带来了一个问题。我正在加载的 URL 有一些 JavaScript,它可以改变一些 HTML 元素的 CSS 样式(显示或隐藏元素) ,或者重定向到另一个位置单击-或者甚至想要显示一个警告框。但是通过使用 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 可以解决这个问题,但是当页面出错或加载完成时,我就无法捕获事件。

95531 次浏览

我不知道你的确切问题是什么,但我可以启用 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);

“ Javascript-URL”是否通过 shouldOverrideUrlLoading路由?尝试检查这一点,如果是这样,返回 false这样的链接(这样 webview 处理链接,而不是您的 WebViewClient)

尝试启用 javascript

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

在我的案例中发生了什么: 我正在提供本地 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);

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

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

即使在添加它不工作后,然后尝试添加以下行。

mWebView.getSettings().setDomStorageEnabled(true);

现在应该可以了。 :)

类似于@mdelolmo 的回答,但在 Kotlin:

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

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

- > 有关文件详情,请浏览 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 () ;

还有这个

SetJavaScriptEnable (true) ;

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

- > 感谢阅读。

如何在其他答案中以编程方式启用。但是如果您的 WebviewNestedscrollview中,有些 javascript 就无法工作。删除它,并添加 SetJavaScriptEnable (true) ;

这段代码碰巧对我有用,我希望它能帮助你和其他开发人员:

webview = findViewById(R.id.WebView);
webview.setWebViewClient(new WebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.loadUrl("www.example.com");