H5跳转到原生页面,监听用户是否返回到H5

本文介绍了一个H5新特性,用于监听页面的展示和隐藏状态,以解决在App内嵌H5中,用户在原生页面完成任务后返回H5自动标识任务完成的问题。通过Document.hidden属性判断页面是否隐藏,可以控制倒计时、视频或音频的暂停播放,实现更顺畅的H5与原生页面交互体验。

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

前言

最近一个需求,app 内嵌的 h5 需要做任务,但是任务是在一个原生的页面中,产品的需求是如果用户做了任务,返回 h5 后,任务自动标识为完成,一般情况下我们这安卓都会有一些操作后的返回监听,但是这次比较特殊,需要前端来做处理。

H5 的一个新特性正好可以监听页面的展示和隐藏

Document.hidden(只读属性)返回布尔值,表示页面是(true)否(false)隐藏。(当为 true 的时候说明页面隐藏了,当为 false 的时候说明展示了)

var hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : 'mozHidden' in document ? 'mozHidden' : 
<think>我们正在讨论鸿蒙系统中从H5页面跳转原生应用页面的技术实现方法。根据引用内容,我们可以总结出几种实现方式:1.**Web组件与原生交互**(引用[2]和引用[3]):-在H5页面中通过JavaScript调用原生方法,原生方法中执行页面跳转。-使用类似DSBridge的跨平台桥接库实现通信。2.**URLScheme跳转**(引用[5]):-在H5页面中通过自定义URLScheme(如`bank1://...`)触发跳转。-原生应用配置`querySchemes`来声明可处理的Scheme。3.**路由拦截管理**(引用[1]中提到的Navigation路由拦截):-在原生端通过路由拦截器处理H5发起的特定路由请求,实现跳转。具体步骤:**方法一:通过JavaScript调用原生方法(推荐)**步骤1:在原生页面(例如`IndexPage.ets`)中,使用Web组件加载H5页面,并注册一个供H5调用的方法(如`jumpToNativePage`):```typescript//在Web组件的controller中注入对象webController.registerJavaScriptProxy({jumpToNativePage:(pageName:string)=>{//执行原生页面跳转逻辑,例如使用router.push跳转到指定页面router.pushUrl({url:pageName});}},'nativeBridge');//'nativeBridge'是H5中调用的对象名```步骤2:在H5页面中,通过`nativeBridge.jumpToNativePage`方法调用原生跳转:```javascript//H5页面中的按钮点击事件functionjumpToOrderConfirm(){//调用原生方法,传入目标页面的路由nativeBridge.jumpToNativePage('pages/OrderConfirmPage');}```**方法二:通过URLScheme跳转**步骤1:在原生应用的`module.json5`中配置`querySchemes`,声明自定义Scheme(如`myapp`):```json"module":{//..."abilities":[{//..."skills":[{"actions":["action.system.home"],"entities":["entity.system.home"],"uris":[{"scheme":"myapp",//自定义Scheme"host":"openpage"}]}]}],"querySchemes":["myapp"]//声明可处理的Scheme}```步骤2:在H5页面中通过链接或重定向触发Scheme:```html<ahref="myapp://openpage/pages/OrderConfirmPage">跳转原生页面</a><!--或使用JS--><script>location.href='myapp://openpage/pages/OrderConfirmPage';</script>```步骤3:在原生应用中,通过`onCreate`或`onNewRequest`中解析URI,根据参数跳转到对应页面(通常在EntryAbility中处理)。**注意事项**:-方法一更灵活,适用于复杂交互。-方法二更通用,但需要处理URL解析和路由映射。-引用[3]提到鸿蒙中异步任务限制,注意桥接方法不要使用异步声明。根据引用[4]的示例工程结构,跳转目标页面(如`OrderConfirmPage.ets`)需要提前开发并配置路由。**示例代码**(基于方法一):```typescript//IndexPage.etsimportwebviewfrom'@ohos.web.webview';importrouterfrom'@ohos.router';@Entry@ComponentstructIndexPage{webController:webview.WebviewController=newwebview.WebviewController();aboutToAppear(){//注册JS代理this.webController.registerJavaScriptProxy({jumpToNative:(url:string)=>{router.pushUrl({url:url});}},'nativeBridge',['jumpToNative']);//加载H5this.webController.loadUrl('https://www.example.com/index.html');}build(){Column(){Web({src:'https://www.example.com/index.html',controller:this.webController})}}}```在H5中调用:```javascript//点击按钮时调用document.getElementById('jumpBtn').addEventListener('click',()=>{nativeBridge.jumpToNative('pages/OrderConfirmPage');});```这样,当用户点击H5按钮时,就会跳转原生的订单确认页面。相关问题:1.鸿蒙中Web组件如何与原生页面进行双向通信?2.使用URLScheme跳转时,如何防止恶意应用劫持?3.鸿蒙路由拦截管理(Navigation)的具体实现步骤是什么?</think>在鸿蒙系统中实现 H5 页面跳转原生页面,主要可通过以下三种技术方案实现: ### 一、JavaScript 桥接调用(推荐方案) **实现原理**:通过 Web 组件的 JavaScript 代理机制建立双向通信通道 ```typescript // 原生页面代码(.ets文件) import webview from '@ohos.web.webview' @Entry @Component struct WebPage { controller: webview.WebviewController = new webview.WebviewController() aboutToAppear() { // 注册JS代理对象 this.controller.registerJavaScriptProxy({ openNativePage: (pageUrl: string) => { router.pushUrl({ url: pageUrl }) // 执行原生跳转 } }, 'nativeBridge', ['openNativePage']) } build() { Column() { // 加载H5页面 Web({ src: "https://your-h5-page.html", controller: this.controller }) } } } ``` ```html <!-- H5页面代码 --> <button onclick="jumpToNative()">跳转原生页</button> <script> function jumpToNative() { // 调用原生注册的方法 nativeBridge.openNativePage("pages/OrderConfirmPage") } </script> ``` ### 二、URL Scheme 跳转方案 **实现步骤**: 1. **配置Scheme**(在`module.json5`中): ```json "abilities": [{ "skills": [{ "uris": [{ "scheme": "harmonyapp", // 自定义协议头 "host": "openpage" // 主机名 }] }] }], "querySchemes": ["harmonyapp"] // 声明可处理的Scheme ``` 2. **H5页面触发跳转**: ```html <a href="harmonyapp://openpage/pages/OrderConfirmPage"> 跳转原生页 </a> <!-- 或JS方式 --> <script> location.href = "harmonyapp://openpage/pages/OrderConfirmPage?orderId=123" </script> ``` 3. **原生路由解析**(在`EntryAbility.ets`中): ```typescript onCreate(want: Want) { if (want?.uri?.scheme === 'harmonyapp') { const path = want.uri.path // 获取/pages/OrderConfirmPage router.pushUrl({ url: path, params: want.uri.queryParameters }) } } ``` ### 三、路由拦截方案 **实现原理**:通过 Navigation 的路由拦截器处理特殊路径 ```typescript // 在路由配置中 Navigation(this.pageName) .onAppear(() => { // 监听H5路由变化 this.webController.on('urlLoadIntercept', (event) => { if (event.url.includes('native://')) { const targetPage = event.url.split('target=')[1] router.pushUrl({ url: decodeURIComponent(targetPage) }) return true // 拦截请求 } return false }) }) ``` ### 方案对比 | **特性** | JS桥接方案 | URL Scheme方案 | 路由拦截方案 | |------------------|---------------------|--------------------|------------------| | 通信实时性 | ⭐⭐⭐⭐ 实时双向通信 | ⭐⭐ 单向触发 | ⭐⭐⭐ 路由监听 | | 参数传递能力 | ⭐⭐⭐⭐ 支持复杂对象 | ⭐⭐⭐ 支持URL参数 | ⭐⭐ 路径参数 | | 跨平台兼容性 | ⭐⭐⭐ 需适配 | ⭐⭐⭐⭐ 通用方案 | ⭐⭐ 鸿蒙专属 | | 安全性 | ⭐⭐⭐⭐ 可控白名单 | ⭐⭐ 需防劫持 | ⭐⭐⭐ 路径校验 | ### 最佳实践建议 1. **关键路径跳转**:使用 JS 桥接方案,确保交互可靠性(如支付流程)[^2] 2. **外部链接跳转**:采用 URL Scheme 实现 App跳转(如第三方网页跳回)[^5] 3. **参数安全处理**: ```typescript // 对传入参数进行过滤 const safePath = path.replace(/[^a-zA-Z0-9_\/-]/g, '') ``` 4. **错误处理**: ```javascript // H5端错误处理 try { nativeBridge.openNativePage(targetPage) } catch (e) { showToast("跳转失败,请更新APP") } ``` > 注意:所有方案都需在`module.json5`中声明所需权限: > ```json > "requestPermissions": [{ > "name": "ohos.permission.INTERNET" > }] > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值