HarmonyOS 鸿蒙Next:点击web组件上已展示的H5页面,拦截跳转地址并打开新webpage页面

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:点击web组件上已展示的H5页面,拦截跳转地址并打开新webpage页面

需求:首页table对应的组件是一个web组件,希望点击H5页面内的元素,跳转时候拦截,打开一个新的webPage(而不是在当前的web组件堆栈内)。

测试结果:在web组件onLoadIntercept中进行拦截,发现如果直接拦截的话,table对应的web组件首次加载H5时候无反应(空白),而是直接触发拦截直接跳转了webpage了,webpage关闭后,发现tableweb组件是空白状态。
测试过程:过程中发现onLoadIntercept监听只能触发一下,如果当前给设置成拦截,那么后面都会被拦截,且点击H5页面元素时也不会再触发。如果设置成不拦截,那就再这次流程中无法再拦截了,只能重新打开web才行。

核心代码:
.onLoadIntercept((event) => {
if(event){
return this.onLoadIntercept && this.onLoadIntercept(event.data.getRequestUrl());
}else{
return false
}
})
//拦截中处理跳转
:(url)=>{
//如果是scheme必须拦截
if(url.indexOf(‘alipay://’) === 0){
SchemeHelper.open(url)
return true
}else{
//打开新的webviewPage
router.pushUrl({
url: RouterPageConstant.WebView,
params:{
url:url,
addParam:true
}
})
return true
}
},

附件介绍:
附件中安卓跳转是理想的效果,点击‘丸子生活’的H5页面内元素,打开了新的webActivity页面。鸿蒙端暂时找不到好的思路。

问题:
如何拦截web跳转,请问如何实现跟安卓一样的效果。求大佬解救啊



关于HarmonyOS 鸿蒙Next:点击web组件上已展示的H5页面,拦截跳转地址并打开新webpage页面的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。

6 回复
页面加载后点击跳转,正常会请求新的html资源 ,可以用onInterceptRequest来监听资源的加载,
onInterceptRequest,只要当前web加载资源就会走这个方法,web中跳转肯定也要加载资源,可以尝试通过这个里面来处理(过滤 .html文件应该还是可以的,但是有个问题就是如果web页要使用你的token、cookies可能麻烦一些)

首先感谢大佬耐心回答问题,华为那边给了技术方案了,我这边验证过了,使用onOverrideUrlLoading拦截,可以达到我的要的效果,但是我看文档中提及:iframe加载HTTP(s)协议或about:blank时不会触发该回调,加载非HTTP(s)协议的跳转可以触发。 有这个限制,恰好我们app加载的h5页面就是这种限制,触发不了onOverrideUrlLoading()回调,我也是实在没有别的办法解决了,只能尝试让h5的同事看能否兼容处理一下了

HarmonyOS的分布式文件系统让我在多设备间传输文件变得轻松无比。

1. 拦截就是onLoadIntercept中拦截

2. 打开新的ability可以通过startAbility来实现let want:Want = { } ; this.context.startAbility(want);但是不建议这么干,单独的ability后台会出现多个应用窗口,而且跳转动画并不是太好,可以使用import动态引入page,来实现跳转新页面

3.在web页中打开的实现,可以在web组件中通过registerJavaScriptProxy注册可以使前端调用的方法,来调用 2.中的实现

4.打开新的web页面则可以通过动态引入的方式引入你的web组件,这样你就有了一个可以复用的通用web容器,需要注意的是没打开一个web页面都需要为web容器注入一次你的方法(因为每个容器都是独立的)

您好大佬,您说第条通过注册registerJavaScriptProxy JS方法供前端调用,这个不适用我的场景,因为这个web组件加载的H5是未知的,如果我们自研的页面可以解决,但是H5可能是三方的页面,他们肯定不会 触发js的,所以我才要拦截H5页面内所有的跳转,用新的webpage打开,您说的第4条我目前是已经封装的了,目前我tabar对应的是webviewA组件, 我的webPage页面内引入了webviewA组件。两者唯一不通就是,一个是组件内展示H5,一个是page内使用组件展示H5。

另外有个问题咨询一下大佬,web组件首次加载H5的时候会触发onLoadIntercept()回调(这个时候就必须选择拦截/不拦截),页面展示出来以后,点击H5内的元素跳转,就不会再触发onLoadIntercept()了,这个不是每次跳转都能拦截吗?只能拦截首次加载?我这边也有尝试了onOverrideUrlLoading(),但是这个onOverrideUrlLoading()触发机制很奇怪,首次加载和页面跳转都不会触发。

回到顶部