延迟加载包含内容的图像

时间:2014-08-24 14:49:13

标签: php jquery wordpress backbone.js

我正在处理此[页码] [1]

问题是主页有很多要展示的项目,因此加载速度非常慢。我找到的解决方案是在图像上使用延迟加载(我使用此plugin)。它适用于左列(不包含内容。您可以在向下滚动时看到图像加载)但它不能处理中心和右列的项目这是我包含的内容。

我以这种方式包含中间和右列内容:

<?php include("parts/backbone_tmpl_productos_main.php"); ?>

这是backbone_tmpl_productos_main.php文件的内容:

    <script id="tmpl_Post" type="template">
        <div class="image"><img src="<%= post_item.image_url.url %>" /></div>
        <div class="obra_meta">
            <span class="nombre_artista"><%
             _.each(taxonomy_product_cat, function(item){
                if(item.parent === 146){%><%= item.title %><% } 
                if(item.parent === 216){%><%= item.title %><% } 
             })
             %></span>
            <span class="nombre_obra"><%= title %></span>
        </div>
        <div class="descripcion_obra"></div>

        <div class="buy_opts">
            <?php if (ICL_LANGUAGE_CODE == 'en') {
                echo '<div class="precio pull-left">From: 24.99 €</div>';
            }else{
                echo '<% if(price != "") {%><div class="precio pull-left"><%= price %></div><% } %>';
            }
            ?>
            <div class="pull-right"><button class="btn btn-default boton_comprar comprar"><?=__('COMPRAR');?></button></div>
        </div>
    </script>

我认为插件不能与include内容一起使用的问题是因为内容是在插件加载后加载的。

知道什么是真正的问题吗?我该如何解决?

3 个答案:

答案 0 :(得分:0)

此wordpress插件 - https://wordpress.org/plugins/unveil-lazy-load/使用data-src属性进行延迟加载。因此,

更改

<div class="image"><img src="<%= post_item.image_url.url %>" /></div>

<div class="image"><img data-src="<%= post_item.image_url.url %>" /></div>

参考 - https://github.com/luis-almeida/unveil/blob/master/jquery.unveil.js

答案 1 :(得分:0)

延迟加载是一种JavaScript(浏览器端)效果。如果与&#34;包括&#34;无关。用PHP。

基本上PHP生成页面,包括所有包含,并传递给浏览器。然后浏览器执行JS并启动延迟加载。[1] PHP生成页面的确切方法无关紧要。

问题出在哪里最有可能是因为你有另一个脚本似乎正在定位&#34;产品&#34;绝对的课程 - 可以从&#34;数据&#34;你在代码中拥有的对象。数据脚本本身可能会强制加载,否则它不知道大小以便定位它们 - 检查此脚本中的内容。

此外,还不能保证哪个剧本会赢;当你的延迟加载脚本遍历所有产品时,发现它们是&#34; top 0&#34;这是&#34;高于折叠&#34;所以直接加载图像。然后数据脚本可能随后将这些产品定位在折叠之下,但为时已晚,它们正在加载(如果尚未加载)。无法确定确切的机制,但这是最有可能出现的情况。

解决方案:

首先,检查数据脚本是否强制加载以定位项目。如果是的话,你真的需要它们绝对定位吗?为什么不让它们流动,那么你可以删除src如下?如果你确实需要绝对的位置,我认为它很难&#34;。

其次:假设数据脚本没有强制加载,请复制一些编码 - 白痴建议的内容,并移动&#34; src&#34;进入&#34; data-src&#34;,但是你需要修改延迟加载脚本以从那里拉出图像。该代码引用了一个&#34; settings.data_attribute&#34;但文档中没有任何内容。快速阅读建议设置&#34; dettings.data_atribute&#34;到&#34; src&#34;可以工作,或询问开发人员如何使用这些设置。 (您可能还需要同时设置占位符)。但是,离开&#34; src&#34;并且在数据属性中你停止浏览器最初加载并让脚本完成它的工作,因为......

最后:在延迟加载脚本中添加超时,以便在定位产品的其他脚本之后触发。

其他注意事项:插件很棒,但是如果你有这么多插件,你可能最好自己编写其中一些插件。他们似乎有冲突。此外,延迟加载插件可以通过存储/缓存$(元素)jQuery对象来改进,而不是重复重新创建它。通过在HTML结束标记之后添加脚本,您也会出现格式错误的HTML。一些小的改进可能会鼓励您深入了解正在发生的事情。

[1]注意:为了避免注释,这简化了事情,因为在整个页面加载之前可以启动JS;买你的身体底部包括所以参数是静音。

答案 2 :(得分:0)

您可以尝试添加later-reload-script以重新加载任何无法加载的内容 图像,有时服务器拒绝处理传入的请求。 以下是帮助我解决问题的解决方法。

在模板或视图页面中添加以下javascript代码段

  

function reload_img(idx,no_of_try)   {

console.log("Reload fired " + idx);
var MAX_RETRIES = 100;
var glob = true;

$.each($("img"), function(index, value){

    if ( this.naturalWidth == 0)
    {
        $(this).attr("src", $(this).attr("src"));
        console.log( $(this).attr('src'));
        glob = false;
    }
} );

if ( !glob && no_of_try < MAX_RETRIES )
    setTimeout(function(){ reload_img(idx + 1, no_of_try + 1); }, 1500); 
     

}

     

setTimeout(function(){reload_img(1,1);},1500); //在这里启动reload_img()

代码只检查元素是否已加载和呈现。 如果没有,则重试加载最多100次重试的图像。