鸿蒙NEXT版实战开发:ArkWeb设置基本属性和事件(在新窗口中打开页面)

往期鸿蒙全套实战精彩文章必看内容:


在新窗口中打开页面

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

说明

如下面的本地示例,当用户点击“新窗口中打开网页”按钮时,应用侧会在onWindowNew()接口中收到Web组件新窗口事件。

  • 应用侧代码。

    // xxx.ets
    import { webview } from '@kit.ArkWeb';
    
    // 在同一page页有两个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.info("NewWebViewComp onWindowExit");
              if (this.controller) {
                this.controller.close();
              }
            })
        }
      }
    }
    
    @Entry
    @Component
    struct WebComponent {
      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 })
              })
              this.dialogController.open();
              // 将新窗口对应WebviewController返回给Web内核。
              // 如果不需要打开新窗口请调用event.handler.setWebController接口设置成null。
              // 若不调用event.handler.setWebController接口,会造成render进程阻塞。
              event.handler.setWebController(popController);
            })
        }
      }
    }
  • window.html页面代码。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>WindowEvent</title>
    </head>
    <body>
    <input type="button" value="新窗口中打开网页" onclick="OpenNewWindow()">
    <script type="text/javascript">
        function OpenNewWindow()
        {
            let openedWindow = window.open("about:blank", "", "location=no,status=no,scrollvars=no");
            openedWindow.document.write("<p>这是我的窗口</p>");
            openedWindow.focus();
        }
    </script>
    </body>
    </html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值