问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

IE11无法保存浏览器兼容性视图设置怎么办?

发布网友 发布时间:2022-04-26 09:50

我来回答

4个回答

懂视网 时间:2022-05-15 09:26

这次给大家带来在IE11下里使用canvas.toDataURL兼容性问题的解决思路,解决IE11下里使用canvas.toDataURL兼容性问题的注意事项有哪些,下面就是实战案例,一起来看一下。

发现问题

最近在项目中用到了 canvas 的 toDataURL 方法来获取图片的 base64 格式数据,用以上传到后台。由于之前也遇到过 canvas 被跨域图片污染不能获取数据的坑,因此这回一开始就机智的把 crossOrigin 属性值加上,代码大概如下:

const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
context.fillStyle = "black";
context.fillRect(0, 0, canvas.width, canvas.height);
const imageElement = document.createElement("img");
imageElement.crossOrigin = "Anonymous";
imageElement.onload = () => {
 context.drawImage(
 imageElement,
 params.left,
 params.top,
 canvas.width,
 canvas.height,
 0,
 0,
 canvas.width,
 canvas.height
 );
 const dataUrl = canvas.toDataURL("image/jpeg", 1);
}
imageElement.src = 'xxx';

本以为万无一失,而在 Chrome 浏览器上面也非常顺利;然而到了 IE11 上,却出现了一个莫名其妙的 SecurityError 错误:

IE11下使用canvas.toDataURL报SecurityError错误的解决方法

没有具体的报错信息,只通过提示定位到了执行 toDataURL 这一行,实在让人疑惑。

尝试

第一时间 Google 了一下,发现很多人遇到这个问题,但是并没有看到什么有效的解决办法,有些人建议使用 Fabric.js,但是看了一下觉得太麻烦了点。而在 caniuse 上,也明确标注了该方法在 IE11 上有问题。

看起来应该是 IE 上的一个 bug,于是想到了一个曲线救国的办法:获取图片 base64 数据的办法又不是只有一个,既然 toDataURL 方法支持不好,那就用别的办法:

  • 先将 canvas 转成 blob

  • 再用 FileReader 以 dataUrl 的方式读取

  • 代码大概如下:

    const reader = new FileReader();
    reader.readAsDataURL(canvas.msToBlob());
    reader.onloadend = () => {
     const base64data = reader.result;
    };

    然而这并没有什么卵用....

    这回轮到了 msToBlob 方法报了 SecurityError 错误。我:???

    解决

    看起来可能真的是安全原因,唯一的安全原因,只可能是跨域图片了。寻思着可能在 IE 上安全策略比较严格,即使设置了 crossOrigin = "Anonymous" 还是不让读数据,于是想到了另外一个思路,既然是因为跨域,那就把跨域因素去除:

  • 使用 ajax 请求拿到图片的二进制数据

  • 将二进制数据转为 base64 格式

  • 将得到的 base64 数据作为图片元素的 src 设置并画到画布上

  • 正常调用 toDataURL

  • 代码大致如下:

    // 之前的代码
    // ...
    // 最后一行 imageElement.src = 'xxx' 替换:
    getDataUrlBySrc('xxx').then(b64 => (imageElement.src = b64));
    function getDataUrlBySrc(src: string) {
     return new Promise<string>((resolve, reject) => {
     if (Cache.localGet("isIE")) {
     const xmlHTTP = new XMLHttpRequest();
     xmlHTTP.open("GET", src, true);
     // 以 ArrayBuffer 的形式返回数据
     xmlHTTP.responseType = "arraybuffer";
     xmlHTTP.onload = function(e) {
     
     // 1. 将返回的数据存储在一个 8 位无符号整数值的类型化数组里面
     const arr = new Uint8Array(xmlHTTP.response);
     
     // 2. 转为 charCode 字符串
     const raw = Array.prototype.map
     .call(arr, charCode => String.fromCharCode(charCode))
     .join("");
     
     // 3. 将二进制字符串转为 base64 编码的字符串
     const b64 = btoa(raw);
     
     const dataURL = "data:image/jpeg;base64," + b64;
     resolve(dataURL);
     };
     xmlHTTP.onerror = function(err) {
     reject(err);
     };
     xmlHTTP.send();
     } else {
     resolve(src);
     }
     });
    }

    尝试了一下,成功达到了目的。

    后来查阅资料得知,如果 canvas 污染了,那无论是 toDataURL 还是 toBlob,都是无法执行成功的。

    缺陷

    虽然这个方法可以达到目的,但是却牺牲了性能。要先请求一次图片数据不说,数据编码的转换也是相当耗时的。小图还好,如果图片比较大,例如超过 3M ,那整个流程需要花费的时间可以达到一两分钟,这是不可接受的。

    canvas的toDataUrl是否会压缩图像?

    使用canvas的drawImage方法将image对象draw到canvas画布上时,图片大小会显著增加,并且只能保存为PNG格式。

    将canvas用toDataUrl转化为base64,即使encoderOptions设置为1,图片也会有较大幅度的减小,但是比起最初的image还是要大。如果encoderOptions使用默认的0.92,最终的图片大小和初始的是相差不多的

    相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

    推荐阅读:

    Angular4输入与输出怎么使用

    easyui的下拉框动态级联加载的实现方法(附代码)

    热心网友 时间:2022-05-15 06:34

    方法一、

        1、打开ie11浏览器,然后点击“工具--Internet选项”;

        2、在打开的Internet选项窗口中,切换到“安全”选项卡,然后在下方找到并取消勾选“启用保护模式”项,然后点击确定按钮退出即可

    方法二、

        1、打开开始菜单中的运行,然后运行regedit,回车打开注册表;

        2、然后依次战卡定位到“HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/Main”,右击“Main”选择“权限”选项;

        3、在“安全”中选择“添加”,输入当前登陆系统的用户名,点击确定,然后退出即可。

    方法三、

        1、打开IE11浏览器,同样的打开“Internet选项”窗口,切换到“常规”选项卡;

        2、然后在浏览历史模块中,取消勾选取消勾选“退出时删除浏览历史记录”项,然后点击确定退出即可。

        关于IE11无法保存浏览器兼容性视图设置的解决方法就是这样,遇到这样问题的朋友们可以根据上面win7系统下载http://www.win7jia.cn站的方法进行操作即可,希望可以帮助到你,望采纳

    热心网友 时间:2022-05-15 08:09

    只能针对某些特定网站,如果你要所有的网站都以兼容性模式,你可以卸载IE11,恢复到特定版本。

    热心网友 时间:2022-05-15 10:00

    打开浏览器,依次点工具-兼容性视图设置-填入你要兼容的网址-点添加-关闭结束,永久有效。祝你使用愉快!
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    天涯论坛的网址是什么啊? 如何辨别天涯社区的官方网站? 天涯社区的官方网址是什么呀? 嘉陵火星人(150CC)报价 广西能上150C的摩托车牌吗 隆鑫200cc和150cc的发动机怎么辨认_百度问一问 150cc大船摩托车问题!请高手帮我·· 我想问问这是125cc还是150cc 滁州琅琊山的门票要多少钱 为什么手机连上WiFi却无法上网了? 2020年上海市健康管理师考试报名条件有哪些? 上海健康管理师考试哪里报名 2020年上海健康管理师报名时间是什么时候? 2020年上海健康管理师报名时间 上海健康管理师考试报名在哪里 上海市2020年健康管理师考试报名流程 上海市2020年健康管理师考试报名入口在哪儿? 怎么在酷狗音乐里下载歌曲到MP4?详细过程!! 风吹女人花歌曲表达什么意思 女人花 这首歌讲的事什么故事 女人花是什么曲风 《女人花》这首歌写了怎样的一个 故事!!! 如何评价《女人花》这首歌? 梅艳芳!女人花的歌词! 女人花 这首歌的含义是? 一个男人唱一首《女人花》给女孩听是什么意思? 女人花这首歌表达什么意思? 女人花歌词表达的含义? 基本农田可以搞小龙虾养殖吗 该如何给饲养小龙虾的池塘施基肥,养小龙虾基肥怎样施? 三国志11怎么保存 我在CORELDRAW11中做的图保存之后为什么是CORELDRAW9的呢? 荷兰豆放在冰箱里发芽了能吃吗 关于会声会影11 视频保存 荷兰豆子放了2,3天,发芽了。还能吃吗? 建行存折上种类一栏写的是“整整”,而另一个存折上是11,有什么区别? 我用GHOST11做的镜像备份文件保存在D盘的问题 青豌豆放在冰箱里十多天了发芽了还能吃吗 三国志11中文版怎么保存 豌豆在冰箱里发芽了,还能吃吗? 在数据库里保存一个11位的手机号码用什么类型 天津理工大学化学系怎么样 三国志11威力加强版 存档 你好,帮一下吧,刚调剂到天津理工大学化学工程专硕,这个怎么样啊,8号复试,求帮助 三国志11 无法保存 豌豆放冰箱几天放吃了,今天打开一看发芽了,请问还能吗 三国志11无法保存游戏 天津理工大学研究生化学专业怎么样啊 ? 本人今年考研,总分317,想调到天津理工大学应用化学专业,想知道这个专业怎么样? 天津理工大学化工与制药类怎么样