目录

web

概述

用于显示在线的html页面在webview的useragent后追加内容,格式是hap/<平台版本号>/<厂商标识> <平台应用包名>/<平台应用版本号> <应用包名>/<应用版本号> (<来源信息>)。“来源信息”与app接口的getInfo方法返回结果中的source字段相同。

<web>组件支持文件下载的能力,可以通过“打开网页”接口实现。

使用限制

限制条件

说明

适用终端

手机、平板、智慧屏、车机

适用区域

全球

子组件

不支持。

属性

<web>组件支持如下属性。

名称

类型

默认值

是否必填

描述

src

string

-

否

需要加载的页面地址。

注意:

1、如果页面中有使用定位功能,那么页面必须为https网站。

2、不建议使用http/https混合加载模式。

supportzoom(1070+)

boolean

false

否

网页是否支持放大缩小。

注意:

如果网页设置 user-scalable=no,则该网页不支持缩放。

trustedurl(1020+)

array

-

否

可信任的网址,支持正则表达式,默认为当前的src。

注意:

只有trustedurl中链接或者src链接的网页可以和框架进行双向通信。

allowthirdpartycookies(1030+)

boolean

false

否

是否支持跨域cookies传递,默认为false,即为不支持。

showloadingdialog(1070+)

boolean

true

否

是否展示加载进度条。

useragent(1070+)

string

default

否

设置web组件的userAgent,默认使用快应用的UA。

  • 设置为system,表示使用系统默认UA。
  • 设置其他字符串属于自定义UA。
  • 不设置此字段或者传入空值,使用默认快应用UA。

algorithmsforlayout(1070+)

string

narrowcolumn

否

设置底层布局算法。这将导致WebView的重新布局

  • normal:不改变渲染。这是不同平台和系统版本之间实现最大兼容性的推荐选择。
  • onecolumn:将所有内容移动到一列,该列为视图的宽度。
  • narrowcolumn:使所有列尽可能不比屏幕宽。
  • textautosize:基于启发式方法调整段落的字体大小,以便在overview模式下查看wide viewport布局时使文本可读。建议使用该方式时,启用变焦支持Zoom。

wideviewport(1070+)

boolean

true

否

设置WebView是启用对“viewport” HTML meta tag 的支持,还是使用wide viewport。

  • 当设置为false时,布局宽度始终设置为WebView控件的CSS像素宽度。
  • 当设置为true时,如果页面包含viewport meta标签,则取标签中指定的width值。如果页面不包含标记或不提供宽度,那么将使用wide viewport。

overviewmodeinload(1070+)

boolean

false

否

设置WebView是否以overview模式加载页面,即按宽度缩小内容到屏幕内。当内容宽度大于WebView控件的宽度时,例如启用 wide viewport时,将考虑此设置。

multiwindow(1070+)

boolean

false

否

设置web组件是否支持启动多窗口。

jumppolicy(1070+)

string

default

否

多窗口打开的策略。

  • browser:web组件中启动的多窗口在系统浏览器中打开。
  • default:web组件中启动的多窗口在快应用中打开。

openinbrowserurl(1070+)

array

-

否

设置需要在系统浏览器中打开的多窗口URL,支持正则表达式配置。

xrequestedwithpolicy(1070+)

number

1

否

控制web组件发送http/https请求的头域x-requested-with的值。

  • 1:不修改系统默认实现。系统默认传递引擎包名,例如<x-requested-with: packagename>。
  • 0:传递空的头域值。<x-requested-with: >。

fullscreendirection(1070+)

string

landscape

否

控制web组件全屏时屏幕的方向。

  • landscape:横屏
  • portrait:竖屏

initialscale(1077+)

number

-

否

设置web组件显示内容的初始比例,单位百分比。如果设置该属性,需要同时显示设置wideviewport为false。

renamejsinterface(1077+)

string

-

否

web组件和H5通信接口名称默认为system,如果system和其他接口名重复,可通过此属性修改Web组件和H5通信接口名称,以避免接口冲突。

whiteDomain(1118+)

array

-

否

用于检查加载url的域,默认值为当前src的域值,支持正则表达式。

白域列表以外的域在加载前需要用户批准。

web组件从1090版本开始,支持html5页面中input标签的capture属性。

web组件支持文件上传;从1040版本开始,可以拉起拍照界面、录制视频界面和录制音频界面。编辑需跳转界面的html文件,在html文件中对<input>组件进行设置,然后通过web组件的src属性调用此html文件。

事件

不支持swipe事件。低于1040版本不支持click事件。除了支持 通用事件 以外,还支持如下事件。

名称

参数

描述

pagestart

{url: urlString, canBack: true/false 1080+, canForward: true/false 1080+}

开始加载网页时触发。

pagefinish

{url: urlString, canBack: true/false, canForward: true/false}

网页加载完成时触发。

titlereceive

{title: title}

收到网页标题时触发。

error

{errorMsg: errorMsg, url: urlString 1080+, canBack: true/false 1080+, canForward: true/false 1080+,errorType: typeInteger 1080+, code:codeInteger 1080+, description: descriptionString 1080+, isAuthorized: true/false 1080+}

网页加载出现错误时触发或者打开的网页中存在错误时触发。

message(1020+)

{message:messageString, url:urlString}

接收到网页发来的消息时触发。

progress(1070+)

{newProgress:newProgressString}

网页加载进度发生改变时触发。

newProgress表示当前加载进度,范围0 ~ 100。

网页中可使用的事件:

名称

参数

描述

system.onmessage(1020+)

string

收到快应用发送的消息时触发。

shouldoverrideurl(1110+)

string

URL即将加载到当前WebView时触发。

应用程序可以限制URL加载到当前WebView。

  • 返回true:中止加载URL到WebView。
  • 返回false:继续加载URL到WebView。
说明:

如果返回布尔值以外的任何内容,则默认返回false。

pagestart事件新增返回参数(1080+):

参数

类型

说明

canBack

boolean

是否可以向后浏览。

canForward

boolean

是否可以向前浏览。

error事件新增返回参数(1080+):

参数

返回值类型

描述

url

string

WebView加载资源出错时,访问当前资源的链接地址。

canBack

boolean

WebView加载资源出错时,当前的WebView是否可以向后浏览。

canForward

boolean

WebView加载资源出错时,当前的WebView是否可以向前浏览。

errorType

integer

WebView加载资源出错时,当前错误所属的类型,取值如下:

  • 0:通用错误
  • 1:http错误
  • 2:证书错误

code

integer

WebView加载资源出错时返回的错误码,例如:404、500。

description

string

WebView加载资源出错时提示消息的描述。

isAuthorized

boolean

WebView加载资源出错时,当前的异常域名是否已经授权。

方法

名称

参数

描述

reload

-

重新加载页面。

forward

-

浏览历史页面中的前一个页面。

back

-

浏览历史页面中的后一个页面。

canForward

{callback: Function}

是否可以向前浏览。

canBack

{callback: Function}

是否可以向后浏览。

postMessage(1020+)

{message:messageString, success: Function (1100+) , fail: Function (1100+) }

向网页发送消息。

网页中可使用的方法(1020+):

名称

参数

描述

system.postMessage

string

发送到快应用的消息。

canForward回调函数返回参数:

名称

返回值类型

描述

canForward

boolean

是否可以向前浏览。

canBack回调函数返回参数:

名称

返回值类型

描述

canBack

boolean

是否可以向后浏览。

postMessage的参数说明(1100+):

名称

类型

是否必填

描述

message(1020+)

string

是

向网页发送的信息。

success(1100+)

function

否

发送成功的回调函数。

fail(1100+)

function

否

发送失败的回调函数。

Web组件支持全屏播放能力(1030+)。当全屏播放时,需要调用back方法才能退出全屏。如果您的快应用中的web组件已经对返回键进行了处理(当canBack时调用web组件的back),不需要额外处理。如果没有处理返回键事件,需要增加处理(示例代码如下),以实现全屏时点击返回键切回非全屏状态。

onBackPress() {
    this.$element('web').canBack({
        callback: function (e) {
            if (e) {
                this.$element('web').back();
            } else {
                router.back();
            }
        }.bind(this)
    });
    return true;
}

相关接口

在 web 打开的网页中支持以下jssdk接口:

名称

参数

描述

getEnv(1100+)

{ data:{quickapp:Boolean} }

检测是否在快应用环境。

scan(1100+)

{ scanType:int, success:Function, fail:Function, cancel:Function, complete:Function }

快应用扫一扫功能。

示例代码

window.hap.getEnv(data => {
  console.log(data.quickapp)
})

window.hap.scan({
  scanType: 0, success: (data) => {
    console.log(`handling success: ${data.result}`)
  }, fail: (data, code) => {
    console.log(`handling fail, code = ${code}`)
  }, cancel: () => {
    console.log('cancel')
  }, complete: () => {
    console.log('complete')
  }
})

示例代码

<template>
    <div class="container">        
        <div class="titleBar">            
            <text class="titleBar-text" onclick="back">返回</text>>          
            <text class="titleBar-text">
                {{title}}
            </text>          
            <text class="titleBar-text" onclick="refresh">刷新</text>>
        </div>
        <web class="web-page" src="{{websrc}}" trustedurl="{{list}}" onpagestart="onPageStart" onpagefinish="onPageFinish" ontitlereceive="onTitleReceive"
            onerror="onError" onmessage="onMessage" id="web" whiteDomain="{{domainList}}" intercepturl="{{interceptlist}}  onshouldoverrideurl="shouldOverrideUrl" onintercepturl="intercepturl"></web>       
    </div>
</template>
<style>  
    .container {
      flex-direction: column;
    }
    .titleBar {
        flex-direction: row;
        justify-content: space-between;
        padding: 10px;
        height: 100px;
        width: 100%;   
        background-color: #a9a9a9;    
    }    
    .titleBar-text {
        lines: 1;
        text-overflow: ellipsis;  
        font-size: 40px;
        color: #000000;
        align-content: center;
    }
    .web-page {
        width: 100%;
        height: 800px;
    }    
</style>
<script>
    import router from "@system.router"
    import prompt from '@system.prompt'
    export default {
        data: {
            title: "",
            websrc: 'https://developer.huawei.com/consumer/cn/service/hms/fastapp.html',
            arrowRightShow: true,
            isRefreshing: false,
            list: [/.*/, "new RegExp('https?.*')"],
            // list: [/.*/],
            domainList: ['*.huawei.com'],
            interceptlist: ['https://consumer.huawei.com/en/worldwide/],
            msg: ''
        },
        onInit() {
            this.$on('arrowLeft', this.arrowLeftIcon)
            this.$on('arrowRight', this.arrowRightIcon)
            console.info('websrc: ' + this.websrc)
        },
        onPageStart(e) {
            this.isRefreshing = false;
            console.info('pagestart: ' + 'url is: ' + e.url, ' can go back: ' + e.canBack, ' can go forward: ' + e.canForward)
        },
        // 每次页面的切换会触发
        onPageFinish(e) {
            // console.info('pagefinish: '+e.url, e.canBack, e.canForward)
            // 根据数据是否可以前进历史页面,隐藏右侧图标
            this.arrowRightShow = e.canForward;
        },
        onTitleReceive(e) {
            console.error('onTitleReceive', e.title);
            this.title = e.title;
        },
        onError() {
            console.info('pageError.'+ 'errorMsg: ' + e.errorMsg + ' url is: ' + e.url + ' can go back: ' + e.canBack + ' can go forward: ' + e.canForward + ' errorType: ' + e.errorType + ' code: ' + e.code + ' description: ' + e.description + ' isAuthorized: ' + e.isAuthorized)
        },
        onMessage(e) {
            console.info('onmessage e = ' + e.message + ", url = " + e.url);
            this.msg = e.message;
            // prompt.showToast({
            //      message: e.message + ': ' + e.url
            // })
        },
       shouldOverrideUrl(e) {  
            if (e.url.includes('training')) {  
                prompt.showToast({  
                  message: '[shouldOverrideUrl] URL intercepted: ' + e.url,  
                  duration: 2000,  
                  gravity: 'center'  
                });  
                return true;  
            }  
            return false;  
        },  
       intercepturl(e) {  
                prompt.showToast({  
                  message: '[intercepturl] URL intercepted: ' + e.url,  
                  duration: 2000,  
                  gravity: 'center'  
                });    
            } 
        },
        arrowLeftIcon() {
            this.isCanBack();
        },
        arrowRightIcon() {
            this.isCanForward();
        },
        isCanForward() {
            this.$element('web').canForward({
                callback: function (e) {
                    if (e) {
                        this.$element('web').forward();
                    }
                }.bind(this)
            })
        },
        isCanBack() {
            this.$element('web').canBack({
                callback: function (e) {
                    if (e) {
                        this.$element('web').back();
                    } else {
                        router.back();
                    }
                }.bind(this)
            })
        },
        back() {
            this.$dispatch("arrowLeft");
        },
        next() {
            this.$dispatch('arrowRight');
        },
        refresh: function (e) {
            this.$element('web').reload();
        },
        sendMessage: function () {
            this.$element('web').postMessage({ message: 'message to Web page' });
        }
    }
</script>

版本更新说明

版本

发布日期

描述

1110

2024-02-07

  • 新增支持加载本地网页。
  • 新增whiteDomain属性,用于检查加载url的域。
  • 新增intercepturl属性,用于设置需要拦截的url。
  • 新增shouldoverrideurl事件,用于限制URL加载到当前WebView。
  • 新增intercepturl事件,用于检测被拦截的URL。

1100

2022-07-07

  • postMessage方法新增success与fail回调,增加与H5双向通信时的异常处理逻辑。
  • 快应用引擎新增jssdk接口。

1090

2022-05-19

支持html5页面中input标签的capture属性。

1080

2021-12-28

  • 新增pagestart事件的返回参数。
  • 新增error事件的返回参数。

1070

2020-05-19

  • 新增 supportzoom 属性,用于控制网页是否支持放大缩小。
  • 新增 showloadingdialog 属性,用于控制是否展示加载进度条。
  • 新增 algorithmsforlayout、wideviewport、overviewmodeinload 属性,用于透传webview的能力,辅助开发者适配手机上展示的效果。
  • 新增 multiwindow、jumppolicy、openinbrowserurl 属性,用于控制web组件多窗口行为。
  • 新增 xrequestedwithpolicy 属性,用于控制web组件发送http/https请求的头域x-requested-with的值。
  • 新增 fullscreendirection 属性,用于控制web组件全屏时屏幕的方向。

1040

2019-06-24

支持H5页面input标签的拍照、录视频、录音频,支持音频、视频、图片文件的选择。

1030

2018-10-31

  • 新增allowthirdpartycookies属性,用于设置是否支持跨域cookies传递。
  • 新增支持全屏播放web组件中的视频。
  • 如果原web组件没有对返回键进行处理,开发者需要新增返回键处理以实现全屏后点击返回键能够恢复非全屏状态。

1020

2018-06-20

  • 新增了文件下载能力。
  • 新增onmessage事件和postMessage方法,可实现网页与快应用双向通讯数据能力。

Tips

相关链接

[h2]FAQ

[h2]案例