HarmonyOS鸿蒙Next中web组件将本地三方字体文件绝对路径传给H5使用时未能生效
HarmonyOS鸿蒙Next中web组件将本地三方字体文件绝对路径传给H5使用时未能生效
字体绝对路径:file:///data/storage/el2/base/haps/entry/cache/xxx_font_title.ttf
截图中的模版news_detail.html文件H5可以使用,但是三方字体H5就未生效
工程机版本:Developer Beta5
DevEco Studio版本:Build Version: 5.0.3.800, built on September 4, 2024
SDK版本:5.0025
示例代码:
@Builder
middleWebComponent() {
if (StringUtil.isNotEmpty(this.news_detail_html)) {
Web({ src: '', controller: this.controller })
.backgroundColor(ThemeModel.getWhiteBgColor())
.width(StyleUtil.FULL_WIDTH)
.layoutWeight(1)
.javaScriptAccess(true)
.domStorageAccess(true)
.fileAccess(true)
.darkMode(WebDarkMode.Auto)
.textZoomRatio(this.ratio)
.javaScriptProxy({
// TODO 设置与H5交互方法,registerJavaScriptProxy这种方法无法实现getJsonStr方法,只能使用javaScriptProxy
object: this.javaScript,
name: JavaScriptProxyConstant.commonName,
methodList: [
// h5调用web方法
JavaScriptProxyConstant.getJsonStr,
JavaScriptProxyConstant.jumpIndexOrReport,
JavaScriptProxyConstant.jumpReportDetail,
// web调用H5方法
JavaScriptProxyConstant.getContentText
],
controller: this.controller,
})
.onControllerAttached(() => {
this.controller.setCustomUserAgent(Api.getCustomUserAgent())
this.controller.loadUrl(this.news_detail_html)
})
.onErrorReceive((event) => {
if (event) {
console.log('getErrorInfo:' + event.error.getErrorInfo());
console.log('getErrorCode:' + event.error.getErrorCode());
console.log('url:' + event.request.getRequestUrl());
console.log('isMainFrame:' + event.request.isMainFrame());
console.log('isRedirect:' + event.request.isRedirect());
console.log('isRequestGesture:' + event.request.isRequestGesture());
console.log('getRequestHeader_headerKey:' + event.request.getRequestHeader().toString());
let result = event.request.getRequestHeader();
console.log('The request header result size is ' + result.length);
for (let i of result) {
console.log('The request header key is : ' + i.headerKey + ', value is : ' + i.headerValue);
}
}
})
.onPageBegin(() => {
})
.onPageEnd((event) => {
if (!this.reloaded) {
this.reloaded = true
// web主动调用H5方法,设置ip地址
if (this.article && this.article.articleType == ArticleType.PLAIN) {
if (!this.isPaper) { // 数字报稿件不设置ip
let ipAddressText: string = ArticleViewModel.getIpAddressText(this.article)
this.controller.runJavaScript(`${JavaScriptProxyConstant.sendTerritoryIP}('${ipAddressText}');`)
}
}
}
setTimeout(() => {
// 设置文章标题三方字体
let titleFontPath: string = FileManagerUtil.getFilePath('xky_font_title.ttf')
let startUrl: string = 'file://' + titleFontPath
let javaScriptStr: string = `${JavaScriptProxyConstant.changTitleFont}('${startUrl}')`
// javaScriptStr = `${JavaScriptProxyConstant.changTitleFont}('./xxx_font_title.ttf')`
// javaScriptStr = `${JavaScriptProxyConstant.changTitleFont}('xxx_font_title.ttf')`
this.controller.runJavaScript(javaScriptStr)
}, 3 * 1000)
})
}
}
更多关于HarmonyOS鸿蒙Next中web组件将本地三方字体文件绝对路径传给H5使用时未能生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
如果您的web页面是通过 Web({ src: $rawfile(‘xx.html’), controller: this.controller }) 这种方式引用H5页面的话,可引用App的字体。 1、把字体放在rawfile目录 示例xx.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
@font-face { font-family: 'xxx'; src: url('./xxx.ttf'); }
#title { font-family: 'xxx'; }
</style>
</head>
<body><h1 id="title">测试字体引用</h1></body>
</html>
加载url方式的目前没法引用
@Entry
@Component
struct Index {
controller: webview.WebviewController = new webview.WebviewController();
updataContent: string =
'<body><div><image src="resource://rawfile/xiaocao.png" alt="image -- end" width="500" height="250"></image></div></body>'
content: string =
`<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style>
@font-face { font-family: 'aishitoutoucangbuzhu'; src: url('./aishitoutoucangbuzhu.ttf'); }
#title { font-family: 'aishitoutoucangbuzhu'; }
</style> </head> <body> <Text id="title">猫啃忘形圆</Text> </body> </html>`
build() {
Column() {
Web({ src: "", controller: this.controller }).onControllerAttached(() => {
this.controller.loadData(encodeURIComponent(this.content), "text/html", "UTF-8",);
})
}.width('100%').height('100%')
}
}
更多关于HarmonyOS鸿蒙Next中web组件将本地三方字体文件绝对路径传给H5使用时未能生效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中使用Web组件时,如果尝试将本地三方字体文件的绝对路径传递给H5页面但未能生效,可能是由于路径解析或权限问题。建议检查以下几点:
- 路径正确性:确保字体文件的绝对路径在HarmonyOS系统中是有效的,并且文件确实存在于该路径下。
- 权限设置:确保H5页面有权限访问该字体文件。可以在HarmonyOS的权限管理中为Web组件授予相应的文件访问权限。
- CORS问题:如果H5页面通过HTTP请求加载字体文件,确保服务器配置了正确的CORS(跨域资源共享)策略。
- 字体格式兼容性:确保字体文件格式(如.ttf、.woff)与H5页面的需求兼容。
如果问题仍未解决,可以尝试将字体文件嵌入到H5页面的CSS中,或者通过Base64编码的方式直接嵌入到HTML中。