ui-ts-components-web.md 6.8 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

## 开启网页调试
在PC上启用端口转发,以及设置Web组件属性webDebuggingAccess为true后,便可以在PC上调试通过USB连接的开发设备上的Web组件里的网页。
E
review  
echoorchid 已提交
157

E
echoorchid 已提交
158
设置步骤如下:
E
review  
echoorchid 已提交
159

E
echoorchid 已提交
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
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
E
review  
echoorchid 已提交
178
  hdc fport tcp:9222 tcp:9222
E
echoorchid 已提交
179 180 181
  ```
  添加是否成功可以通过如下命令来查看已存在的映射关系表。
  ```ts
E
review  
echoorchid 已提交
182
  hdc fport ls
E
echoorchid 已提交
183 184 185
  ```
如上设置完成后,首先打开应用Web组件、访问要调试的网页,然后在PC上使用chrome浏览器访问:http://localhost:9222, 就可以在PC上调试开发设备刚才访问的网页。

L
lixingchi1 已提交
186 187
## 场景示例

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

H
HelloCrease 已提交
190
  ```ts
L
lixingchi1 已提交
191
  // xxx.ets
L
liwenzhen 已提交
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
@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 已提交
207
      }
L
liwenzhen 已提交
208 209
      Web({ src: $rawfile('index.html'), controller: this.controller })
        .fileAccess(true)
L
lixingchi1 已提交
210 211
    }
  }
L
liwenzhen 已提交
212
}
L
lixingchi1 已提交
213 214
  ```

H
HelloCrease 已提交
215
  ```html
L
lixingchi1 已提交
216 217 218 219 220 221 222 223 224 225 226 227
  <!-- 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>
  ```
228 229 230 231 232

## 相关实例

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

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