当前位置: 首页 > 知识库问答 >
问题:

延迟加载不适用于图像滑块插件(WordPress、PHP、JavaScript)

仲孙凡
2023-03-14

如果能对我的惰性加载脚本有所帮助,我将不胜感激。出于我无法理解的原因,插件主滑块中的图像不会延迟加载。

我的JavaScript搜索具有data-src属性的所有图像。如果图像具有该属性,则将其与常规的src属性交换,并加载图像。如果不存在data-src,图像将被单独保留。

在此之前,我打算使用一个PHP脚本来获取所有图像,并将srcdata-src交换,因此图像无法随页面加载。

它适用于除图像滑块以外的所有内容。它是通过插件Master Slider实现的。

我认为问题应该出在PHP中,因为滑块确实加载了—只是不是惰性加载。所有src属性都起作用,这意味着JavaScript不使用滑块。

有人知道这是为什么吗?

PHP:

add_filter( 'the_content', 'my_lazyload_content_images' );
add_filter( 'widget_text', 'my_lazyload_content_images' );
add_filter( 'wp_get_attachment_image_attributes', 'my_lazyload_attachments', 10, 2 );

// Replace the image attributes in Post/Page Content
function my_lazyload_content_images( $content ) {

  //-- Change src/srcset to data attributes.
  $content = preg_replace( '/(<img.+)(src)/Ui', '$1data-$2', $content );
  $content = preg_replace( '/(<img.+)(srcset)/Ui', '$1data-$2', $content );

  //-- Add .lazy-load class to each image that already has a class.
  $content = preg_replace('/<img(.*?)class=\"(.*?)\"(.*?)>/i', '<img$1class="$2 lazy-load"$3>', $content);

  //-- Add .lazy-load class to each image that doesn't already have a class.
  $content = preg_replace('/<img((.(?!class=))*)\/?>/i', '<img class="lazy-load"$1>', $content);

  return $content;
}

// Replace the image attributes in Post Listing, Related Posts, etc.
function my_lazyload_attachments( $atts, $attachment ) {
  $atts['data-src'] = $atts['src'];
  unset( $atts['src'] );
  
  if( isset( $atts['srcset'] ) ) {
    $atts['data-srcset'] = $atts['srcset'];
    unset( $atts['srcset'] );
  }

  return $atts;
}

JavaScript:

let lazyImgs = document.querySelectorAll("img[data-src]");

function lazyLoad(lazyImgs) {
  const imgOptions = {
    threshold: 0.25,
    rootMargin: "0%",
  };

  const imgObserver = new IntersectionObserver((entries, imgObserver) => {
    entries.forEach((entry) => {
      if (entry.intersectionRatio > 0) {
        // get currently intersecting picture element and its children (source, img)
        let lazyImage = entry.target;

        // check if the element really has the attribute data-src, which we're using for lazy loading
        // if it doesn't leave the image alone
        if (lazyImage.hasAttribute("data-src")) {
          // exchange the src
          lazyImage.src = lazyImage.dataset.src;

          // also exchange the src, if the image has one
          if (lazyImage.srcset) {
            lazyImage.srcset = lazyImage.dataset.srcset;
          }
        } else {
          return false;
        }

        lazyImage.classList.add('is-loaded');

        // end observation of image once it's loaded :)
        imgObserver.unobserve(lazyImage);
      } // end is intersecting
    });
  }, imgOptions);

  // loop through all images and observe every single one
  lazyImgs.forEach((lazyImg) => {
    imgObserver.observe(lazyImg);
  });
} // end lazyLoad();

lazyLoad(lazyImgs);


And the CSS: 

.lazy-load {
  transition: opacity .15s;
  opacity: 0;
}

.lazy-load.is-loaded {
  opacity: 1;
}

共有1个答案

越霖
2023-03-14

为什么不使用默认的html5延迟加载?

<img src="_path_to_image_" loading="lazy">

https://web.dev/native-lazy-loading/

 类似资料:
  • 我似乎不能为我的生活得到任何图像懒惰加载插件在wordpress工作。我尝试了懒负载,wp懒负载和bj懒负载。网站上的图像似乎没有一个是“懒惰加载”的。我也使用审计工具(chrome审计)测试了这个。当我删除图像(每页大约有50张图像)时,我的审计绩效和其他分数为99。当我加载图像(使用wordpress循环),我的性能下降到64. 我尝试了每一个延迟加载插件,但它们似乎都不是延迟加载。我正在本地

  • 问题是:PageSpeedInsights说图像没有被延迟加载,留档说img标签应该被“data-page espeed-laily-src”属性替换(它没有这样做)。 pagespeed.conf: 超文本标记语言: 它正在转换png图像,我看到了“X-Mod-Pagespeed”标题,所以我确信模块在那里。 /pagespeed_admin显示“Lazyload Images”过滤器已启用。o

  • 我正在使用Mika Tuupola的jQuery延迟加载。 是否可以在每次延迟加载图像后调用函数。 我打算做的是跟踪图像的浏览次数。因此,如果图像是延迟加载的,这意味着用户已经看到了图像,我将通过在后台执行HTTP GET,将数据库中的计数器增加1。

  • 我正在使用这个插件jQuery延迟内容、图像和背景延迟加载程序 我尝试在延迟加载后向图像添加图像边框颜色和图像边框厚度,但似乎没有效果。若我在开发者控制台按“inspect”,我可以看到这个属性被添加到图像样式中,但它的效果并没有显示在屏幕上。 超文本标记语言 JQuery

  • 我想删除Wordpress中第一个图像上的延迟加载,用于每个帖子、页面和主页。 我不使用任何插件的懒惰加载图像,我需要一个默认的懒惰加载的解决方案通过wordpress添加。 我为functions.php找到了这个脚本,但它是为WP Rocket插件找到的,我没有这个插件。 因此,我对其进行了如下修改: 现在,我只需要删除类为“aligncenter size full remove lazy”

  • 问题内容: 我正在开发一个eshop。在基于类别的产品页面上,我放置了一些基于javascript的过滤器。但是,如果类别具有很多产品,则会出现问题。该链接具有与我相似的功能… 这个页面多么缓慢,却超过2mb !!! 对我来说,每个产品都需要一半的K字节,但是图像是个问题。.因此,我正在寻找如何延迟加载图像的方法。由于与该网站不同,我的页面具有分页功能,因此我认为加载仅对页面可见的图像是一种解决方