我正在开发一个eshop。基于类别的产品页面我推出了一些基于javascript的过滤。但是,如果某个类别包含大量产品,则会出现问题。 这个链接有类似我做的... http://www.snowandrock.com/sunglasses/snowboard/fcp-category/list?resetFilters=true
这个页面的速度是多么缓慢且超过2mb !!!
每个产品对我来说都需要一半的killobyte,但形象是问题.. 所以我正在寻找如何懒惰加载图像.. 由于我的页面具有不同于该站点的分页,我认为加载仅对页面可见的图像是一种解决方案。然而,探测器是如何为javascript和非javscript启用的人工作的。 我唯一的解决方案是将链接存储在css类中以某种方式显示非可见产品的图像,如果在过滤后通过javascript显示图像src ... 非JavaScript用户不会遇到此问题,因为点击过滤器会将其导航到其他页面...
还有其他想法吗?
答案 0 :(得分:7)
以下是三个选项:
Kangkan's background answer已涵盖此内容。
如果这对您不起作用,我假设您只需要有关启用JavaScript的内容的帮助,因为您说非JavaScript用户会看到不同的页面。
分页 已完成 。你在评论中说你正在使用jQuery。有很多用于分页的jQuery插件。找一个你喜欢的,并使用它。它们的质量会有所不同,所以你需要测试它们并检查它们的代码,但我确信那里有一个质量上乘的产品。
这是主页加载完全没有任何产品,或只加载第一页产品。通常,您将所有产品放入容器中,如下所示:
<ul id='productList'>
</ul>
然后,您将拥有通常的UI控件,用于在结果页面之间移动。您有一个服务器端资源,它返回了可用于填充该列表的HTML片段或JSON格式的数据。我将使用HTML来简化(虽然我可能在生产应用程序中使用JSON,因为它往往会更小)。每个产品条目都是它自己的独立块:
<li id='product-001'>
<div>This is Product 001</div>
<img src='http://www.gravatar.com/avatar/88ca83ed97a129596d6e8dd86deef994?s=32&d=identicon&r=PG'>
<div>Blurb about Product 001</div>
</li>
...然后页面会根据您的想法返回尽可能多的内容。您使用Ajax请求页面并使用JavaScript更新产品列表。既然你已经说过你使用jQuery,那么这很简单:
$('#productList').load("/path/to/paging/page?start=X&count=Y");
这是example prototype(非生产代码);它伪造了Ajax,因为JSBin给了我Ajax问题。
我不确定您是如何进行过滤的,但如果您的元素包含产品信息,则可以将图片网址存储在data-xyz
属性中:
<div id='product-123' data-image='/images/foo.png'>
然后,当您的代码可见时,您可以轻松地向其添加img
:
var prod, imgsrc, img;
prod = document.getElementById('product-123');
prod.style.display = 'block'; // Or whatever you're doing to show it
imgsrc = prod.getAttribute('data-image');
if (imgsrc) {
img = document.createElement('img');
img.src = imgsrc;
prod.appendChild(img); // You'd probably put this somewhere else, but you get the idea
prod.removeAttribute('data-image');
}
编辑在其他地方的评论中,您说您正在使用jQuery。如果是这样,上述内容的翻译可能如下所示:
var prod, imgsrc, img;
prod = $('#product-123');
prod.show();
imgsrc = prod.attr('data-image');
if (imgsrc) {
$("<img/>").attr('src', imgsrc).appendTo(prod); // You'd probably put this somewhere else, but you get the idea
prod.removeAttr('data-image');
}
隐藏时无需再次移除它,因为图像已经显示,这就是我们使用它后删除属性的原因。
我使用data-
前缀的原因是验证:从HTML5开始,您可以定义自己的data-xyz
属性,您的网页仍会通过验证。在早期版本的HTML中,您不允许定义自己的属性(尽管实际上没有主要的浏览器关注),因此如果您使用自己的属性,页面将无法验证。
参考文献(w3.org):
data-*
attributes getElementById
createElement
getAttribute
removeAttribute
appendChild
偏离主题,但如果你使用像jQuery,Closure,{{3}这样的JavaScript库,那么这些内容的很多会变得容易多了},Prototype或YUI为你平滑粗糙的边缘。(你已经说过你正在使用jQuery。)
答案 1 :(得分:4)
如果您只是希望缓慢加载图像并首先加载页面的其余部分,则可以将图像作为背景放置而不使用<img>
标记。如果使用<img>
标记,则在加载页面时会加载图像,因此页面加载会变慢。但是,在向用户显示页面之后加载背景图像。用户可以阅读文本并在一段时间后看到加载的图像。
答案 2 :(得分:1)
我很确定如果没有某种Javascript干预,那么在普通的HTML中是不可能的。
毕竟,如果没有脚本可以做到这一点,为什么有人会首先在Javascript中实现它?
我的问题是:你有多少访问者,这些天没有启用Javascript?我打赌它很少。在任何情况下,这些人习惯于在禁用javascript时功能不全的网站;如果他们必须忍受的唯一区别是加载速度较慢,那么你的网站实际上会比大多数网站更好。
(ps - 我认为你正在为启用Javascript的人使用Jquery's LazyLoad plugin吗?)
答案 3 :(得分:1)
我建议实施responsive image approach以避免在无法正确显示的设备上显示大量图像文件(或人无法区分)。
答案 4 :(得分:1)
我为自己的网站编写了以下代码。我用过JQuery: 1.命名所有类,其中U想要通过相同的名称延迟加载,说“异步” 2.将实际图像位置从'src'复制到'alt'属性 3.完成页面加载后,我的脚本会将所有'alt'值复制到'src'中 看一下例子。这是完整的工作示例html:
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('img.async').each(function(i, ele) {
$(ele).attr('src',$(ele).attr('alt'));
});
});
</script> </head> <body> <img class="async" title="Гороскопы" alt="http://virtual-doctor.net/images/horoscopes.jpg" width="135" height="135"/>
</body>
</html>
您可以在实际网站中感受到我使用它的速度 http://virtual-doctor.net/
答案 5 :(得分:0)
编辑:我重读了您的问题&amp;注意到你也希望这适用于禁用Javascript的人!然后是的,我的回答是不可接受的 - 但我会把它留作记录。
以下是一些用于Image Lazy Loading的Javascript库。
它们可以帮助您加载元素所需的图像。只需更改图像src属性即可查看。
github.com/toddmotto/echo和toddmotto.com/echo-js-simple-javascript-image-lazy-loading:普通的JS,IE8 +,2KB,只有5个贡献者github.com/toddmotto/echo/graphs/contributors
github.com/dinbror/blazy/和dinbror.dk/blog/blazy - 简单的JS,IE7 +,1.2KB(缩小和gzipped),只有一个贡献者github.com/dinbror/blazy/graphs/contributors
github.com/tuupola/jquery_lazyload和www.appelsiini.net/projects/lazyload:jQuery依赖项,MIT许可证,在OSX&amp ;;上使用Safari 5.1,Safari 6,Chrome 20,Firefox 12进行测试Chrome 20,IE 8&amp; Windows 9上的IE 9,iOS 5上的Safari 5.1,iPhone和iPad。 18个贡献者https://github.com/tuupola/jquery_lazyload/graphs/contributors
github.com/luis-almeida/unveil和luis-almeida.github.io/unveil - 特殊:Lazy Load github.com/tuupola/jquery_lazyload的轻量级版本:IE7 +,jQuery依赖项,MIT许可证,5个贡献者https://github.com/luis-almeida/unveil/graphs/contributors
github.com/shprink/BttrLazyLoading和bttrlazyloading.julienrenaux.fr - special:致力于响应式设计:jQuery依赖,IE9 +,MIT许可,3KB(缩小和拉链),5个贡献者github.com/shprink/BttrLazyLoading/graphs/contributors
重要:我仍在调查哪些Javascript库最适合使用。做你的家庭作业我会说,花一些时间来寻找什么是最好的工具。我的要求通常是:license
,dependencies
,browser support
,device support
,weight
,community
和history
。
答案 6 :(得分:0)
现代浏览器可以使用 loading="lazy"
属性延迟加载图像!
<img src="image.png" loading="lazy" alt="…" width="200" height="200">
有关详细信息,请访问 here。