如何使用 jQuery.Lazy() 插件和散列图像标签助手 asp-append-version(在 asp.net 核心中)
How to use jQuery.Lazy() Plugin with hash Image Tag Helper asp-append-version (in asp.net core)
我在配置 jQuery.Lazy()
以处理已附加哈希的图像时遇到问题。在 asp.net 核心 Razor 页面中,您可以使用 Image Tag Helper,以便服务器在 src 后附加哈希值,如果图像被修改过,该哈希值是 checked/updated。语法非常简单:
对于 <img>
,只需添加 asp-append-version="true"
,服务器就会自动将散列附加到 src。即:
<img src="/images/Photo.jpg" asp-append-version="true">
这将在浏览器中显示为:
<img src="/images/Photo.jpg?v=4jjcjhwsV9YZ1K8lXgg_50rci1ju_mNaz-HABqCvPFk">
问题是:它只能应用于 src,因此是问题所在。
所以当我像这样将 .lazy 添加到 <img>
时:
<img class="lazy" src="/images/PhotoPlaceholder.png" data-src="/images/Photo.jpg" asp-append-version="true">
.lazy 效果很好(图像按预期淡入),但 HTML 现在是这样的:
<img class="lazy" src="/images/PhotoPlaceholder.png?v=4jjcjhwsV9YZ1K8lXgg_50rci1ju_mNaz-HABqCvPFk" data-src="/images/Photo.jpg">
显然,现在哈希将不起作用,因为它附加到 PhotoPlaceholder.png 而不是 Photo.jpg。那么,如何配置 jQuery.Lazy()
以使用散列?使用 jQuery.Lazy()
或一些额外的 jquery?顺便说一句:我已经尝试使用 'attribute' 选项等,但无法正常工作。有人知道如何解决这个问题吗?我不可能是唯一一个对这个问题有 运行 的人。
此外,这可能吗?还是我只需要选择一个功能而不是另一个?我需要版本哈希检查,因为图像可能会被用户更改,因此它们需要自动刷新(而不是每个人都必须通过点击页面上的 <ctrl> F5
来清空缓存重新加载)。我也了解浏览器 use/need 和 <src>
来显示图像(从这个角度来看,可以做的不多),但我希望有人可能想出了解决这个难题的方法。
我的 jQuery.Lazy() 非常简单:
$(".lazy").Lazy({
effect: 'fadeIn',
effectTime: 1000
});
感谢任何 help/suggestions... :)
事实证明,有两种方法可以解决这个问题:
解决方案一:
感谢@eisbehr 的一些帮助,有一种方法可以使用隐藏的 <link>
元素在客户端附加 data-src,如下所示:
<link class="hide-control" id="source-img-1" href="/images/Photo.jpg" asp-append-version="true">
<img class="lazy" id="img-1" data-loader="hashedImageLoader" src="/images/PhotoPlaceholder.png" data-src="/images/Photo.jpg" asp-append-version="true">
这将产生以下 HTML 标记:
<link class="hide-control" id="source-img-1" href="/images/Photo.jpg?v=AAnmbJAusQ-go5lyg9qCes4WGj8oWsp4eGH78CKKUPA">
<img class="lazy" id="img-1" data-loader="hashedImageLoader" src="/images/PhotoPlaceholder.png?v=4jjcjhwsV9YZ1K8lXgg_50rci1ju_mNaz-HABqCvPFk" data-src="/images/Photo.jpg">
然后使用 Jquery,使用 <link>
中的 href 更新 <img>
,如下所示:
$('.lazy').Lazy({
effect: 'fadeIn',
effectTime: 1000,
beforeLoad: element => {
let source = $('#source-' + element.attr('id')).attr('href');
element.attr('data-src', source);
}
});
方案二:
第二种方法(可能是@JasonPan 建议的首选方法)是使用 asp.net 核心在服务器上附加 data-src 和 asp-append-version。在页面中(或部分视图,如果通过 AJAX 检索),只需添加:
@using Microsoft.Extensions.DependencyInjection;
var versionProvider = Context.RequestServices.GetRequiredService<IFileVersionProvider>();
// Loop as needed for each file
PathFile = "/images/Photo.jpg";
PathFileWithHash = versionProvider.AddFileVersionToPath(Context.Request.Path, PathFile);
<img class="lazy" src="/images/PhotoPlaceholder.png" data-src="@PathFileWithHash" asp-append-version="true">
在客户端,只需调用 .lazy:
$(".lazyLoadImage").Lazy({
effect: "fadeIn",
effectTime: 1000
});
两种解决方案都按预期工作,所以请选择...:)
我在配置 jQuery.Lazy()
以处理已附加哈希的图像时遇到问题。在 asp.net 核心 Razor 页面中,您可以使用 Image Tag Helper,以便服务器在 src 后附加哈希值,如果图像被修改过,该哈希值是 checked/updated。语法非常简单:
对于 <img>
,只需添加 asp-append-version="true"
,服务器就会自动将散列附加到 src。即:
<img src="/images/Photo.jpg" asp-append-version="true">
这将在浏览器中显示为:
<img src="/images/Photo.jpg?v=4jjcjhwsV9YZ1K8lXgg_50rci1ju_mNaz-HABqCvPFk">
问题是:它只能应用于 src,因此是问题所在。
所以当我像这样将 .lazy 添加到 <img>
时:
<img class="lazy" src="/images/PhotoPlaceholder.png" data-src="/images/Photo.jpg" asp-append-version="true">
.lazy 效果很好(图像按预期淡入),但 HTML 现在是这样的:
<img class="lazy" src="/images/PhotoPlaceholder.png?v=4jjcjhwsV9YZ1K8lXgg_50rci1ju_mNaz-HABqCvPFk" data-src="/images/Photo.jpg">
显然,现在哈希将不起作用,因为它附加到 PhotoPlaceholder.png 而不是 Photo.jpg。那么,如何配置 jQuery.Lazy()
以使用散列?使用 jQuery.Lazy()
或一些额外的 jquery?顺便说一句:我已经尝试使用 'attribute' 选项等,但无法正常工作。有人知道如何解决这个问题吗?我不可能是唯一一个对这个问题有 运行 的人。
此外,这可能吗?还是我只需要选择一个功能而不是另一个?我需要版本哈希检查,因为图像可能会被用户更改,因此它们需要自动刷新(而不是每个人都必须通过点击页面上的 <ctrl> F5
来清空缓存重新加载)。我也了解浏览器 use/need 和 <src>
来显示图像(从这个角度来看,可以做的不多),但我希望有人可能想出了解决这个难题的方法。
我的 jQuery.Lazy() 非常简单:
$(".lazy").Lazy({
effect: 'fadeIn',
effectTime: 1000
});
感谢任何 help/suggestions... :)
事实证明,有两种方法可以解决这个问题:
解决方案一:
感谢@eisbehr 的一些帮助,有一种方法可以使用隐藏的 <link>
元素在客户端附加 data-src,如下所示:
<link class="hide-control" id="source-img-1" href="/images/Photo.jpg" asp-append-version="true">
<img class="lazy" id="img-1" data-loader="hashedImageLoader" src="/images/PhotoPlaceholder.png" data-src="/images/Photo.jpg" asp-append-version="true">
这将产生以下 HTML 标记:
<link class="hide-control" id="source-img-1" href="/images/Photo.jpg?v=AAnmbJAusQ-go5lyg9qCes4WGj8oWsp4eGH78CKKUPA">
<img class="lazy" id="img-1" data-loader="hashedImageLoader" src="/images/PhotoPlaceholder.png?v=4jjcjhwsV9YZ1K8lXgg_50rci1ju_mNaz-HABqCvPFk" data-src="/images/Photo.jpg">
然后使用 Jquery,使用 <link>
中的 href 更新 <img>
,如下所示:
$('.lazy').Lazy({
effect: 'fadeIn',
effectTime: 1000,
beforeLoad: element => {
let source = $('#source-' + element.attr('id')).attr('href');
element.attr('data-src', source);
}
});
方案二:
第二种方法(可能是@JasonPan 建议的首选方法)是使用 asp.net 核心在服务器上附加 data-src 和 asp-append-version。在页面中(或部分视图,如果通过 AJAX 检索),只需添加:
@using Microsoft.Extensions.DependencyInjection;
var versionProvider = Context.RequestServices.GetRequiredService<IFileVersionProvider>();
// Loop as needed for each file
PathFile = "/images/Photo.jpg";
PathFileWithHash = versionProvider.AddFileVersionToPath(Context.Request.Path, PathFile);
<img class="lazy" src="/images/PhotoPlaceholder.png" data-src="@PathFileWithHash" asp-append-version="true">
在客户端,只需调用 .lazy:
$(".lazyLoadImage").Lazy({
effect: "fadeIn",
effectTime: 1000
});
两种解决方案都按预期工作,所以请选择...:)