iPad/Mac Safari 不会加载字体

iPad/Mac Safari won't load the font

我在 iPad 和 Mac Machine 的 SAFARI 浏览器上使用我的应用程序(部署在IIS)。但是,每当我尝试在 Developer ToolsResources 选项卡中编辑 CSS 时,字体突然自行加载然后停留。即使是 CSS 中的单个 space 编辑也会加载字体。 WindowsSafari 一切正常。

除此之外,如果我继续在 Safari 上处理我的应用程序的页面,字体会在随机时间(时间从 10 秒到 10 分钟或更长时间不等)后加载到页面上,然后停留在那里直到缓存被擦掉了。

我尝试了几种方法来解决这个问题:

  1. @font-face 声明中删除引号,因为我在某处读到 Safari 不会加载带引号的字体。没有成功,尽管如此,firefox 停止渲染字体,因为那里需要引号。
  2. 在 IIS 上检查 MIME-Type .svg 文件类型。没有成功。
  3. 已验证字体文件中 .svg 声明中的 ID。没有成功。
  4. 将所有字体的 @font-face 声明提取到单独的文件中,并将其作为最顶部的 CSS 声明包含在 <head> 标记中。
  5. 尝试在浏览器被检测为 SAFARI 后移除并推送 CSS 标签。这东西有用,但是很讨厌。下面引用代码

代码:

var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
if (isSafari) {
    if ($('#fontCss').length) {
        $('#fontCss').remove();
        $('head').append("<link rel='stylesheet' href='assets/css/fontAwesome/font-awesome.css'>");
        alert('This is Safari');
    }
}

你们能给我一些建议来解决这个问题吗?我试过用相同的字体制作测试页面和小提琴,并在相同的设备上测试它们,在演示页面上一切正常,但在我的应用程序中却不行。

唯一似乎有效的是在页面加载后删除并推送带有 CSS 文件的 link 标记。我的应用程序是 AngularJS 的单页 Web 应用程序,所以我不必担心 JS 在每次屏幕更改时执行,直到页面被显式刷新。

我从相应的文件中提取了所有 @font-face 声明(包括 font-awesome 的@font-face)并将它们保存在两个单独的文件中,即。 fonts.css 和 fonts_safari.css。然后在index.html中包含fonts.css

<link rel="stylesheet" id="cssReplace" href="assets/css/app/fonts.css">

然后就在 body 标记结束之前,我添加了这个 JS 片段,它将在页面加载后替换 CSS 文件的声明。

<script>
    $(document).ready(function () {
        setTimeout(function () {
            var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
            if (isSafari) {
                if ($('#cssReplace').length) {
                    $('#cssReplace').remove();
                    $('head').append("<link rel='stylesheet' href='assets/css/app/fonts_safari.css'>");
                }
            }
        }, 10);
    });
</script>

PS:我正在使用 setTimeout 来利用 javascript 作为一种在单线程上运行的脚本语言的优势。如果我的应用程序没有它,它就无法工作。 Read This 关于使用 setTimeout 的回答供进一步参考。