【问题标题】:Variable shows in one function but no another Jquery变量显示在一个函数中,但没有另一个 Jquery
【发布时间】:2020-08-31 11:16:56
【问题描述】:

我将 PHP 会话传递给要在 Jquery 代码中使用的变量。下面,我在四个区域调用控制台日志。控制台日志编号 1 和 3 反映的变量值没有问题。 2和4没有。我需要 #4 具有价值,以便我可以在条件中使用变量。我想这可能是范围问题,但我不明白为什么。寻求一些指导。

<script type="text/javascript">

  // GET VARIABLES THROUGH PHP SESSSION
  customerType = '<?php echo $customerType; ?>';
  myClicks = '<?php echo $myClicks; ?>';
  email = '<?php echo $email; ?>';

  console.log('1 ' + email);
  console.log('1 ' + myClicks);
  console.log('1 ' + customerType);

  //SET NUMBER OF ROWS TO DISPLAY AT A TIME

  $(document).ready(function () {

    rowsPerPage = 5;

    // GETTING DATA FROM FUNCTION BELOW
    getData();

    $('#load-more').click(function () {

      console.log('2 ' + email);
      console.log('2 ' + myClicks);
      console.log('2 ' + customerType);

      $('#load-more').html('Loading...');
      var rowID = Number($('#row-id').val());
      var allCount = Number($('#count').val());
      rowID += rowsPerPage;
      if (rowID <= allCount) {
        $('#row-id').val(rowID);
        getData();
      } else {
        $('#load-more').html('End Of Data');
        //$('#load-more').html('');
      }
    });

    /* REQUEST DATA */
    function getData () {

      console.log('3 ' + email);
      console.log('3 ' + myClicks);
      console.log('3 ' + customerType);

      var rowID = $('#row-id').val();
      var allCount = $('#count').val();
      $.ajax({
        url: 'promotions/newest-load-button-data.php',
        type: 'post',
        data: {
          rowID: rowID,
          rowsPerPage: rowsPerPage
        },
        dataType: 'json',
        success: function (response) {
          setTimeout(function () {
            loadData(response);
            $('#load-more').html('Load More');
          }, 1000);
        }
      });
    }

    /* LOAD DATA TO PAGE */

    function loadData (data) {

      console.log('4 ' + email);
      console.log('4 ' + myClicks);
      console.log('4 ' + customerType);

      var dataCount = data.length;

      for (var i = 0; i < dataCount; i++) {
        if (i == 0) {
          var allCount = data[i]['allcount'];
          $('#count').val(allCount);
        } else {
          var promoID = data[i]['promoid'];
          var promoName = data[i]['promoname'];
          var promoRefNum = data[i]['promorefnum'];
          var promoType = data[i]['promotype'];
          var theBanner = data[i]['thebanner'];

// Here I will use conditions based on email, customerType, and myClicks

          if (promoType == 'Banner') {
            $('#load-container').append('<div class="row-center-center padding-top-5 padding-bottom-2"><div>' + promoName + '</div></div>');
            $('#load-container').append('<div><div class="wrap-content"><img class="mobile-banner-scale" id="visitor-banner-click" src=' + theBanner + '></div></div>');
          }

          if (promoType == 'Video Banner') {
            $('#load-container').append('<div class="row-center-center padding-top-5 padding-bottom-2"><div>' + promoName + '</div></div>');
            $('#load-container').append('<div><video class="mobile-video-size" id="visitor-banner-click" src=' + theBanner + ' autoplay muted loop></video></div>');
          }
        }

        $('#load-more').html('Load More');
      }
    }
  });
</script>

【问题讨论】:

  • 没有 HTML 数据很难说。您在点击事件上有 2 个,但我们没有。我会通过 sn-p 放置一个最小的工作示例供我们诊断。 :)
  • 可能是范围问题。尝试将function loadData() 移动到全局范围(与customerType 相同的范围)。命名函数会被提升,匿名函数不会。
  • 绝对范围。

标签: javascript jquery scope


【解决方案1】:

从 jQuery 3.0 开始,添加就绪处理程序的推荐方法是 第一种方法,$(fn)。如事件部分所述, $(document).on("ready", fn) 事件形式略有不同 语义并在 jQuery 3.0 中被删除。

此代码 sn-p 使用推荐的文档就绪处理程序工作。

    
        jQuery(function(){  //document.ready

            console.log('2 ' + email);
            console.log('2 ' + myClicks);
            console.log('2 ' + customerType);
            loadData('something');
        });

        customerType = 'test1';
        myClicks = 'test2';
        email = 'test3';

        function loadData (data) {
    
            console.log('4 ' + email);
            console.log('4 ' + myClicks);
            console.log('4 ' + customerType);
       }

    
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 我只是通常将它用于我的 jQuery 代码。它主要防止与 $ 的冲突错误。而且,它不会创建一个允许访问他试图访问的变量的闭包吗?我不知道,我只知道它在我测试时有效,哈哈
  • 我问的更多,因为准备好的文档本质上是 IIFE 的一个更独特的版本,jQuery(function($){}) 的使用将提供范围缩小,并确保 jQuery = $ 由于它被传入。
  • 你是对的,从 jquery 3.0 开始我没有意识到,唯一推荐的方法是使用 jQuery(fn),我会相应地更新我的答案,谢谢!
  • Err,我不希望你把它当作我说你的方法是错误的,或者我的建议是唯一推荐的方法。我只是想指出 IIFE 的功能与文档就绪功能的比较,以及它们的功能在哪些方面有共同之处。我绝对不是说你错了。
  • 它可以在没有外部 IIFE 的情况下使用您建议的准备好的处理程序。
【解决方案2】:

这绝对是范围问题。我发现如果我在全局中调用该函数,我可以获得我需要的响应。但是出现了数据长度错误。我决定在 php 数据页面上调用会话的值,并将其包含在 JSON 数组中,以通过 ajax 以及加载中所需的其他变量。所以它现在可以工作了,不同的方式。我很欣赏大家的看法。

【讨论】:

    【解决方案3】:
    // GET VARIABLES THROUGH PHP SESSSION
    customerType = "where are customers";
    myClicks = "element clicked";
    email = "email sent";
    
    console.log('1 ' + email);
    console.log('1 ' + myClicks);
    console.log('1 ' + customerType);
    
    //SET NUMBER OF ROWS TO DISPLAY AT A TIME
    
    $(document).ready(function() {
    
        rowsPerPage = 5;
    
        // GETTING DATA FROM FUNCTION BELOW
        getData();
    
        $("#load-more").click(function() {
    
            console.log('2 ' + email);
            console.log('2 ' + myClicks);
            console.log('2 ' + customerType);
    
            $('#load-more').html('Loading...');
            var rowID = Number($("#row-id").val());
            var allCount = Number($("#count").val());
            rowID += rowsPerPage;
            if (rowID <= allCount) {
                $("#row-id").val(rowID);
                getData();
            } else {
                $('#load-more').html('End Of Data');
                //$('#load-more').html('');
            }
        });
    
        /* REQUEST DATA */
        function getData() {
            console.log('3 ' + email);
            console.log('3 ' + myClicks);
            console.log('3 ' + customerType);
    
            loadData();
        }
    
        /* LOAD DATA TO PAGE */
    
        function loadData(data) {
            console.log('4 ' + email);
            console.log('4 ' + myClicks);
            console.log('4 ' + customerType);
        }
    });
    

    一切似乎都很好,您的变量 email,myClicks,customerType 正在控制台中打印值,您需要再次检查,我认为问题是其他问题,请再次检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-22
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2021-01-08
      相关资源
      最近更新 更多