小智 11
最后一个答案是11年前提供的。与此同时,对于仍在寻找解决方案的人们来说,有新的解决方案可供使用:
您可以使用FontFaceSet浏览器提供的API。目前它仍是一项实验性技术,但已在大多数浏览器(IE 除外)中可用。
FontFaceSet 的 check() 方法返回给定字体列表中的所有字体是否已加载且可用。
例子:
const fontAvailable = document.fonts.check("16px Arial");
Run Code Online (Sandbox Code Playgroud)
使用该check()方法时,请务必使用该ready属性检查字体加载操作是否已完成,Promise加载完成后该属性将返回 a :
let fontAvailable;
document.fonts.ready.then(() => {
fontAvailable = document.fonts.check("16px Arial");
});
Run Code Online (Sandbox Code Playgroud)
这是在 html 页面中检查您的设备中是否安装了字体的解决方案。这个想法是:创建一个极窄的字体并在带有数据对象 url 的 css 中定义它,用这个字体检查目标字体的宽度。
这是示例:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
(function () {
const context = document.createElement("canvas").getContext("2d");
context.font = "200px SANS-SERIF"
const TEXT_TO_MEASURE = "A";
var FONT_WIDTH = context.measureText(TEXT_TO_MEASURE).width;
(function () {
var style = document.createElement("style");
style.setAttribute("type", "text/css");
style.textContent = `@font-face{font-family:'__DEFAULT_FONT__';src:url('data:application/font-woff;base64,d09GRgABAAAAAAM0AAsAAAAABCQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAABVPUy8yAAABcAAAADwAAABgNVxaOmNtYXAAAAG0AAAAKQAAADQADACUZ2FzcAAAAywAAAAIAAAACP//AANnbHlmAAAB6AAAACQAAAAwK9MKuGhlYWQAAAEIAAAAMwAAADYLo1XbaGhlYQAAATwAAAAcAAAAJP2RAdRobXR4AAABrAAAAAgAAAAIAMn9LGxvY2EAAAHgAAAABgAAAAYAGAAMbWF4cAAAAVgAAAAXAAAAIAAEAAVuYW1lAAACDAAAAQsAAAHwJKxCKHBvc3QAAAMYAAAAEwAAACD/KgCWeNpjYGRgYABi+QdqV+P5bb4ycHMwgMD1GraPEJqz/d80BoZ/PxgygFw2kFoGBgA++AvVAHjaY2BkYGBgBMOUf9MYc/79YACJIAMmAF7xBGN42mNgZGBgYGJgYQDRDFASCQAAAQEACgB42mNgZkhhnMDAysDAOovVmIGBURpCM19kSGMSYmBgAklhBR4+CgoMDgyOQMgIhhlgYUYoCaEZAIdLBiEAZP6WAGT+lnjaY2BgYGJgYGAGYhEgyQimWRgUgDQLEIL4jv//Q8j/B8B8BgBSlwadAAAAAAAADAAYAAB42mNg/DeNgeHfD4YMBmYGBkVTY9F/05IyMhgYcIgDAGnPDrV42oWQzU7CUBCFvwISZcEz3LjSBBoQ/yIrYzTEGEmIYY9QiglS01YMOx/DV+AtPXeophtjmumdOffMmXMH2GdOlaB2ACwUuzwQvi7yCk3d7PIqh794rcTZI+WryOslvMFn0OCJDW9EmjRhqtOxVRwJTXhXpxOa8CrOhJXQY0JhJ3Tocmn5NUt9jhEvxHKTk1kV6YyksNZ/ZnUsxaV0Uh4ZKm65YmycTL2J9J1UQ2l3/sT73JvKxlz0aJXc9Lkzds6NeiNNylWn1u37z0wjFP9UcSH8XFmbZ03JtYmFTu99Xqg4PqSR2Q5+9PxbnBx4Zyu9yP070+ultkPHoNhRmwchsaqpOLbhb0h9RfYAeNpjYGYAg//qDNMYsAAAKDQBwAAAAAAB//8AAg==');}`;
document.documentElement.appendChild(style);
var handleId = null;
(function initailizeDefaultFont() {
context.font = "200px __DEFAULT_FONT__";
var width = context.measureText(TEXT_TO_MEASURE).width;
if (width != FONT_WIDTH) {
FONT_WIDTH = width;
cancelAnimationFrame(handleId);
}
else if (handleId == null) {
handleId = requestAnimationFrame(initailizeDefaultFont);
}
})();
})();
function checkFontAvailable(font) {
if (/^\s*SANS-SERIF\s*$/i.test(font)) {
return true;
}
if (!font || font == '__DEFAULT_FONT__') {
return false;
}
context.font = `200px ${font.replace(/^\s*['"]|['"]\s*$/g, "")}, __DEFAULT_FONT__`;
var width = context.measureText(TEXT_TO_MEASURE).width;
return width != FONT_WIDTH;
}
this.checkFontAvailable = checkFontAvailable;
}).apply(this);
console.log([checkFontAvailable("arial black b"), checkFontAvailable("arial black")]);
</script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是测试结果:
checkFontAvailable("????333")
false
checkFontAvailable("????")
true
checkFontAvailable("arial")
true
checkFontAvailable("arial black")
true
Run Code Online (Sandbox Code Playgroud)
@Matchu 建议你是正确的,但这就是你正在寻找的:
http://remysharp.com/2008/07/08/how-to-detect-if-a-font-is-installed-only-using-javascript/
| 归档时间: |
|
| 查看次数: |
6119 次 |
| 最近记录: |