WebView使用详解(三)——WebChromeClient与LoadData补充

本文详细介绍了WebView的WebChromeClient组件,包括它的作用、区别于WebViewClient的地方,以及如何处理JS的alert、confirm、prompt弹窗。此外,还探讨了onConsoleMessage、onProgressChanged等方法的使用。同时,补充了LoadData和loadDataWithBaseURL的用法,强调了它们在加载数据时的注意事项和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:
我不会忘了我
忘了我曾说过一定会得到的梦想 ——《老大》小柯

相关文章

1、《WebView使用详解(一)——Native与JS相互调用(附JadX反编译)》
2、《WebView使用详解(二)——WebViewClient与常用事件监听》

###一、WebChromeClient
####1、概述

####(1)、 与WebViewClient的区别
很多同学一看到这里有Chrome,立马就会想到google 的Chrome浏览器;这里并不是指Chrome浏览器的意思,而是泛指浏览器,WebView的内部实现并不是完全使用Chrome的内核,而是部分使用Chome内核,其它都是与Chrome不相同的;
我们再来对比下WebViewClient:

  • WebViewClient:在影响View的事件到来时,会通过WebViewClient中的方法回调通知用户
  • WebChromeClient:当影响浏览器的事件到来时,就会通过WebChromeClient中的方法回调通知用法。

通过上面的对比,我们发现WebViewClient和WebChromeClient都是针对不同事件的回调,而google将这些回调进行分类集合,就产生了WebViewClient、WebChromeClient这两个大类,其中管理着针对不同类型的回调而已。

####(2)、为什么叫WebChromeClient?
因为WebChromeClient中集合了影响浏览器的事件到来时的回调方法,所以这里更需要突出浏览器的概念,而Chrome则是google自家的浏览器名称,所以使用WebChromeClient来做为名称吧,纯属臆想……

####(3)、WebChromeClient的常用函数
我们先来看一下,在WebChromeClient中我们将要讲解的函数,其实WebChromeClient里的函数是非常多的,可以监控到浏览器的很多方面,这里我们就不再一个个来讲了,只讲解常用的几个函数,而且随着ReactNative和Hybird的普及,WebView的使用场景会越来越少,指不定哪一天就被废弃了

/**
 * 当网页调用alert()来弹出alert弹出框前回调,用以拦截alert()函数
 */
public boolean onJsAlert(WebView view, String url, String message,JsResult result)
/**
 * 当网页调用confirm()来弹出confirm弹出框前回调,用以拦截confirm()函数
 */
public boolean onJsConfirm(WebView view, String url, String message,JsResult result)
/**
 * 当网页调用prompt()来弹出prompt弹出框前回调,用以拦截prompt()函数
 */
 public boolean onJsPrompt(WebView view, String url, String message,String defaultValue, JsPromptResult result) 
 /**
 * 打印 console 信息
 */
 public boolean onConsoleMessage(ConsoleMessage consoleMessage)
 /**
 * 通知程序当前页面加载进度
 */
 public void onProgressChanged(WebView view, int newProgress)

####2、WebChromeClient之onJsAlert、onJsConfirm、onJsPrompt
这一小节我们把这三个函数一起看,因为他们都是为了处理弹出框。
####(1)、为何JS中的alert()、confirm()、prompt()无效
首先,我们来举个例子,在网页中加上按钮,在点击时分别调用alert()、confirm()、prompt()来弹出不同的对话框
web.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 id="h">欢迎光临启舰的blog</h1>
    <button onclick="confirm('傻叉')">confirm</button>
    <button onclick="alert('傻叉')">alert</button>
    <button onclick="prompt('傻叉')">prompt</button>
</body>
</html>

然后是Java处理代码:(MyActivity.java)

public class MyActivity extends Activity {
   
    private WebView mWebView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView)findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new WebViewClient());
        mWebView.loadUrl("file:///android_asset/web.html");
    }
}

效果图如下:
这里写图片描述
从效果图中,虽然启用了JavaScript但是在网页中的confrim()、alert()、prompt()却是没有效果!
这是因为我们需要设置WebChromClient!
在程序中,我们只需要加上mWebView.setWebChromeClient(new WebChromeClient());就可以实现confrim()、alert()、prompt()的弹出效果了
html代码不变,我们来看一下JAVA代码:

public class MyActivity extends Activity {
   
    private WebView mWebView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView)findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new WebViewClient());
        mWebView.setWebChromeClient(new WebChromeClient());

        mWebView.loadUrl("file:///android_asset/web.html");
    }
}

相比上面,只多了一句:mWebView.setWebChromeClient(new WebChromeClient());
现在再来看下效果图:
这里写图片描述
至于为什么会这样,我也不知道,也没仔细去研究它的源码,记住就好了。
####(2)、使用onJsAlert拦截alert()函数概述
我们先来看一下在程序中如何来做的:

public class MyActivity extends Activity {
   
    private WebView mWebView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mWebView = (WebView)findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new WebViewClient()
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值