鸿蒙实现Web组件开辟

打印 上一主题 下一主题

主题 827|帖子 827|积分 2481

1、简介&使用场景

Web是一种基于互联网的技术和资源的网络服务体系。它是指由许多互连的计算机组成的环球性计算机网络,使用户能够通过欣赏器访问和交互式使用各种信息和资源,如网页、文档、图片、视频、音频等。通过Web,用户可以欣赏网页、发送电子邮件、参与在线社交网络、进行在线购物等各种运动。Web的焦点技术包括超文本传输协议(HTTP),超文本标记语言(HTML)和同一资源定位器(URL)。
使用场景:
鸿蒙的应用有时需要集成别的项目H5等入口页面,如html等大概是网络所在的形式;这个就需要使用到鸿蒙加载html页面大概网络所在等。
2、加载网络页面

  1. "requestPermissions": [
  2.   {
  3.     "name": "ohos.permission.INTERNET" // 使用网络权限
  4.   }
  5. ]
复制代码
  1. import web_webview from '@ohos.web.webview'
  2. @Entry
  3. @Component
  4. struct WebComponent {
  5.   controller: web_webview.WebviewController = new web_webview.WebviewController()
  6.   build() {
  7.     Column() {
  8.       Button('愚公博客首页')
  9.         .onClick(() => {
  10.           try {
  11.             // 点击按钮时,通过loadUrl,跳转到www.example1.com
  12.             this.controller.loadUrl('www.example1.com');
  13.           } catch (error) {
  14.             console.error(`ErrorCode: ${error.code},  Message: ${error.message}`);
  15.           }
  16.         })
  17.       // 组件创建时,加载www.example.com
  18.       Web({ src: 'www.baidu.com', controller: this.controller})
  19.     }
  20.   }
  21. }
复制代码
3、加载本地页面

  1. <!-- local.html -->
  2. <!DOCTYPE html>
  3. <html>
  4.   <body>
  5.     <p>Hello World</p>
  6.   </body>
  7. </html>
复制代码
  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6.   webviewController: web_webview.WebviewController = new web_webview.WebviewController();
  7.   build() {
  8.     Column() {
  9.       Button('loadUrl')
  10.         .onClick(() => {
  11.           try {
  12.             // 点击按钮时,通过loadUrl,跳转到local1.html
  13.             this.webviewController.loadUrl($rawfile("index.html"));
  14.           } catch (error) {
  15.             console.error(`ErrorCode: ${error.code},  Message: ${error.message}`);
  16.           }
  17.         })
  18.       // 组件创建时,通过$rawfile加载本地文件local.html
  19.       Web({ src: $rawfile("index.html"), controller: this.webviewController })
  20.     }
  21.   }
  22. }
复制代码
4、加载HTML格式的文本数据

  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6.   controller: web_webview.WebviewController = new web_webview.WebviewController();
  7.   build() {
  8.     Column() {
  9.       Button('loadData')
  10.         .onClick(() => {
  11.           try {
  12.             // 点击按钮时,通过loadData,加载HTML格式的文本数据
  13.             this.controller.loadData(
  14.               "<html><body bgcolor="white">Source:<pre>source</pre></body></html>",
  15.               "text/html",
  16.               "UTF-8"
  17.             );
  18.           } catch (error) {
  19.             console.error(`ErrorCode: ${error.code},  Message: ${error.message}`);
  20.           }
  21.         })
  22.       // 组件创建时,加载www.example.com
  23.       Web({ src: 'www.example.com', controller: this.controller })
  24.     }
  25.   }
  26. }
复制代码
5、设置深色模式

通过darkMode()接口可以设置不同的深色模式。


  • WebDarkMode.Off模式表现关闭深色模式。
  • WebDarkMode.On表现开启深色模式,且深色模式跟随前端页面。
  • WebDarkMode.Auto表现开启深色模式,且深色模式跟随体系。
  • forceDarkAccess()接口可将前端页面强制设置深色模式,且深色模式不跟随前端页面和体系。设置该模式时候,需要将深色模式设置成WebDarkMode.On。
  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6.   controller: web_webview.WebviewController = new web_webview.WebviewController();
  7.   @State mode: WebDarkMode = WebDarkMode.On;
  8.   @State access: boolean = true;
  9.   build() {
  10.     Column() {
  11.       Web({ src: 'www.example.com', controller: this.controller })
  12.         .darkMode(this.mode)
  13.         .forceDarkAccess(this.access)
  14.     }
  15.   }
  16. }
复制代码
6、上传文件

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>Document</title>
  6. </head>
  7. <body>
  8. // 点击文件上传按钮
  9. <input type="file" value="file"></br>
  10. </body>
  11. </html>
复制代码
  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6.   controller: web_webview.WebviewController = new web_webview.WebviewController()
  7.   build() {
  8.     Column() {
  9.       // 加载本地local.html页面
  10.       Web({ src: $rawfile('index.html'), controller: this.controller })
  11.         .onShowFileSelector((event) => {
  12.             // 开发者设置要上传的文件路径
  13.            let fileList: Array<string> = [
  14.               'xxx/test.png',
  15.            ]
  16.            event.result.handleFileList(fileList)
  17.            return true;
  18.         })
  19.     }
  20.   }
  21. }
复制代码
7、在新窗口中打开页面

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>WindowEvent</title>
  6. </head>
  7. <body>
  8. <input type="button" value="新窗口中打开网页" onclick="OpenNewWindow()">
  9. <script type="text/javascript">
  10.     function OpenNewWindow()
  11.     {
  12.         let openedWindow = window.open("about:blank", "", "location=no,status=no,scrollvars=no");
  13.         openedWindow.document.write("<p>这是我的新窗口</p>");
  14.         openedWindow.focus();
  15.     }
  16. </script>
  17. </body>
  18. </html>
复制代码
开辟者可以使用multiWindowAccess()接口来设置网页是否可以在新窗口中打开。通过调用此接口并传入相应的参数,可以控制网页是否允许使用新窗口。
当网页请求在新窗口中打开时,应用将收到Web组件的新窗口事件,可以通过onWindowNew()接口来处理此事件。在此接口中,开辟者可以根据需要创建新的窗口来处理Web组件的窗口请求。
  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview'
  3. //在同一page页有两个web组件。在WebComponent新开窗口时,会跳转到NewWebViewComp。
  4. @CustomDialog
  5. struct NewWebViewComp {
  6. controller?: CustomDialogController
  7. webviewController1: web_webview.WebviewController = new web_webview.WebviewController()
  8. build() {
  9.     Column() {
  10.       Web({ src: "", controller: this.webviewController1 })
  11.         .javaScriptAccess(true)
  12.         .multiWindowAccess(false)
  13.         .onWindowExit(()=> {
  14.           console.info("NewWebViewComp onWindowExit")
  15.           if (this.controller) {
  16.             this.controller.close()
  17.           }
  18.         })
  19.       }
  20.   }
  21. }
  22. @Entry
  23. @Component
  24. struct WebComponent {
  25.     controller: web_webview.WebviewController = new web_webview.WebviewController()
  26.     dialogController: CustomDialogController | null = null
  27.     build() {
  28.       Column() {
  29.         Web({ src:$rawfile("window.html"), controller: this.controller })
  30.           .javaScriptAccess(true)
  31.          //需要使能multiWindowAccess
  32.           .multiWindowAccess(true)
  33.           .allowWindowOpenMethod(true)
  34.           .onWindowNew((event) => {
  35.           if (this.dialogController) {
  36.             this.dialogController.close()
  37.           }
  38.           let popController:web_webview.WebviewController = new web_webview.WebviewController()
  39.           this.dialogController = new CustomDialogController({
  40.             builder: NewWebViewComp({webviewController1: popController})
  41.           })
  42.           this.dialogController.open()
  43.           //将新窗口对应WebviewController返回给Web内核。
  44.           //如果不需要打开新窗口请调用event.handler.setWebController接口设置成null。
  45.           //若不调用event.handler.setWebController接口,会造成render进程阻塞。
  46.           event.handler.setWebController(popController)
  47.         })
  48.     }
  49.   }
  50. }
复制代码
8、管理位置权限

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <p id="locationInfo">位置信息</p>
  5. <button onclick="getLocation()">获取位置</button>
  6. <script>
  7. var locationInfo=document.getElementById("locationInfo");
  8. function getLocation(){
  9.   if (navigator.geolocation) {
  10.     <!-- 前端页面访问设备地理位置 -->
  11.     navigator.geolocation.getCurrentPosition(showPosition);
  12.   }
  13. }
  14. function showPosition(position){
  15.   locationInfo.innerHTML="Latitude: " + position.coords.latitude + "<br />Longitude: " + position.coords.longitude;
  16. }
  17. </script>
  18. </body>
  19. </html>
复制代码
  1. // xxx.ets
  2. import web_webview from '@ohos.web.webview';
  3. @Entry
  4. @Component
  5. struct WebComponent {
  6.   controller: web_webview.WebviewController = new web_webview.WebviewController();
  7.   build() {
  8.     Column() {
  9.       Web({ src:$rawfile('getLocation.html'), controller:this.controller })
  10.         .geolocationAccess(true)
  11.         .onGeolocationShow((event) => {  // 地理位置权限申请通知
  12.           AlertDialog.show({
  13.             title: '位置权限请求',
  14.             message: '是否允许获取位置信息',
  15.             primaryButton: {
  16.               value: 'cancel',
  17.               action: () => {
  18.                 event.geolocation.invoke(event.origin, false, false);   // 不允许此站点地理位置权限请求
  19.               }
  20.             },
  21.             secondaryButton: {
  22.               value: 'ok',
  23.               action: () => {
  24.                 event.geolocation.invoke(event.origin, true, false);    // 允许此站点地理位置权限请求
  25.               }
  26.             },
  27.             cancel: () => {
  28.               event.geolocation.invoke(event.origin, false, false);   // 不允许此站点地理位置权限请求
  29.             }
  30.           })
  31.         })
  32.     }
  33.   }
  34. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表