jquery - 循环通过图像“srcset”属性并替换文件类型后缀
问题描述
我正在使用功能检测来确定浏览器.webp
是否仅支持这些浏览器的格式和加载 javascript。我在客户端这样做的原因是 PHP 解决方案(使用 .htaccess)不起作用,可能是因为我的 CDN 正在缓存 JPEG、PNG 或 GIF 版本。
此代码有效,但它会引发错误 ( Uncaught TypeError: Cannot read property 'match' of undefined
),并且该错误会停止所有其他脚本的运行。不漂亮。
jQuery(document).ready(function ($) {
$('a[href$=".jpg"]').each(function (index, element) {
element.href = element.href.replace(/\.(gif|jpe?g|png)$/i, '.webp');
});
$('img').each(function (index, element) {
var elem = $(this);
if (elem.attr('src').match(/\.(gif|jpe?g|png)$/i)); {
element.src = element.src.replace(/\.(gif|jpe?g|png)$/i, '.webp');
}
});
$('img').each(function (index, element) {
var elem = $(this);
if (elem.attr('srcset').match(/\.(gif|jpe?g|png)/ig)) {
element.srcset = element.srcset.replace(/\.(gif|jpe?g|png)/ig, '.webp');
}
});
});
如果我更改$('img').each(function (index, element) {
为$('.element img').each(function (index, element) {
错误消失,但脚本不再替换后缀。
我哪里错了?
解决方案
那里有几个match
,但检查某些东西是否真的是你认为的那样总是一个好主意。
在这种情况下,attr()
很可能返回undefined
一个或多个元素,因此您必须检查
$('img').each(function (index, element) {
var elem = $(this),
scrset = elem.attr('srcset');
if (srcset && srcset.match(/\.(gif|jpe?g|png)/ig)) {
element.srcset = element.srcset.replace(/\.(gif|jpe?g|png)/ig, '.webp');
}
});
Doingif (srcset && srcset.match...
意味着如果第一个检查失败,则第二个检查不会运行,当传入 or 之类的虚假值时它会null
运行undefined
。
推荐阅读
- java - 防止反编译/逆向工程 Android APKs
- android - 如何在不与 MainActivity 交互的情况下从通知中打开片段页面?
- git - 将 gitlab 存储库复制到 Bitbucket,包括子模块
- android - 在android画布中使用cubicTo绘制云形状
- android - 如何从 Android 将图像 blob 上传到 Azure
- python - 手势检测
- python-3.x - 如何在python中“在文件中的任何位置添加条目”
- c++ - cin 和循环的问题
- python-3.x - 如何从excel中删除重复的单词
- symfony - 如何使 Twig 模板正确显示精美的 Bootstrap 3 单选按钮?