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#onurlloadintercept) 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