使用 javascript 延迟加载 Elementor 部分

Posted

技术标签:

【中文标题】使用 javascript 延迟加载 Elementor 部分【英文标题】:Lazy Load Elementor Section with javascript 【发布时间】:2021-04-19 22:32:47 【问题描述】:

有没有办法用javascript延迟加载wordpress elementor部分,以便首先页面加载在一秒钟内,然后所有部分依次延迟加载。

【问题讨论】:

嗨 Nadim,欢迎来到 ***。请注意,该论坛旨在就可重现的示例提出特定的代码问题,而不是询问工具推荐(请参阅What topics can I ask about here? 帖子的第 4 点)。这样的话题最好在Software Reccomendations上提问。 我也在寻找相同的解决方案。 @AxelKöhler,这不是软件推荐,我们正在寻找具体解决方案的代码sn-p。 @amarinediary 这是关于部分,而不是图像。 【参考方案1】:

我来到这里是因为我的部分包含一个短代码,其中包含一些繁重的 html,从某种意义上说,由于 JavaScript,它会大大减慢页面加载速度,因为这些是 slick.js滑块,我在主页上找到了其中的三个。我说的滑块插件是Woo Product Slider and Carousel with category

我现在的想法是将短代码包装到我自己的短代码中,并确保触发 JS 来初始化滑块,如下所示:

[heavy onload="wcpscwc_product_slider_init()"][wcpscwc_pdt_slider cats="133" limit="12"][/heavy]

heavy 短代码是这样实现的:

/**
 * Heavy
 * 
 * Lazy load heavy elements
 */
add_shortcode('heavy', function ($atts = [], $content = null) 
    if (
        strpos($_SERVER['REQUEST_URI'], '/post.php') !== false ||
        strpos($_SERVER['REQUEST_URI'], 'elementor') !== false
    ) 
        return $content;
     else 
        $atts = shortcode_atts([
            'offset' => '100',
            'onload' => ''
        ], $atts);

        ob_clean();
        ob_start();

        $id = wp_generate_uuid4();
?>
        <div id="<?php echo $id; ?>" class="heavy-container" data-offset="<?php echo $atts['offset']; ?>" onload="<?php echo $atts['onload']; ?>"></div>
        <script type='text/javascript'>
            (function() 
                window.heavy = window.heavy || ;
                window.heavy["<?php echo $id; ?>"] = <?php echo json_encode(do_shortcode($content)); ?>;
            )();
        </script>
<?php
        return ob_get_clean();
    
);

它只是将编码的 HTML 存储在全局 heavy 对象中,一旦您使用页面底部的此 JS 将其相应的 div 滚动到视图中,就可以进行初始化(确保它在最后一刻执行可能):

(function () 
  window.heavy = window.heavy || ;
  var heavyContainers = document.querySelectorAll(".heavy-container");
  var attemptInitHeavyElements = function () 
    var heavyContainersToLoad = [];
    heavyContainers.forEach(function (container) 
      if (
        window.heavy[container.id] &&
        container.getBoundingClientRect().top - container.dataset.offset <
          window.innerHeight
      ) 
        heavyContainersToLoad.push(container);
      
    );
    if (heavyContainersToLoad.length) 
      heavyContainersToLoad.forEach(function (container) 
        container.innerHTML = window.heavy[container.id];
        container.onload && container.onload();
        delete window.heavy[container.id];
        container.classList.add("heavy-container--loaded");
      );
    
  
  document.addEventListener("scroll", attemptInitHeavyElements);
  attemptInitHeavyElements();
)();

是的,此解决方案不适用于部分,但它应该适用于您可以封装在短代码中的任何内容。它不是很漂亮并且会干扰其他延迟加载插件,但它很实用,甚至可以与 W3Cache 一起使用。

这肯定不适用于任何内容,您必须制定所需的步骤并将它们放入短代码的onload 事件中,但我希望它对任何人都有帮助。

【讨论】:

以上是关于使用 javascript 延迟加载 Elementor 部分的主要内容,如果未能解决你的问题,请参考以下文章

使用纯 JavaScript 的基本无限滚动/延迟加载博客文章

简单的JavaScript图像延迟加载库Echo.js

setTimeout延迟加载javascript

延迟加载和解析 PrimeFaces JavaScript 文件

延迟加载Javascript/CSS工具:LazyLoad

javascript 延迟加载外部JavaScript文件