抑制 retina.js 库中的 404 错误

2024-04-29

我们使用js库视网膜.js https://github.com/imulus/retinajs/它将低质量图像替换为“视网膜”图像(大小乘以 2)。问题是,retina.js 会为每个无法找到的“视网膜”图像抛出 404 错误。

我们拥有一个网站,用户可以上传自己的图片,这些图片很可能不是视网膜分辨率的。

有没有办法阻止js抛出404?

如果您不了解该库。这是抛出 404 的代码:

http = new XMLHttpRequest;
http.open('HEAD', this.at_2x_path);
http.onreadystatechange = function() {
    if (http.readyState != 4) {
        return callback(false);
    }

    if (http.status >= 200 && http.status <= 399) {
        if (config.check_mime_type) {
            var type = http.getResponseHeader('Content-Type');
            if (type == null || !type.match(/^image/i)) {
                return callback(false);
            }
        }

        RetinaImagePath.confirmed_paths.push(that.at_2x_path);
        return callback(true);
    } else {
        return callback(false);
    }
}
http.send();

我看到有一些选择可以缓解这种情况。

增强并保留 retina.js 的 HTTP 调用结果缓存

对于任何设置为替换“1x”版本的给定“2x”图像,retina.js 首先通过以下方式验证图像的可用性:XMLHttpRequest要求。成功响应的路径将缓存在数组中并下载图像。

以下更改可能会提高效率:

  • Failed XMLHttpRequest验证尝试可以被缓存:目前,只有先前成功的“2x”路径验证尝试才会被跳过。因此,失败的尝试可能会再次发生。实际上,这并不重要,因为验证过程是在页面最初加载时发生的。但是,如果结果持续存在,跟踪故障将防止 404 错误再次出现。

  • 保留“2x”路径验证结果localStorage:在初始化期间,retina.js可以检查localStorage用于结果缓存。如果找到,则可以绕过已遇到的“2x”图像的验证过程,并且可以下载或跳过“2x”图像。可以验证新遇到的“2x”图像路径并将结果添加到缓存中。理论上,虽然localStorage可用时,每个浏览器上的图像只会出现一次 404 错误。这将适用于域上任何页面的跨页面。

这是一个快速检查。可能需要添加过期功能。

https://gist.github.com/4343101/revisions https://gist.github.com/4343101/revisions

使用 HTTP 重定向标头

我必须指出,我对“服务器端”问题的掌握是spotty, 最好。请收下这个FWIW

另一种选择是服务器使用重定向代码响应具有以下内容的图像请求:@2x字符且不存在。看这个相关答案 https://stackoverflow.com/a/3778511/1888292.

尤其:

如果您重定向图像并且它们是可缓存的,那么您最好为遥远的将来的某个日期设置 HTTP Expires 标头(以及相应的 Cache-Control 标头),这样至少在后续访问该页面时用户不会再次进行重定向。

使用重定向响应将消除 404 错误,并导致浏览器跳过后续访问不存在的“2x”图像路径的尝试。

retina.js 可以变得更有选择性

可以修改 retinajs 以排除某些图像。

与此相关的拉取请求:https://github.com/imulus/retinajs/commit/e7930be https://github.com/imulus/retinajs/commit/e7930be

根据拉取请求,而不是查找<img>元素通过标签名称,可以使用 CSS 选择器,这可以是 retina.js 的可配置选项之一。可以创建一个 CSS 选择器来过滤掉用户上传的图像(以及预计不存在“2x”变体的其他图像)。

另一种可能性是向可配置选项添加过滤功能。该函数可以在每个匹配的<img>元素; Areturn true会导致下载“2x”变体,其他任何情况都会导致<img>被跳过。

基本的默认配置将从当前版本 https://github.com/imulus/retinajs/blob/5671145d8a8adf3d72b6b62d8927799f8dd97863/src/retina.js#L5像这样的东西:

var config = {
  check_mime_type: true,
  retinaImgTagSelector: 'img',
  retinaImgFilterFunc: undefined
};

The Retina.init()函数将从当前版本 https://github.com/imulus/retinajs/blob/5671145d8a8adf3d72b6b62d8927799f8dd97863/src/retina.js#L22像这样的东西:

Retina.init = function(context) {
  if (context == null) context = root;

  var existing_onload = context.onload || new Function;

  context.onload = function() {
    // uses new query selector
    var images = document.querySelectorAll(config.retinaImgTagSelector), 
        retinaImages = [], i, image, filter;

    // if there is a filter, check each image
    if (typeof config.retinaImgFilterFunc === 'function') {
      filter = config.retinaImgFilterFunc;
      for (i = 0; i < images.length; i++) {
        image = images[i];
        if (filter(image)) {
          retinaImages.push(new RetinaImage(image));
        }
      }
    } else {
      for (i = 0; i < images.length; i++) {
        image = images[i];
        retinaImages.push(new RetinaImage(image));
      }
    }
    existing_onload();
  }
};

在付诸实践之前window.onload火灾,请致电:

window.Retina.configure({

  // use a class 'no-retina' to prevent retinajs
  // from checking for a retina version
  retinaImgTagSelector : 'img:not(.no-retina)',

  // or, assuming there is a data-owner attribute
  // which indicates the user that uploaded the image:
  // retinaImgTagSelector : 'img:not([data-owner])',

  // or set a filter function that will exclude images that have
  // the current user's id in their path, (assuming there is a
  // variable userId in the global scope)
  retinaImgFilterFunc: function(img) {
    return img.src.indexOf(window.userId) < 0;
  }
});

更新:清理和重组。添加了localStorage增强。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抑制 retina.js 库中的 404 错误 的相关文章

  • 将构造函数传递给 Array.map?

    我怎样才能做这样的事情 var a 1 2 3 4 a map Date constructor 此代码在 Google V8 上引发错误 SyntaxError Unexpected number 我也尝试过 a map Date con
  • 实现快速 Javascript 搜索?

    基本上 我有一个带有文本框的页面和 ul 列在其下面 这 ul 由用户的朋友列表填充 用户开始在文本框中输入朋友的名字 例如按 r 我想立即更新 ul 每次按键仅显示名字以 R 开头的朋友 例如 Richard Redmond Raheem
  • asp.net 将值从 JS/jquery 传递到 C# 背后的代码

    我已经尝试了 所有 可能的方法 将 screen width vlaue 从 aspx 页面上的 JS 脚本发送到后面代码中的 c 虽然我可以看到 screen width 被正确分配 但它永远不会分配给我的隐藏字段价值
  • 以编程方式在指令内添加指令

    我想将指令的另一个实例附加到父指令中 但我无法使用 apply 重新编译我的指令 我想我在某个地方错过了一些东西 我的 HTML 代码 div div div div
  • 如何从 Javascript/Typescript 中的数组对象计算运行总计并使用 HTML 在每个实例上显示输出?

    我正在开发一个 MEAN 堆栈项目 并且有一个如下所示的数组 savings any 300 450 350 500 我还有一个名为 saving bf 的变量 它是从数据库中检索的结转储蓄 其值如下 savings bf 15000 我想
  • 如何翻转 Twitter Bootstrap 的工具提示

    我正在使用 Twitter 的 Bootstrap 来实现工具提示 目前 工具提示显示在链接上方 我希望工具提示出现在链接下方 我该怎么做呢 我正在触发工具提示 它明确指出 底部 但它不想为我工作 tooltip tooltip place
  • 如何在 HTML 表格上使用分页?

    我正在尝试使用这个分页library http flaviusmatis github io simplePagination js 在我的 HTML 表格页面 特别是浅色主题 中 但不知何故 我无法理解如何在我的 HTML 页面中以这种方
  • 将事件添加到 Google Maps API InfoWindow 内的元素

    我想在 Google Maps API v3 InfoWindow 内放置一个带有输入字段和提交按钮的表单 提交后 我想调用一个函数 该函数使用输入字段中输入的地址启动方向服务 这是我的代码 我目前只测试方向事件是否被触发 我已经编写了完整
  • 从 html5

    我正在寻找一种方法来根据用户代理字符串将控件属性添加到视频标签 我不希望在 iPad 和 Android 之外的任何浏览器或设备上出现控件属性 所以我认为用户代理是最好的识别方法 因为 ipad 和 android 一词出现在各自的 UA
  • 创建 html 结构,每个 li 中仅允许 3 个 div 元素。在 React + underscore.js 中

    这是以下内容的位副本如何创建每个 li 中仅允许 3 个 div 元素的 html 结构 在 React underscore js 中 https stackoverflow com questions 38008023 how to c
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • Onblur 事件在另一个 div 的 onclick 之前触发

    如上所述 我有一个按钮 单击该按钮将打开子菜单 对于子菜单中的每个选项 都有三个元素 我认为实际上还有更多元素 但为了简单起见 将其保留为 3 我将焦点放在子菜单的主 div 白色 框架 上 Onblur 这个 div 然后我隐藏子菜单 这
  • JavaScript 中的最短路径

    几周来我一直在寻找一种在 JavaScript 中计算最短路径的方法 我一直在玩书数据结构和算法作者 格罗纳 Groner 名字恰如其分 https github com loiane javascript datastructs algo
  • Facebook API Javascript JSON 响应

    function getUser FB api me function response console log Response is response alert Your name is response first name ale
  • 如何显示 GroupList 的 FormArray?

    我正在尝试制作一个交互式表单 在每一行上列出一个项目以及一个删除按钮 在我的示例中称为 verwijderen 这些项目是从数据库中检索的 并且每个项目都实例化为名为的自定义对象LaborPeriod 然后这些对象被转化为FormGroup
  • 如何使用 Jquery .animate() 函数创建连续滚动内容? [复制]

    这个问题在这里已经有答案了 可能的重复 在jquery中实现圆形滚动条 https stackoverflow com questions 812049 implementing circular scroller in jquery 我想
  • 使用 javascript/jquery 从数据库格式化日期的正确方法

    我正在调用包含日期时间数据类型的数据库 日期看起来像这样 2005 05 23 16 06 00 000 当用户从列表中选择某个项目时 我想在表格中显示它 我调用我的控制器操作并返回所有时间的 Json 并将它们放入表中 问题是日期完全错误
  • JavaScript 正则表达式两个标签之间的多行文本

    我编写了一个正则表达式来从 HTML 中获取字符串 但似乎多行标志不起作用 这是我的模式 我想将文本输入h1 tag var pattern div class box content 5 h1 lt lt h1 gt mi m html
  • JsGrid 将嵌套对象加载到表中

    我正在 Django 中开发一个 Web 项目并使用 jsGrid 我遇到了问题并且找不到解决方案 我有一个嵌套的 JSON 数据 它是通过组合多个数据库表记录创建的 这是我的 JSON count 3 results personnel
  • 如何调试 Node.js 应用程序?

    如何调试 Node js 服务器应用程序 现在我主要使用警报调试打印语句如下 sys puts sys inspect someVariable 一定有更好的调试方法 我知道谷歌浏览器 http en wikipedia org wiki

随机推荐

  • 使用 Mono Cecil 添加 try-catch

    我正在使用 Mono Cecil 在另一个方法中注入代码 我想在我的代码周围添加一个 Try Catch 块 所以我写了一个带有 try catch 块的 HelloWorld exe 并反编译了它 Try Catch 的 Reflecto
  • ng-bootstrap - ngbtooltip 不适用于 [(ngModel)]

    我是 Angular 4 和 bootstrap beta 2 的新手 并尝试使用ngbtooltip显示工具提示文本 当只有输入没有时 标签上的工具提示工作正常 ngModel 我一用过 ngModel 在输入文本控件中 工具提示仅显示第
  • Twitter Bootstrap 2 模式表单对话框

    我有以下对话框 div class modal div class modal header a class close a h3 Add Tags h3 div div class modal body div div
  • M1 MacBook Pro 和 cmake 的编译错误

    我刚刚拿到了新的 M1 MacBook Pro 正在尝试编译大学工作所需的代码库 以下是我已采取的步骤 我使用 Rosetta 将终端设置为始终打开 安装的自制程序using bin bash c curl fsSL https raw g
  • 通过 StackExchange.Redis 连接到 Redis Servier

    我尝试使用以下方法制作一个测试项目Redis https redis io服务器 通过 Virtual Box 安装在 Linux Ubuntu 虚拟机上 Linux 机器通过 Virtual Box 的桥接适配器与本地网络连接 Virtu
  • Mac OS Snow Leopard 上的两个版本的 PHP 以及使用 PECL 安装 xdebug

    我正在使用MAMP在我阅读一些有关内置 Apache PHP 的文章之前 我已经在 PHP 开发 标准 中使用过一段时间了雪豹 我决定转向那些我提供的但似乎有很多问题的人 第一件事是当我使用MAMP时 我将PEAR从1 9 0升级到1 9
  • 使用 gradle kotlin dsl 执行 JavaExec 任务

    我创建了简单的build gradle kts file group com lapots breed version 1 0 SNAPSHOT plugins java java sourceCompatibility JavaVersi
  • 跨页面加载跟踪子窗口

    如果重新加载父页面 是否可以跟踪子窗口 我目前打开窗口如下 var childWindow childWindow window open url 当我想重新打开同一个子窗口时 childWindow focus 明显的问题是 如果刷新父窗
  • Discord JS - DiscordAPIError:缺少访问权限

    所以我按照磨损钥匙教程来不和谐机器人 我不知道问题是什么 这是错误 home container node modules discord js src rest RequestHandler js 349 throw new Discor
  • cron 作业或 PHP 调度程序

    我使用 MYSQL 作为我的数据库 PHP 作为我的编程语言 我想运行一个 cron 作业 该作业将运行直到当前系统日期与我的数据库表中名为 PROJECT 的 截止日期 日期 列匹配 一旦日期相同的是 必须运行更新查询 这会将状态 项目表
  • Linux 中如何确定哪个进程正在使用某个端口

    我目前正在其默认端口上运行 RethinkDB 因为如果我将浏览器指向localhost 8080我看到 RethinkDB Web 界面 我想关闭 RethinkDB 并使用以下命令在另一个端口上重新打开它 port offset争论 然
  • 特定模型的自定义 REST url

    Ember 有没有办法为特定模型配置自定义 REST url 就像这个模型一样 App Post DS Model extend title DS attr string comments DS hasMany App Comment Ap
  • SQL原型设计:面对使用varchar(N)静默截断数据——有更好的选择吗? (天数据)

    情况 varchar 20 好像默默地截断在 Teradata 和not当遇到长度超过 20 个字符的字符串时扩展或抱怨 这有点令人惊讶 因为我预计列会自动扩展以适应更大的字符串 例如 30 个字符 或者如果更大的字符串会抛出错误遇到字符串
  • 在 Angular 中强制进行摘要

    在用户操作后的某个时刻 我希望发生摘要 因此 UI 反映了支持它的数据模型的更改 我有一个服务在回调中执行一些更改 异步 我明白那个 scope仅在控制器的上下文中才有意义 我可以通过执行来达到相同的效果吗 apply on the roo
  • 如何在 Cypress 的 E2E 测试中登录 Auth0?

    我已经开始测试 React Web 应用程序 但我没有走得太远 因为我遇到了登录问题 我在用cypress https www cypress io e2e测试工具 将显示一个带有登录按钮的欢迎页面 该页面会将您重定向到auth0 http
  • Traefikv2.3 出现 `Failed to list *v1beta1.IngressClass: ingressclasses.networking.k8s.io` 错误

    我正在尝试使用Traefik Kubernetes Ingress 我在用着traefik v2 3 K8的cli版本是v1 18 3服务器版本是v1 18 6IKS 我正在使用 IBM Kubernetes 服务来部署它 但我在 pod
  • 将 SSL 与 MAMP PRO 4 结合使用

    由于我已更新到 chrome 63 我在 localhost 中的网站被重定向到 https 因此我决定将 SSL 与 MAMP PRO 一起使用 但我无法使其工作 chrome 说您的连接不是私有的 在 MAMP 的 SSL 面板中 我生
  • 在 Three.js 中获取 Object3D 的大小

    我的场景中有这个 3D 对象 var icon new THREE Object3D var iconTexture THREE ImageUtils loadTexture images icon png iconMaterial new
  • Next.js API 路由神秘地修改 JSON 负载

    由于某种原因 当我通过 Postman 作为原始文本发送 JSON 格式的数据时 没有任何问题 当我通过 Postman 发送与原始 JSON 完全相同的数据时 区别应该只是content type标头是application json代替
  • 抑制 retina.js 库中的 404 错误

    我们使用js库视网膜 js https github com imulus retinajs 它将低质量图像替换为 视网膜 图像 大小乘以 2 问题是 retina js 会为每个无法找到的 视网膜 图像抛出 404 错误 我们拥有一个网站