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

Javascript 检测IE中的字体下载是否已启用,javascript,internet-explorer,font-face,detect,Javascript,Internet Explorer,Font Face,Detect,是否有方法检测internet explorer中的字体下载属性是否已禁用或启用 目前,如果我要为字体渲染实现@font-face解决方案(font squirrel或typekit或其他),所有浏览器都会运行良好,除非internet explorer禁用了“字体下载”选项 此设置可在IE>Internet选项>安全性>自定义级别>下载>字体下载>启用/禁用中找到 如果我能检测到这个选项,我可以回到javascript方法 这些解决方案不起作用,因为此选项实际上并不禁用该功能,它会阻止下载:

是否有方法检测internet explorer中的字体下载属性是否已禁用或启用

目前,如果我要为字体渲染实现@font-face解决方案(font squirrel或typekit或其他),所有浏览器都会运行良好,除非internet explorer禁用了“字体下载”选项

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

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

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

  • http://paulirish.com/2009/font-face-feature-detection/
  • http://www.lalit.org/lab/javascript-css-font-detect/

编辑:我应该提到,我们不能不使用服务器端解决方案,它必须是纯客户端脚本

由于此功能防止下载,一个(相当脏的)解决方案是让IE下载一个所谓的字体,它实际上是服务器上的一个简单脚本,其中放入一个cookie,上面写着“ok he gots the font”,并返回一个空白页面。当用户加载下一页时,如果cookie不存在,您将部署Javascript机制


基于@Zopieux流程图,当字体下载被禁用时,我能够使该脚本在IE6-9上工作,在我的例子中,该脚本是针对一个客户端的,与其他公司内部网一样,该客户端禁用了该设置

CSS:

在PHP中,当请求字体面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();
});
$(函数(){
$('body')。追加('');
$('#TestFont').html('Testing').css({
fontFamily:'TestFont',
不透明度:0
});
//找到饼干
bool=Boolean(getCookie('FontDownloaded');//使用您自己的cookie方法
如果(!bool){
//实现@font-face回退
替换('.items',{fontFamily:'NewFont'});
}
$('#TestFont')。删除();
});

我意识到这个问题由来已久,但对于一些IT安全要求严格的公司互联网用户来说,这个问题仍然存在。我研究了上面的解决方案和其他解决方案,但它们对我来说效果不好,所以我找到了另一个不需要服务器端代码、javascript和css的解决方案。它本质上是神奇的,但也有一些局限性

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

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

例如,如果您有一种用于显示星形符号的自定义字体,则可以使用unicode代码点0x2605作为适当的回退★. 因此,在字体生成代码中,您需要硬编码该代码指向用于星形图标的css类。如果您使用的是“grunt webfont”,您可以在grunt文件中执行以下操作:

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

明星就是一个完美的例子;要找到一个合适的UTF8替代品来替代你的花哨图标可能会很有挑战性,所以这可能并不适用于所有人。考虑到这个问题只影响极少数用户,我们认为这是一个合适的透明解决方案,不会影响使用额外js/css/cookie cruft的普通用户。

这是我的第一个想法,但我们不能为这个特定项目使用任何服务器端脚本。在任何情况下,如何模拟@font-face的字体下载?到目前为止,我一直在尝试对字体本身进行ajax获取,即使禁用字体下载,它也能很好地获取和下载。无论选择什么,使用JS下载都能正常工作。你必须让IE下载字体,通过放置一个@font-face来引导我解释的脚本,这样你就可以看到浏览器是否下载了它。如果你在服务器上什么都做不了,我相信你完蛋了。
webfont: {
    icons: {
        options: {
           codepoints: {
              'star': 0x2605
       ...
}}}}