【问题标题】:Refresh part of page when user navigated back to it当用户导航回页面时刷新页面的一部分
【发布时间】:2021-08-31 03:25:50
【问题描述】:

在我的商店页面中,对于每个产品,我都有用户可以更改的购物车数量,而无需添加到购物车按钮(它没有显示并由 js 激活)。 我的问题是,如果用户更改单个产品页面中的项目数量并导航回商店页面,它会显示缓存中的错误数量。 现在我正在使用此代码重新加载整个页面:

jQuery( document ).ready(function( $ ) {
  $(document).ready(function () {
    if(performance.navigation.type == 2  || performance.navigation.type == 0){
      var isquanpage = document.getElementsByClassName('store-quantity');
        if (isquanpage.length > 0) {
          console.log(isquanpage);
          $("#a2cloader").show();
          location.reload(true);
          document.addEventListener('DOMContentLoaded', function() {
             $("#a2cloader").hide();
          }, false);
        }
    }
  });
});

我只想刷新数量而不是整个页面:

<div class="quantity-div" >

                  <i class="fas fa-plus sumsum-quantity-b" value="+" onclick="store_quantity_b('+', this.parentNode.querySelector('input[type=number]').id);"></i>

                <input class="sumsum-quantity store-quantity" form="<?php echo $product->id; ?>" inputmode="decimal" style="padding:0;border-radius:5px;" type="number" min="0" value="<?php echo $cartquan ?>"
                    name="<?php echo $varid; ?>" onclick="this.select()"  id="quantity-<?php echo $varid ?>" data-cartquan="<?php echo $cartquan ?>" data-varititle="<?php echo get_the_title( $attribute_value['variation_id']); ?>">

                  <i class="fas fa-minus sumsum-quantity-b" value="-" onclick="store_quantity_b('-', this.parentNode.querySelector('input[type=number]').id);"></i>

              </div>

而我试图做的是:

quanfield = document.getElementsByClassName("store-quantity");
      
      cartquantities =<?php echo json_encode(WC()->cart->get_cart_item_quantities();); ?>;
      console.log(cartquantities);

但它获取的是购物车的缓存版本,而不是更新后的版本。

【问题讨论】:

    标签: javascript php jquery caching navigation


    【解决方案1】:

    好的,我找到了解决方案,我在 woocommerce 上使用钩子添加到购物车片段,如下所示:

        // cart quantities
    add_filter( 'woocommerce_add_to_cart_fragments', woocommerce_cartquant_fragment' );
    
    function woocommerce_cartquant_fragment( $fragments ) {
        global $woocommerce;
    
        ob_start();
        ?>
        <p id="cartquantities" style="display:none"><?php echo json_encode(WC()->cart->get_cart_item_quantities()); ?></p>
        <?php
        $fragments['p#cartquantities'] = ob_get_clean();
        return $fragments;
    }
    

    然后使用这个脚本:

        //refresh page from history
    jQuery( document ).ready(function( $ ) {
      $(document).ready(function () {
        if(performance.navigation.type == 2  || performance.navigation.type == 0){
          let quanfield, quanname,cartquantities,store,obj;
          let findname =[];
          $("#a2cloader").show();
          timeout = setTimeout(function() {
          cartquantities = document.getElementById("cartquantities").innerText;
          cartquantities = cartquantities.replace("{","");
          cartquantities = cartquantities.replace("}","");
          cartquantities = cartquantities.replace(/['"]+/g, '');
    
          cartquantities = cartquantities.split(",");
          for (i = 0; i < cartquantities.length; i++) {
            cartquantities[i] = cartquantities[i].split(":");
            findname[i] = cartquantities[i][0];
          }
          //console.log(findname);
          quanfield = document.getElementsByClassName("store-quantity");
          //console.log(quanfield.length);
          for (i = 0; i < quanfield.length; i++) {
            quanname = quanfield[i].name;
            obj = findname.findIndex(o => o==quanname);
            //console.log(obj);
            if (obj !=-1){
              quanfield[i].value=cartquantities[obj][1];
              quanfield[i].setAttribute("data-cartquan", cartquantities[obj][1]);
            }else{
              quanfield[i].value=0;
              quanfield[i].setAttribute("data-cartquan", 0);
            }
             $("#a2cloader").hide();
          }
      }, 1500 );
      }
      });
    });
    

    是否有可能让 javascript 等待片段而不是设置超时?

    【讨论】:

      【解决方案2】:

      解决了!使用时间间隔检查片段何时更新

      <script>
      //refresh page from history
      jQuery( document ).ready(function( $ ) {
        $(document).ready(function () {
          if(performance.navigation.type == 2  || performance.navigation.type == 0){
            let quanfield, quanname,cartquantities,store,obj,timer;
            let findname =[];
            $("#a2cloader").show();
            //var t=0;
            timer = setInterval(checkfrags, 5);
            function checkfrags(){
            //t+=5;
             if(document.getElementById("cartquantities").innerText=="null") {
               //console.log(t);
             }else{
               cartquantities = document.getElementById("cartquantities").innerText;
               cartquantities = cartquantities.replace("{","");
               cartquantities = cartquantities.replace("}","");
               cartquantities = cartquantities.replace(/['"]+/g, '');
      
               cartquantities = cartquantities.split(",");
               for (i = 0; i < cartquantities.length; i++) {
                 cartquantities[i] = cartquantities[i].split(":");
                 findname[i] = cartquantities[i][0];
               }
               //console.log(findname);
               quanfield = document.getElementsByClassName("store-quantity");
               //console.log(quanfield.length);
               for (i = 0; i < quanfield.length; i++) {
                 quanname = quanfield[i].name;
                 obj = findname.findIndex(o => o==quanname);
                 //console.log(obj);
                 if (obj !=-1){
                   quanfield[i].value=cartquantities[obj][1];
                   quanfield[i].setAttribute("data-cartquan", cartquantities[obj][1]);
                 }else{
                   quanfield[i].value=0;
                   quanfield[i].setAttribute("data-cartquan", 0);
                 }
                  $("#a2cloader").hide();
               }
               //console.log(document.getElementById("cartquantities").innerText+"done "+t);
               document.getElementById("cartquantities").innerText="null";
               clearInterval(timer);
             }
           }
          }
        });
      });
      </script>
      
      <p id="cartquantities" style="display:none">null</p>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多