javascript - 在加载图像之前将 crossorigin="anonymous" 添加到所有 img 标签
问题描述
我的画布抛出错误时遇到问题,因为它试图加载此处描述的缓存图像: https ://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image
为了解决这个问题,我想添加crossorigin="anonymous"
到我网站上的所有图像中,但是在加载图像之前我怎么能做到这一点,以便它们加载正确的标题,不会使我的画布崩溃?
$('img').each(function() {
var $img = $(this);
$img.attr('crossorigin',anonymous);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<img width="50%" src="https://ychef.files.bbci.co.uk/1600x900/p08ysrxd.webp">
解决方案
您正在做的方式应该有效(在修复语法错误之后),您必须crossOrigin
在下一个microtask checkpoint之前处理属性的设置,这意味着您必须同步进行,而不是在异步脚本或事件处理程序中。
然而,浏览器并不总是遵循这个规则,在某些情况下,缓存图像的加载可以同步完成。因此,为避免出现这种情况,您可以简单地将其设置src
为相同的值,以强制浏览器使用正确的标头加载资源。
$('img').each(function() {
var $img = $(this);
$img.attr({
crossorigin: "anonymous",
src: this.src
});
});
// test we loaded it with the proper headers
$(window).on("load", () => {
const canvas = document.createElement("canvas");
canvas.getContext("2d").drawImage($('img')[0], 0, 0);
console.log('cross-origin enabled', !!canvas.toDataURL());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<img width="50%" src="https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png">
但是在您的位置上,我会仔细检查为什么此时需要这样做,正确的解决方法显然是从头开始设置属性:
// test we loaded it with the proper headers
window.onload = () => {
const canvas = document.createElement("canvas");
canvas.getContext("2d").drawImage( document.querySelector('img'), 0, 0);
console.log('cross-origin enabled', !!canvas.toDataURL());
};
<img crossorigin="anonymous" width="50%" src="https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png">
但是请注意,您问题中的图像Vary: Origin
仅在作为跨域请求时才由 Amazon S3 提供标头,这将使 Chrome 仍使用缓存版本,即使crossOrigin
设置了属性,请参阅此 Q/A 了解更多信息.
在这种情况下,唯一的方法是始终设置crossOrigin
属性。
推荐阅读
- neural-network - 迁移学习后如何使用原始输出层并获得两个模型的预测?
- node.js - Node js 聊天应用程序比 Java 慢的原因可能是什么?
- sql - 如何在 MS-Access 中使用 vba 删除一行报告
- voice-recognition - 将可执行文件转换为模拟波形信号
- java - Kotlin Spring Boot 测试端点和服务层,并模拟存储库层
- angular - Base64 编码文件在 HTTP POST 请求中变为空字符串
- android - 如何让安卓手机的火狐在电脑上打开我的wordpress?
- python - 修复 Box2D 图纸
- c - 无条件循环的卷积运算
- python - 未定义符号:__atomic_fetch_add_8