1# Web开发常见问题 2 3## Web组件的onUrlLoadIntercept返回结果是否影响onInterceptRequest 4 5适用于:Openharmony 3.2 Beta5 API 9 6 7**解决措施** 8 9Web组件的onUrlLoadIntercept的不同返回结果对应不同的操作: 10 11- onUrlLoadIntercept返回true则直接拦截URL请求。 12- onUrlLoadIntercept返回false走onInterceptRequest回调。 13 14**参考链接** 15 16[onUrlloadIntercept](../reference/arkui-ts/ts-basic-components-web.md#onurlloadinterceptdeprecated) 17 18## 为什么Web组件的onKeyEvent键盘事件不生效 19 20适用于:Openharmony 3.2 Beta5 API 9 21 22**问题现象** 23 24Web组件设置onKeyEvent监听键盘事件,键盘按下或抬起该事件不触发。 25 26**解决措施** 27 28onKeyEvent为通用事件,当前Web组件不支持通用事件。Web组件监听键盘事件可以使用onInterceptKeyEvent回调函数。 29 30**参考链接** 31 32[onInterceptKeyEvent](../reference/arkui-ts/ts-basic-components-web.md#oninterceptkeyevent9) 33 34## onInterceptRequest拦截URL并自定义HTML文件,页面加载失败 35 36适用于:Openharmony 3.2 Beta5 API 9 37 38**问题现象** 39 40onInterceptRequest拦截页面Web的src的链接后返回自定义HTML,但是自定义HTML文件里面的script标签里的内容没有加载。 41 42**解决措施** 43 44设置拦截器时,如果只设置setResponseData,内核将无法识别到这是个HTML文件,需要同时设置setResponseEncoding、setResponseMimeType、setResponseHeader等参数。 45 46**代码示例** 47 48``` 49Web({ src: 'www.example.com', controller: this.controller }) 50 .onInterceptRequest((event) => { 51 console.log('url:' + event.request.getRequestUrl()) 52 this.responseweb = new WebResourceResponse(); 53 var head1:Header = { 54 headerKey:"Connection", 55 headerValue:"keep-alive" 56 } 57 var length = this.heads.push(head1) 58 this.responseweb.setResponseHeader(this.heads) 59 this.responseweb.setResponseData(this.webdata) 60 this.responseweb.setResponseEncoding('utf-8') 61 this.responseweb.setResponseMimeType('text/html') 62 this.responseweb.setResponseCode(200) 63 this.responseweb.setReasonMessage('OK') 64 return this.responseweb 65}) 66``` 67 68**参考链接** 69 70[WebResourceResponse](../reference/arkui-ts/ts-basic-components-web.md#webresourceresponse) 71 72## 如何在ArkTS代码中执行HTML内的JS函数 73 74适用于:Openharmony 3.2 Beta5 API 9 75 76**解决措施** 77 78通过WebviewController中runJavaScript方法异步执行JavaScript脚本,并通过回调方式获取执行结果。 79 80>**说明:** 81>runJavaScript需要在loadUrl完成后,比如onPageEnd中调用。 82 83**参考链接** 84 85[runJavaScript](../reference/apis/js-apis-webview.md#runjavascript) 86 87## 使用Web组件加载本地网页时,如何在本地网页中调用ArkTS中的函数 88 89适用于:Openharmony 3.2 Beta5 API 9 90 91**解决措施** 92 931. 准备一个html文件,例如: 94 95 ``` 96 <!DOCTYPE html> 97 <html lang="en"> 98 <head> 99 <meta charset="UTF-8"> 100 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 101 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 102 <title>Document</title> 103 </head> 104 <body> 105 <h1>标题</h1> 106 <h5 id="h5"></h5> 107 <h5 id = "h6"></h5> 108 <button onclick="handleFromH5">调用Arkts的方法</button> 109 <script type="text/javascript"> 110 function handleFromH5(){ 111 let result = window.objName.test(); 112 document.getElementById('h6').innerHTML = result; 113 } 114 </script> 115 </body> 116 </html> 117 ``` 118 1192. 在ArkTs中使用JavaScriptProxy方法将ArkTs里的对象注册到H5的window对象中,然后在h5中使用window对象调用该方法。比如下面例子,在ArkTs中将testObj这个对象以别名objName注册到h5的window对象上,在上面的h5中就可以使用window.objName去访问这个对象。 120 121 ``` 122 // xxx.ets 123 import web_webview from '@ohos.web.webview' 124 @Entry 125 @Component 126 struct Index { 127 @State message: string = 'Hello World' 128 controller: web_webview.WebviewController = new web_webview.WebviewController() 129 testObj = { 130 test: (data1, data2, data3) => { 131 console.log("data1:" + data1); 132 console.log("data2:" + data2); 133 console.log("data3:" + data3); 134 return "AceString"; 135 }, 136 toString: () => { 137 console.log('toString' + "interface instead."); 138 } 139 } 140 build() { 141 Row() { 142 Column() { 143 Web({ src:$rawfile('index.html'), controller:this.controller }) 144 .javaScriptAccess(true) 145 .javaScriptProxy({ 146 object: this.testObj, 147 name: "objName", 148 methodList: ["test", "toString"], 149 controller: this.controller, 150 }) 151 } 152 .width('100%') 153 } 154 .height('100%') 155 } 156 } 157 ``` 158 159 160**参考链接** 161 162[javaScriptProxy](../reference/arkui-ts/ts-basic-components-web.md#javascriptproxy) 163 164## Web组件domStorageAccess属性设置 165 166适用于:OpenHarmony 3.2 Beta5 API 9 167 168**解决措施** 169 170设置是否开启文档对象模型存储接口(DOM Storage API)权限,默认未开启,控制web网页中localStorage的使用,对sessionStorage未做控制 171 172**参考链接** 173 174[domStorageAccess](../reference/arkui-ts/ts-basic-components-web.md#domstorageaccess) 175 176## 如何解决Web组件加载的HTML页面内检测网络状态失败 177 178适用于:OpenHarmony 3.2 Beta5 API 9 179 180**问题现象** 181 182在HTML页面内通过window.navigator.onLine获取网络状态,联网和断网情况下均为false。 183 184**解决措施** 185 186配置应用获取网络信息权限: ohos.permission.GET\_NETWORK\_INFO 187 188**参考链接** 189 190[GET\_NETWORK\_INFO](../security/permission-list.md#ohospermissionget_network_info) 191 192## 如何自定义拼接设置UserAgent参数 193 194适用于:OpenHarmony 3.2 Beta5 API 9 195 196**解决措施** 197 198默认UserAgent需要通过WebviewController获取。WebviewController对象必须在Web组件绑定后,才能调用WebviewController上的方法getUserAgent获取默认UserAgent。因此在页面加载前通过自定义字符串拼接修改UserAgent,可采用此方式: 199 2001. 使用@State定义初始UserAgent,绑定到Web组件; 2012. 在Web组件的onUrlLoadIntercept回调中,通过WebviewController.getUserAgent\(\)获取默认UserAgent,并修改Web组件绑定的UserAgent 202 203**代码示例** 204 205``` 206import web_webview from '@ohos.web.webview' 207@Entry 208@Component 209struct Index { 210 private controller: web_webview.WebviewController = new web_webview.WebviewController() 211 @State userAgentPa: string = '' 212 build() { 213 Row() { 214 Column() { 215 Web({ src: 'http://www.example.com', controller: this.controller }) //需要手动替换为真实网站 216 .width('100%') 217 .userAgent(this.userAgentPa) 218 .onUrlLoadIntercept((event) => { 219 let userAgent = this.controller.getUserAgent(); 220 this.userAgentPa = userAgent + ' 111111111' 221 return false; 222 }) 223 } 224 .width('100%') 225 } 226 .height('100%') 227 } 228} 229``` 230 231**参考链接** 232 233[userAgent](../reference/arkui-ts/ts-basic-components-web.md#useragentdeprecated)、[getUserAgent](../reference/apis/js-apis-webview.md#getuseragent) 234 235## Web组件中如何通过手势滑动返回上一个Web页面 236 237适用于:Openharmony 3.2 Beta5 API 9 238 239**解决措施** 240 241通过重写onBackPress函数来自定义返回逻辑,使用WebviewController判断是否返回上一个Web页面。 242 243**示例代码** 244 245``` 246import web_webview from '@ohos.web.webview'; 247@Entry 248@Component 249struct Index { 250 controller: web_webview.WebviewController = new web_webview.WebviewController(); 251 build() { 252 Column() { 253 Web({ src: 'http://www.example.com', controller: this.controller })//需要手动替换为真实网站 254 } 255 } 256 onBackPress() { 257 // 当前页面是否可前进或者后退给定的step步(-1),正数代表前进,负数代表后退 258 if (this.controller.accessStep(-1)) { 259 this.controller.backward(); // 返回上一个web页 260 // 执行用户自定义返回逻辑 261 return true 262 } else { 263 // 执行系统默认返回逻辑,返回上一个page页 264 return false 265 } 266 } 267} 268``` 269 270**参考链接** 271 272[accessStep](../reference/apis/js-apis-webview.md#accessstep) 273 274