1# 在新窗口中打开页面 2 3 4Web组件提供了在新窗口打开页面的能力,开发者可以通过[multiWindowAccess()](../reference/arkui-ts/ts-basic-components-web.md#multiwindowaccess9)接口来设置是否允许网页在新窗口打开。当有新窗口打开时,应用侧会在[onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9)接口中收到Web组件新窗口事件,开发者需要在此接口事件中,新建窗口来处理Web组件窗口请求。 5 6 7> **说明:** 8> 9> - [allowWindowOpenMethod()](../reference/arkui-ts/ts-basic-components-web.md#allowwindowopenmethod10)接口设置为true时,前端页面通过JavaScript函数调用的方式打开新窗口。 10> 11> - 如果开发者在[onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9)接口通知中不需要打开新窗口,需要将[ControllerHandler.setWebController()](../reference/arkui-ts/ts-basic-components-web.md#setwebcontroller9)接口返回值设置成null。 12 13 14如下面的本地示例,当用户点击“新窗口中打开网页”按钮时,应用侧会在[onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9)接口中收到Web组件新窗口事件。 15 16 17- 应用侧代码。 18 19 ```ts 20 // xxx.ets 21 import web_webview from '@ohos.web.webview' 22 23 //在同一page页有两个web组件。在WebComponent新开窗口时,会跳转到NewWebViewComp。 24 @CustomDialog 25 struct NewWebViewComp { 26 controller?: CustomDialogController 27 webviewController1: web_webview.WebviewController = new web_webview.WebviewController() 28 build() { 29 Column() { 30 Web({ src: "", controller: this.webviewController1 }) 31 .javaScriptAccess(true) 32 .multiWindowAccess(false) 33 .onWindowExit(()=> { 34 console.info("NewWebViewComp onWindowExit") 35 if (this.controller) { 36 this.controller.close() 37 } 38 }) 39 } 40 } 41 } 42 43 @Entry 44 @Component 45 struct WebComponent { 46 controller: web_webview.WebviewController = new web_webview.WebviewController() 47 dialogController: CustomDialogController | null = null 48 build() { 49 Column() { 50 Web({ src:$rawfile("window.html"), controller: this.controller }) 51 .javaScriptAccess(true) 52 //需要使能multiWindowAccess 53 .multiWindowAccess(true) 54 .allowWindowOpenMethod(true) 55 .onWindowNew((event) => { 56 if (this.dialogController) { 57 this.dialogController.close() 58 } 59 let popController:web_webview.WebviewController = new web_webview.WebviewController() 60 this.dialogController = new CustomDialogController({ 61 builder: NewWebViewComp({webviewController1: popController}) 62 }) 63 this.dialogController.open() 64 //将新窗口对应WebviewController返回给Web内核。 65 //如果不需要打开新窗口请调用event.handler.setWebController接口设置成null。 66 //若不调用event.handler.setWebController接口,会造成render进程阻塞。 67 event.handler.setWebController(popController) 68 }) 69 } 70 } 71 } 72 ``` 73 74 75- window.html页面代码。 76 77 ```html 78 <!DOCTYPE html> 79 <html> 80 <head> 81 <meta charset="utf-8"> 82 <title>WindowEvent</title> 83 </head> 84 <body> 85 <input type="button" value="新窗口中打开网页" onclick="OpenNewWindow()"> 86 <script type="text/javascript"> 87 function OpenNewWindow() 88 { 89 let openedWindow = window.open("about:blank", "", "location=no,status=no,scrollvars=no"); 90 openedWindow.document.write("<p>这是我的窗口</p>"); 91 openedWindow.focus(); 92 93 } 94 </script> 95 </body> 96 </html> 97 ``` 98## 相关实例 99 100针对创建新窗口,有以下相关实例可供参考: 101 102- [浏览器(ArkTS)(Full SDK)(API9)](https://gitee.com/openharmony/applications_app_samples/tree/monthly_20230815/code/BasicFeature/Web/Browser)