2015-10-18 57 views
4

在IE和Microsoft Edge(Data URI link <a href="data: doesn't work in Microsoft Edge)中不支持在链接中使用数据URI(<a href="data:)。在支持Modernizr的链接中检测数据URI

我试图用Modernizr来检测链接支持中的数据URI。

Modernizr.datauri不是我正在查找的内容,因为它没有告诉链接中支持数据URI的任何内容,例如,对于Microsoft Edge,它返回对象{over32kb: true}

如何检测使用Modernizr如果链接中的数据URI在浏览器中受支持?

+3

您可以通过向数据URI发送Ajax请求来蛮力。 IE和Edge会发生异常。除此之外,我不确定... – BoltClock

回答

2

我对功能检测的需求相同,但我没有使用Modernizr。我的用例是我使用makePDF库在客户端生成pdf,但无法使用IE或Edge中的数据URI打开PDF。不幸的是,我能找到的所有功能检测脚本都在测试支持图像的数据URI(这是由MS浏览器支持的),所以我必须自己写。这里的(为理念由于BoltClock的评论以上)的代码:

checkDataURISupport(function (checkResult) { 
 
    if (checkResult) { 
 
     alert('Files in data URIs are supported.'); 
 
    } else { 
 
     alert('Files in data URIs are NOT supported.'); 
 
    } 
 
}) 
 

 
function checkDataURISupport(callback) { 
 
    try { 
 
     var request = new XMLHttpRequest(); 
 
     request.onload = function reqListener() { 
 
      callback(true); 
 
     }; 
 
     request.onerror = function reqListener() { 
 
      callback(false); 
 
     }; 
 
     request.open('GET', 'data:application/pdf;base64,cw=='); 
 
     request.send(); 
 
    } catch (ex) { 
 
     callback(false); 
 
    } 
 
} 
 

 
checkDataURISupport()

我测试在IE 11,边缘25,火狐46和Chrome 49.

作为侧面说明,另一个SO回答(https://stackoverflow.com/a/26003382/634650)使用建议:

supportsDataUri = 'download' in document.createElement('a'); 

这在IE,但没有优势。

更新

的SO回答上述的组合也包含了有关特征检测在iframe支持链接到引用a SO answera Modernizr issue数据URI。在iframe中打开数据URI与在新窗口中打开数据URI基本相同,不支持在iframe中支持数据URI的Microsoft浏览器不支持在新窗口中打开它们。此外,在这些位置提到的iframe支持测试是同步的,所以我建议使用它来代替我的异步解决方案。

+0

很好的解决方案创建解决方法,谢谢你回答我的老问题! :) –

+0

这给了我现在边缘误报。 – kzh

0

奇怪的是,即使Microsoft Edge不支持数据URI。旧版本的IE only allows base64 encoded images of up to 32KB。我最近遇到了一个参考链接,它与您提到的类似问题Moderinzr有关。

Does modernizr check for data uri's?#294

看来they have added a patch for the issue。这是一个数据URI测试。

This post对此问题有类似的答案。我希望这些修补程序应该可以贯穿始终。

+2

欣赏您的回复,但它似乎并不是我要找的。我的quiestion不是关于数据URI支持,而是关于链接**中的数据URI **。 Edge支持图像或CSS中的数据URI,但不支持链接。 –

+0

嗯嗯,好吧。那么数据URI的部分在微软的浏览器中得到了支持。对于除IE-8以外的所有(边缘),'over32kb'是'Modernizr.datauri'的子属性,'true'。没有太多的话要说,但我相信你可能需要为这个(@ __ @) – Rohit416