HarmonyOS:ArkWeb在新窗口中打开页面

一、概述

Web组件提供了在新窗口打开页面的能力,开发者可以通过multiWindowAccess ()接口来设置是否允许网页在新窗口打开。当有新窗口打开时,应用侧会在onWindowNew()接口中收到Web组件新窗口事件。开发者需要在此接口事件中新建窗口来处理Web组件的窗口请求。
说明

  • allowWindowOpenMethod()接口设置为true时,前端页面通过JavaScript函数调用的方式打开新窗口。
  • 当在Web页面调用window.open(url, name)打开新窗口时,ArkWeb内核会根据name查找是否存在已绑定的Web组件。若存在,该Web组件将收到onActivateContent()接口通知,以便应用可将其展示至前台;若不存在,ArkWeb内核将通过onWindowNew()接口通知应用创建新窗口。
  • 如果在onWindowNew()接口通知中创建了新窗口,并将ControllerHandler.setWebController()接口的参数设置为新Web组件的WebviewController,则ArkWeb内核会完成name与该新Web组件的绑定。
  • 如果在onWindowNew()接口通知中没有创建新窗口,需要将ControllerHandler.setWebController()接口的参数设置为null。
    在下面的本地示例中,当用户点击"新窗口中打开网页"按钮时,应用会在onWindowNew()接口收到Web组件的新窗口事件。
    说明 网页要求用户创建新的窗口时触发回调OnWindowNewEvent(),该回调函数中isUserTrigger参数,true代表用户触发,false代表非用户触发。

二、开发示例

示例效果图

示例代码

window.html页面代码。

bash 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width"/>
    <title>WindowEvent</title>
</head>
<body>
<input type="button" value="新窗口中打开网页" onclick="OpenNewWindow()" style="font-size: 30px">
<script type="text/javascript">
    function OpenNewWindow()
    {
        var txt = '打开的窗口';
        let openedWindow = window.open("about:blank", "", "location=no,status=no,scrollbars=no");
<!--        openedWindow.document.write("<p>" + "<br><br>" + txt + "</p>");-->
<!--        openedWindow.document.write('<p style="font-size: 20px;">打开的窗口</p>');-->
        openedWindow.document.write("<br><br>" +'<h1>打开的窗口</h1>');
        openedWindow.focus();
    }
</script>
</body>
</html>

WebonWindowNew.ets代码

bash 复制代码
import { webview } from '@kit.ArkWeb';

// 在同一界面有两个Web组件。在WebComponent新开窗口时,会跳转到NewWebViewComp。
@CustomDialog
struct NewWebViewComp {
  controller?: CustomDialogController;
  webviewController1: webview.WebviewController = new webview.WebviewController();

  build() {
    Column() {
      Web({ src: "", controller: this.webviewController1 })
        .javaScriptAccess(true)
        .multiWindowAccess(false)
        .onWindowExit(() => {
          console.log("NewWebViewComp 回调函数 onWindowExit");
          if (this.controller) {
            this.controller.close();
          }
        })
        .onActivateContent(() => {
          //该Web需要展示到前台,建议应用在这里进行tab或window切换的动作
          console.log("NewWebViewComp 回调函数  onActivateContent")
        })
    }
  }
}

@Entry
@Component
struct WebonWindowNew {
  controller: webview.WebviewController = new webview.WebviewController();
  dialogController: CustomDialogController | null = null;

  build() {
    Column() {
      Web({ src: $rawfile("window.html"), controller: this.controller })
        .javaScriptAccess(true)
        // 需要使能multiWindowAccess
        .multiWindowAccess(true)
        .allowWindowOpenMethod(true)
        .onWindowNew((event) => {
          if (this.dialogController) {
            this.dialogController.close()
          }
          let popController: webview.WebviewController = new webview.WebviewController();
          this.dialogController = new CustomDialogController({
            builder: NewWebViewComp({ webviewController1: popController }),
            // isModal设置为false,防止新窗口被销毁而无法触发onActivateContent回调
            isModal: false
          })
          this.dialogController.open();
          // 将新窗口对应WebviewController返回给Web内核。
          // 若不调用event.handler.setWebController接口,会造成render进程阻塞。
          // 如果没有创建新窗口,调用event.handler.setWebController接口时设置成null,通知Web没有创建新窗口。
          event.handler.setWebController(popController);
        })
    }
  }
}
相关推荐
OH_TPC15 小时前
HarmonyOS APP开发---“动效君“UI动效素材库App,需要用到这个库
ui·华为·harmonyos·鸿蒙
贾伟康19 小时前
HarmonyOS 3DGS 滤镜切换实战:效果创建、参数管理与资源释放
harmonyos·arkts·鸿蒙开发·技术实践·空间化体验
HarmonyOS_SDK19 小时前
【HarmonyOS API 26】分布式数字身份DID:系统级可信身份体系
harmonyos
贾伟康20 小时前
HarmonyOS GSNode 场景控制实战:位置、缩放、可见性与状态同步
harmonyos·arkts·鸿蒙开发·技术实践·空间化体验
redtank200021 小时前
纯血鸿蒙本地音乐播放器开发实战:我爱听歌架构解析
harmonyos
贾伟康21 小时前
HarmonyOS API 26 分块 3DGS 实战:相机驱动、瓦片回调与并发去重
性能优化·harmonyos·arkts·3dgs·spatial recon kit
万物智能信息科技21 小时前
指纹识别传感器驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·华为·开源·harmonyos·鸿蒙
贾伟康1 天前
【共创稿事节】HarmonyOS 7.0 AOT编译优化:从接入到生产验证
harmonyos·arkts·路由·navigation·navdestination
2601_949480061 天前
开源鸿蒙平台 CMP 三方库「shadcn」适配全流程
华为·开源·harmonyos
Liaiyang662 天前
空圈容错视角-HarmonyOS 7 架构体检:从被动容错到主动免疫的真伪验证与生态反推
操作系统·harmonyos·架构设计·ai-agent·端云协同·鸿蒙7·空圈容错