ui-ts-components-web.md 7.0 KB
Newer Older
L
lixingchi1 已提交
1 2
# Web

L
lixingchi1 已提交
3
Web是提供网页显示能力的组件,具体用法请参考 [Web API](../reference/arkui-ts/ts-basic-components-web.md)
L
lixingchi1 已提交
4 5 6 7 8

## 创建组件

在main/ets/MainAbility/pages目录下的ets文件中创建一个Web组件。在web组件中通过src指定引用的网页路径,controller为组件的控制器,通过controller绑定Web组件,用于调用Web组件的方法。

H
HelloCrease 已提交
9
  ```ts
L
lixingchi1 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
  // xxx.ets
  @Entry
  @Component
  struct WebComponent {
    controller: WebController = new WebController();
    build() {
      Column() {
        Web({ src: 'https://www.example.com', controller: this.controller })
      }
    }
  }
  ```

## 设置样式和属性

Web组件的使用需要添加丰富的页面样式和功能属性。设置height、padding样式可为Web组件添加高和内边距,设置fileAccess属性可为Web组件添加文件访问权限,设置javaScriptAccess属性为true使Web组件具有执行JavaScript代码的能力。

H
HelloCrease 已提交
27
```ts
L
lixingchi1 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
// xxx.ets
@Entry
@Component
struct WebComponent {
  fileAccess: boolean = true;
  controller: WebController = new WebController();
  build() {
    Column() {
      Text('Hello world!')
        .fontSize(20)
      Web({ src: 'https://www.example.com', controller: this.controller })
        // 设置高和内边距
        .height(500)
        .padding(20)
        // 设置文件访问权限和脚本执行权限
        .fileAccess(this.fileAccess)
        .javaScriptAccess(true)
      Text('End')
        .fontSize(20)
    }
  }
}
```
## 添加事件和方法

为Web组件添加onProgressChange事件,该事件回调Web引擎加载页面的进度值。将该进度值赋值给Progress组件的value,控制Progress组件的状态。当进度为100%时隐藏Progress组件,Web页面加载完成。

H
HelloCrease 已提交
55
```ts
L
lixingchi1 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
// xxx.ets
@Entry
@Component
struct WebComponent {
  @State progress: number = 0;
  @State hideProgress: boolean = true;
  fileAccess: boolean = true;
  controller: WebController = new WebController();
  build() {
    Column() {
      Text('Hello world!')
        .fontSize(20)
      Progress({value: this.progress, total: 100})
        .color('#0000ff')
        .visibility(this.hideProgress ? Visibility.None : Visibility.Visible)
L
lixingchi1 已提交
71
      Web({ src: 'https://www.example.com', controller: this.controller })
L
lixingchi1 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
        .fileAccess(this.fileAccess)
        .javaScriptAccess(true)
        .height(500)
        .padding(20)
        // 添加onProgressChange事件
        .onProgressChange(e => {
          this.progress = e.newProgress;
          // 当进度100%时,进度条消失
          if (this.progress === 100) {
            this.hideProgress = true;
          } else {
            this.hideProgress = false;
          }
        })
      Text('End')
        .fontSize(20)
    }
  }
}
```
L
lixingchi1 已提交
92
在onPageEnd事件中添加runJavaScript方法。onPageEnd事件是网页加载完成时的回调,runJavaScript方法可以执行HTML中的JavaScript脚本。当页面加载完成时,触发onPageEnd事件,调用HTML文件中的test方法,在控制台打印信息。
L
lixingchi1 已提交
93

H
HelloCrease 已提交
94
```ts
L
lixingchi1 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
// xxx.ets
@Entry
@Component
struct WebComponent {
  @State progress: number = 0;
  @State hideProgress: boolean = true;
  fileAccess: boolean = true;
  // 定义Web组件的控制器controller
  controller: WebController = new WebController();
  build() {
    Column() {
      Text('Hello world!')
        .fontSize(20)
      Progress({value: this.progress, total: 100})
        .color('#0000ff')
        .visibility(this.hideProgress ? Visibility.None : Visibility.Visible)
      // 初始化Web组件,并绑定controller
L
lixingchi1 已提交
112
      Web({ src: $rawfile('index.html'), controller: this.controller })
L
lixingchi1 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126
        .fileAccess(this.fileAccess)
        .javaScriptAccess(true)
        .height(500)
        .padding(20)
        .onProgressChange(e => {
          this.progress = e.newProgress;
          if (this.progress === 100) {
            this.hideProgress = true;
          } else {
            this.hideProgress = false;
          }
        })
        .onPageEnd(e => {
          // test()在index.html中定义
L
lixingchi1 已提交
127
          this.controller.runJavaScript({ script: 'test()' });
L
lixingchi1 已提交
128 129 130 131 132 133 134 135 136 137 138
          console.info('url: ', e.url);
        })
      Text('End')
        .fontSize(20)
    }
  }
}
```

在main/resources/rawfile目录下创建一个HTML文件。

H
HelloCrease 已提交
139
```html
L
lixingchi1 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152 153
<!-- index.html -->
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<body>
    Hello world!
</body>
<script type="text/javascript">
  function test() {
      console.info('Ark Web Component');
  }
</script>
</html>
```
E
echoorchid 已提交
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183

## 开启网页调试
在PC上启用端口转发,以及设置Web组件属性webDebuggingAccess为true后,便可以在PC上调试通过USB连接的开发设备上的Web组件里的网页。
设置步骤如下:
1、首先设置Web组件属性webDebuggingAccess为true。
  ```ts
  // xxx.ets
  @Entry
  @Component
  struct WebComponent {
    controller: WebController = new WebController()
    build() {
      Column() {
        Web({ src: 'www.example.com', controller: this.controller })
          .webDebuggingAccess(true) // true表示启用调试功能
      }
    }
  }
  ```

2、PC上启用端口转发功能,添加TCP端口9222映射。
  ```ts
  hdc_std fport tcp:9222 tcp:9222
  ```
  添加是否成功可以通过如下命令来查看已存在的映射关系表。
  ```ts
  hdc_std fport ls
  ```
如上设置完成后,首先打开应用Web组件、访问要调试的网页,然后在PC上使用chrome浏览器访问:http://localhost:9222, 就可以在PC上调试开发设备刚才访问的网页。

L
lixingchi1 已提交
184 185
## 场景示例

L
liwenzhen 已提交
186
该场景实现了Web组件中视频的动态播放。首先在HTML页面内嵌入视频资源,再使用Web组件的控制器调用onActive和onInactive方法激活和暂停页面渲染。点击onInactive按钮,Web页面停止渲染,视频暂停播放;点击onActive按钮,激活Web组件,视频继续播放。
L
lixingchi1 已提交
187

H
HelloCrease 已提交
188
  ```ts
L
lixingchi1 已提交
189
  // xxx.ets
L
liwenzhen 已提交
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
@Entry
@Component
struct WebComponent {
  controller: WebController = new WebController();
  build() {
    Column() {
      Row() {
        Button('onActive').onClick(() => {
          console.info("Web Component onActive");
          this.controller.onActive();
        })
        Button('onInactive').onClick(() => {
          console.info("Web Component onInactive");
          this.controller.onInactive();
        })
L
lixingchi1 已提交
205
      }
L
liwenzhen 已提交
206 207
      Web({ src: $rawfile('index.html'), controller: this.controller })
        .fileAccess(true)
L
lixingchi1 已提交
208 209
    }
  }
L
liwenzhen 已提交
210
}
L
lixingchi1 已提交
211 212
  ```

H
HelloCrease 已提交
213
  ```html
L
lixingchi1 已提交
214 215 216 217 218 219 220 221 222 223 224 225
  <!-- index.html -->
  <!DOCTYPE html>
  <html>
  <meta charset="utf-8">
  <body>
      <video width="320" height="240" controls="controls" muted="muted" autoplay="autoplay">
          <!-- test.mp4视频文件放在main/resources/rawfile目录下 -->
          <source src="test.mp4" type="video/mp4">
      </video>
  </body>
  </html>
  ```
226 227 228 229 230

## 相关实例

针对Web开发,有以下相关实例可供参考:

231
- [`Web`:Web(ArkTS)(API8)](https://gitee.com/openharmony/applications_app_samples/tree/master/ETSUI/Web)
232

233
- [Web组件加载本地H5小程序(ArkTS)(API9)](https://gitee.com/openharmony/codelabs/tree/master/ETSUI/WebComponent)