检测是否启用了IE中的字体下载

时间:2011-11-01 21:55:56

标签: javascript internet-explorer font-face detect

有没有办法检测Internet Explorer中的字体下载属性是否已禁用或启用?

目前,如果我要为字体渲染实现@ font-face解决方案(font-squirrel或typekit或其他),如果Internet Explorer有“字体下载”,那么除之外所有浏览器都会播放 “禁用选项。

此设置可在IE中找到>互联网选项>安全>自定义级别>下载>字体下载>启用/禁用。

如果我能检测到这个选项,我可以回到javascript方法。

这些解决方案不起作用,因为此选项实际上不会禁用该功能,它会阻止下载:

  • http://paulirish.com/2009/font-face-feature-detection/
  • http://www.lalit.org/lab/javascript-css-font-detect/
编辑:我应该提到我们不能使用服务器端解决方案,它必须是纯粹的客户端脚本。

3 个答案:

答案 0 :(得分:7)

由于此功能可防止发生下载,因此(一个相当脏的)解决方案是要求IE下载所谓的字体,这实际上是服务器上放置的简单脚本,例如。一个cookie说“好吧他得到字体”并返回一个空白页面。当用户加载下一页时,如果cookie不存在,您将部署Javascript机器。

enter image description here

答案 1 :(得分:5)

我意识到这个问题已经过时了,但对于一些IT安全严格的企业互联网用户来说,这个问题仍然存在。我查看了上面的解决方案和其他解决方案,但它们对我来说效果不佳,所以我发现另一个解决方案不需要服务器端代码,没有javascript,也没有css。它本质上是神奇的,但它有一些局限性。

限制1:这仅适用于使用高数字代码点显示图像的图标字体。它不适用于可读文本的字体字体。

限制2:您必须找到适合替换自定义图标的标准UTF-8符号。

例如,如果您有一个用于显示星号的自定义字体,那么适当的后备将是unicode代码点0x2605★。因此,在您的字体生成代码中,您需要将该代码点硬编码到您的css类中以获取星形图标。如果您使用的是“grunt-webfont”,您可以在grunt文件中执行以下操作:

webfont: {
    icons: {
        options: {
           codepoints: {
              'star': 0x2605
       ...
}}}}

明星就是一个完美的例子;为您的花式图标找到合适的UTF8替代品可能具有挑战性,因此这可能对每个人都不起作用。考虑到这个问题影响了极少数用户,我们认为这是一个合适的透明解决方案,不会影响普通用户使用额外的js / css / cookie cruft。

答案 2 :(得分:4)

基于@Zopieux流程图,当禁用字体下载时,我能够使这个脚本适用于IE6-9,在我的情况下,这个脚本适用于其他企业内部网已禁用此设置的客户端。

CSS:

@font-face {  
    font-family: 'TestFont';  
    src: url('/includes/font.php?type=eot');  
    src: url('/includes/font.php?type=eot#iefix') format('embedded-opentype'),  
     url('/includes/font.php?type=woff') format('woff'),
     url('/includes/font.php?type=ttf') format('truetype'),
     url('/includes/font.php?type=svg#UniversLTStd49LtUltraCn') format('svg');
    font-weight: normal;  
    font-style: normal;  
}  

PHP,当请求font-face src url时,它会提取此脚本,该脚本会检查类型,设置cookie并提供所选的webfont。如果启用了字体下载并且您没有重新路由到字体文件,IE将抛出@ font-face错误:

<?php
$type = $_REQUEST['type'];
$location = "Location: /includes/fonts/universltstd-lightultracn-webfont.".$type;

// create a cookie
setrawcookie("FontDownloaded", 1, time()+3600*24, '/');
header($location);

?>

JS,然后在客户端,执行类似这样的操作来检查cookie,并执行替代方法,如cufon-yui.js或typeface.js:

$(function() {
    $('body').append('<span id="TestFont"/>');
    $('#TestFont').html('Testing').css({
        fontFamily: 'TestFont',
        opacity: 0
    });

    // find cookie
    bool = Boolean(getCookie('FontDownloaded')); // use your own cookie method

    if (!bool) {
        // implement @font-face fallback        
        Cufon.replace('.items', { fontFamily: 'NewFont' });
    }
    $('#TestFont').remove();
});