码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 鸿蒙HarmonyOS实战-Web组件(基本使用和属性)


    合集 - 鸿蒙入门实战全套(核心知识点)(54)
    1.鸿蒙HarmonyOS实战-ArkTS语言(基本语法)03-202.鸿蒙HarmonyOS实战-ArkTS语言(状态管理)03-213.鸿蒙HarmonyOS实战-ArkTS语言(渲染控制)03-214.鸿蒙HarmonyOS实战-ArkUI组件(Row/Column)03-225.鸿蒙HarmonyOS实战-ArkUI组件(Stack)03-236.鸿蒙HarmonyOS实战-ArkUI组件(Flex)03-247.鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)03-258.鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)03-269.鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)03-2710.鸿蒙HarmonyOS实战-ArkUI组件(List)03-2911.鸿蒙HarmonyOS实战-ArkUI组件(Grid/GridItem)03-2912.鸿蒙HarmonyOS实战-ArkUI组件(Swiper)03-3013.鸿蒙HarmonyOS实战-ArkUI组件(Button)04-0114.鸿蒙HarmonyOS实战-ArkUI组件(Radio)04-0215.鸿蒙HarmonyOS实战-ArkUI组件(Toggle)04-0216.鸿蒙HarmonyOS实战-ArkUI组件(Progress)04-0317.鸿蒙HarmonyOS实战-ArkUI组件(Text/Span)04-0318.鸿蒙HarmonyOS实战-ArkUI组件(TextInput/TextArea)04-0719.鸿蒙HarmonyOS实战-ArkUI组件(CustomDialog)04-0820.鸿蒙HarmonyOS实战-ArkUI组件(Video)04-0921.鸿蒙HarmonyOS实战-ArkUI组件(Popup)04-1022.鸿蒙HarmonyOS实战-ArkUI组件(Menu)04-1123.鸿蒙HarmonyOS实战-ArkUI组件(页面路由)04-1224.鸿蒙HarmonyOS实战-ArkUI组件(Navigation)04-1325.鸿蒙HarmonyOS实战-ArkUI组件(Tabs)04-1526.鸿蒙HarmonyOS实战-ArkUI组件(Image)04-1627.鸿蒙HarmonyOS实战-ArkUI组件(Shape)04-1728.鸿蒙HarmonyOS实战-ArkUI组件(Canvas)04-1829.鸿蒙HarmonyOS实战-ArkUI动画(布局更新动画)04-1930.鸿蒙HarmonyO实战-ArkUI动画(组件内转场动画)04-2031.鸿蒙HarmonyOS实战-ArkUI动画(放大缩小视图)04-2332.鸿蒙HarmonyOS实战-ArkUI动画(页面转场动画)04-2433.鸿蒙HarmonyOS实战-ArkUI事件(触屏事件)04-2534.鸿蒙HarmonyOS实战-ArkUI事件(键鼠事件)04-2635.鸿蒙HarmonyOS实战-ArkUI事件(焦点事件)05-0736.鸿蒙HarmonyOS实战-ArkUI事件(手势方法)05-0837.鸿蒙HarmonyOS实战-ArkUI事件(单一手势)05-0938.鸿蒙HarmonyOS实战-ArkUI事件(组合手势)05-1239.鸿蒙HarmonyOS实战-Stage模型(概述和组件配置)05-1340.鸿蒙HarmonyOS实战-Stage模型(UIAbility组件)05-1441.鸿蒙HarmonyOS实战-Stage模型(ExtensionAbility组件)05-1542.鸿蒙HarmonyOS实战-Stage模型(服务卡片介绍和运行机制)05-1643.鸿蒙HarmonyOS实战-Stage模型(服务卡片的模块和创建)05-1744.鸿蒙HarmonyOS实战-Stage模型(开发卡片页面)05-1845.鸿蒙HarmonyOS实战-Stage模型(开发卡片事件)05-2046.鸿蒙HarmonyOS实战-Stage模型(卡片数据交互)05-2147.鸿蒙HarmonyOS实战-Stage模型(AbilityStage组件容器)05-2248.鸿蒙HarmonyOS实战-Stage模型(应用上下文Context)05-2349.鸿蒙HarmonyOS实战-Stage模型(信息传递载体Want)05-2450.鸿蒙HarmonyOS实战-Stage模型(进程模型)05-2551.鸿蒙HarmonyOS实战-Stage模型(线程模型)05-27
    52.鸿蒙HarmonyOS实战-Web组件(基本使用和属性)05-28
    53.鸿蒙HarmonyOS实战-Web组件(前端函数和应用侧函数相互调用)05-2954.鸿蒙HarmonyOS实战-Web组件(页面跳转和浏览记录)05-30
    收起

    🚀前言

    Web是一种基于互联网的技术和资源的网络服务系统。它是指由许多互连的计算机组成的全球性计算机网络,使用户能够通过浏览器访问和交互式使用各种信息和资源,如网页、文档、图片、视频、音频等。通过Web,用户可以浏览网页、发送电子邮件、参与在线社交网络、进行在线购物等各种活动。Web的核心技术包括超文本传输协议(HTTP),超文本标记语言(HTML)和统一资源定位器(URL)。

    🚀一、Web组件详解

    🔎1.概述

    HarmonyOS中的Web组件是一种基于Web技术的组件,可以在HarmonyOS应用程序中嵌入Web内容。通过使用Web组件,开发人员可以将Web页面或应用程序嵌入到HarmonyOS应用程序中,实现更丰富的用户界面和功能。

    Web组件提供了一系列的API和工具,开发人员可以使用这些API和工具来控制和操作内嵌的Web页面。例如,开发人员可以使用JavaScript和CSS来操作和样式化Web页面的元素,还可以使用HTML5的各种功能来实现各种交互和媒体功能。

    Web组件还支持与HarmonyOS应用程序的其他部分进行通信和交互。开发人员可以使用JavaScript和HarmonyOS的API来实现应用程序的功能,例如访问设备的传感器、调用系统的功能等。此外,Web组件还可以通过与应用程序的其他组件进行交互来实现更复杂的功能,例如在应用程序的其他组件中显示Web页面的内容、发送和接收消息等。

    image

    🔎2.使用Web组件加载页面

    🦋2.1 加载网络页面

    1、权限配置

    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET" // 使用网络权限
      }
    ]
    

    image

    2、加载网页

    import web_webview from '@ohos.web.webview'
    
    @Entry
    @Component
    struct WebComponent {
      controller: web_webview.WebviewController = new web_webview.WebviewController()
      build() {
        Column() {
          Button('愚公博客首页')
            .onClick(() => {
              try {
                // 点击按钮时,通过loadUrl,跳转到www.example1.com
                this.controller.loadUrl('blog.csdn.net/aa2528877987');
              } catch (error) {
                console.error(`ErrorCode: ${error.code},  Message: ${error.message}`);
              }
            })
          // 组件创建时,加载www.example.com
          Web({ src: 'www.baidu.com', controller: this.controller})
        }
      }
    }
    

    image

    image

    🦋2.2 加载本地页面

    1、ets 文件

    // xxx.ets
    import web_webview from '@ohos.web.webview';
    
    @Entry
    @Component
    struct WebComponent {
      webviewController: web_webview.WebviewController = new web_webview.WebviewController();
    
      build() {
        Column() {
          Button('loadUrl')
            .onClick(() => {
              try {
                // 点击按钮时,通过loadUrl,跳转到local1.html
                this.webviewController.loadUrl($rawfile("local1.html"));
              } catch (error) {
                console.error(`ErrorCode: ${error.code},  Message: ${error.message}`);
              }
            })
          // 组件创建时,通过$rawfile加载本地文件local.html
          Web({ src: $rawfile("local.html"), controller: this.webviewController })
        }
      }
    }
    

    2、本地页面

    
    html>
    <html>
      <body>
        <p>Hello Worldp>
      body>
    html>
    

    image

    🦋2.3 加载HTML格式的文本数据

    // xxx.ets
    import web_webview from '@ohos.web.webview';
    
    @Entry
    @Component
    struct WebComponent {
      controller: web_webview.WebviewController = new web_webview.WebviewController();
    
      build() {
        Column() {
          Button('loadData')
            .onClick(() => {
              try {
                // 点击按钮时,通过loadData,加载HTML格式的文本数据
                this.controller.loadData(
                  "Source:
    source
    "
    , "text/html", "UTF-8" ); } catch (error) { console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); } }) // 组件创建时,加载www.example.com Web({ src: 'www.example.com', controller: this.controller }) } } }

    image

    🔎3.设置基本属性和事件

    🦋3.1 设置深色模式

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

    • WebDarkMode.Off模式表示关闭深色模式。

    • WebDarkMode.On表示开启深色模式,且深色模式跟随前端页面。

    • WebDarkMode.Auto表示开启深色模式,且深色模式跟随系统。

    • forceDarkAccess()接口可将前端页面强制配置深色模式,且深色模式不跟随前端页面和系统。配置该模式时候,需要将深色模式配置成WebDarkMode.On。

    // xxx.ets
    import web_webview from '@ohos.web.webview';
    
    @Entry
    @Component
    struct WebComponent {
      controller: web_webview.WebviewController = new web_webview.WebviewController();
      @State mode: WebDarkMode = WebDarkMode.On;
      @State access: boolean = true;
      build() {
        Column() {
          Web({ src: 'www.example.com', controller: this.controller })
            .darkMode(this.mode)
            .forceDarkAccess(this.access)
        }
      }
    }
    

    image

    🦋3.2 上传文件

    HarmonyOS中Web组件的onShowFileSelector()方法用于显示文件选择器,让用户选择文件。它可以用于在应用中上传文件或选择本地文件等操作。

    // xxx.ets
    import web_webview from '@ohos.web.webview';
    @Entry
    @Component
    struct WebComponent {
      controller: web_webview.WebviewController = new web_webview.WebviewController()
      build() {
        Column() {
          // 加载本地local.html页面
          Web({ src: $rawfile('local.html'), controller: this.controller })
            .onShowFileSelector((event) => {
                // 开发者设置要上传的文件路径
               let fileList: Array<string> = [
                  'xxx/test.png',
               ]
               event.result.handleFileList(fileList)
               return true;
            })
        }
      }
    }
    
    html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Documenttitle>
    head>
    
    <body>
    // 点击文件上传按钮
    <input type="file" value="file">br>
    body>
    html>
    

    image

    🦋3.3 在新窗口中打开页面

    开发者可以使用multiWindowAccess()接口来设置网页是否可以在新窗口中打开。通过调用此接口并传入相应的参数,可以控制网页是否允许使用新窗口。

    当网页请求在新窗口中打开时,应用将收到Web组件的新窗口事件,可以通过onWindowNew()接口来处理此事件。在此接口中,开发者可以根据需要创建新的窗口来处理Web组件的窗口请求。

    // xxx.ets
    import web_webview from '@ohos.web.webview'
    
    //在同一page页有两个web组件。在WebComponent新开窗口时,会跳转到NewWebViewComp。
    @CustomDialog
    struct NewWebViewComp {
    controller?: CustomDialogController
    webviewController1: web_webview.WebviewController = new web_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: web_webview.WebviewController = new web_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:web_webview.WebviewController = new web_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)
            })
        }
      }
    }
    
     html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>WindowEventtitle>
    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("

    这是我的窗口

    "
    ); openedWindow.focus(); }
    script> body> html>

    🦋3.4 管理位置权限

    对于某个网站进行位置权限管理的过程中,开发者可以通过onGeolocationShow()接口来向用户请求位置权限。该接口会触发一个位置权限请求对话框,用户可以选择是否授权该网站获取设备的位置信息。

    Web组件会根据用户的选择,将权限授予或拒绝。如果权限被授予,前端页面将能够获取设备的位置信息。如果权限被拒绝,前端页面将无法获取设备的位置信息。

    在进行位置权限请求之前,开发者需要在应用的配置文件中添加ohos.permission.LOCATION权限,以确保应用有权限获取设备的位置信息。

    html>
    <html>
    <body>
    <p id="locationInfo">位置信息p>
    <button onclick="getLocation()">获取位置button>
    <script>
    var locationInfo=document.getElementById("locationInfo");
    function getLocation(){
      if (navigator.geolocation) {
        
        navigator.geolocation.getCurrentPosition(showPosition);
      }
    }
    function showPosition(position){
      locationInfo.innerHTML="Latitude: " + position.coords.latitude + "<br />Longitude: " + position.coords.longitude;
    }
    script>
    body>
    html>
    
    // xxx.ets
    import web_webview from '@ohos.web.webview';
    
    @Entry
    @Component
    struct WebComponent {
      controller: web_webview.WebviewController = new web_webview.WebviewController();
      build() {
        Column() {
          Web({ src:$rawfile('getLocation.html'), controller:this.controller })
            .geolocationAccess(true)
            .onGeolocationShow((event) => {  // 地理位置权限申请通知
              AlertDialog.show({
                title: '位置权限请求',
                message: '是否允许获取位置信息',
                primaryButton: {
                  value: 'cancel',
                  action: () => {
                    event.geolocation.invoke(event.origin, false, false);   // 不允许此站点地理位置权限请求
                  }
                },
                secondaryButton: {
                  value: 'ok',
                  action: () => {
                    event.geolocation.invoke(event.origin, true, false);    // 允许此站点地理位置权限请求
                  }
                },
                cancel: () => {
                  event.geolocation.invoke(event.origin, false, false);   // 不允许此站点地理位置权限请求
                }
              })
            })
        }
      }
    }
    

    🚀写在最后

    • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
    • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
    • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
    • 更多鸿蒙最新技术知识点,请关注作者博客:https://t.doruo.cn/14DjR1rEY

    image

  • 相关阅读:
    移动端适配单位vw和px的转换
    Vue3+Typescript学习笔记(九)组件通信--父子组件通信(props,$emit)
    Linux sudo -i取消密码的方法
    自己动手写RTOS:02-在M3内核上实现pendsvc
    Socks5代理IP在跨境电商与游戏中的应用
    学会这些Jmeter插件,才能设计出复杂性能测试场景
    Spring、Spring MVC、Spring boot、Spring Cloud面试题(史上最全面试题,精心整理100家互联网企业,面试必过)
    【LeetCode19. 删除链表的倒数第 N 个结点】——链表,快慢双指针,虚拟头结点、利用栈
    leetcode第92场双周赛
    2.单链表练习
  • 原文地址:https://www.cnblogs.com/shudaoshan/p/18219057
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号