编程回忆录 - 大杂烩-2 (JS + ajax前后端交互) 下篇

230 阅读1分钟

PC电商购物车结算页面

    <script>
      $(function() {
      // 全选功能:让复选项的状态和全选按钮保持一致:
      // 1:让子按钮的选中状态和全选按钮状态保持一样:全选按钮绑定change事件,j-checkbox 中的checkall的固有属性checked,就是自己的选中状态
      // 2:判断自己的固有属性选中状态,(默认是true),就让cart-item添加类样式check-cart-item被选中
      // 反之cartitem移除类样式,取消高亮效果
      $('.checkall').change(function() {
          $('.j-checkbox, .checkall').prop("checked", $(this).prop('checked'))
          if ($(this).prop('checked')) {
            $('.cart-item').addClass('check-cart-item')
          } else {
            $('.cart-item').removeClass('check-cart-item')
          }
        })

      // 复选功能:复选全被勾选,全选按钮也会被勾选,并让商品的背景用高亮
      // 3:复选框的chang事件,如果复选框的选中状态的长度===复选框的个数,就让全选的选中固有属性选中,反之不选中
      // 4:如果自己的固有选中状态被选中,就让自己父元素中的cart-item添加check-cart-item高亮起来,反之不高亮
      $('.j-checkbox').change(function() {
        if ($('.j-checkbox:checked').length === $('.j-checkbox').length) {
          $('.checkall').prop('checked', true) 
        } else {
          $('.checkall').prop('checked', false) 
        }
        if($(this).prop('checked')) {
          $(this).parents('.cart-item').addClass('check-cart-item')
        } else {
          $(this).parents('.cart-item').removeClass('check-cart-item')
        }
      })

      // +添加商品:修改输入框中的数值和p-sum中的价格
      // increment减号点击事件,获取到自己兄弟元素.itxt的val值,赋值给n,让n++,再将n设置到itxt的val中
      // 获取到自己父元素p-sum的兄弟元素pprice的html,赋值给p,对p进行substr截取掉¥,用(p*n)使用toFxied保留2位小数,
      // 再将自己的¥+price拼接到自己父元素的兄弟元素p-sum去展示。调用getsum求和
      $('.increment').click(function() {
        var n = $(this).siblings('.itxt').val()
        n++
        $(this).siblings('.itxt').val(n)
        var p = $(this).parents('.p-num').siblings('.p-price').html()
        p = p.substr(1)
        var price =  (p * n).toFixed(2)
        $(this).parents('.p-num').siblings('.p-sum').html('¥' + price)
        getSum()
      })

      // - 减号事件:修改输入框和商品的价格:
      // .decrement 减号点击事件,获取到自己兄弟元素输入框的值,赋值给n,如果n==1表示不能在减了,就return false阻止点击事件。
      // n--每次点击自减,将n的结果展示到输入框中,
      // 创建p,获取到自己父元素p-sum的兄弟p-price的html内容,先截取掉¥,然后再展示回去,用¥+(p*n).toFixed拼接的方式展示到价格中,最后调用getsum求和
      $('.decrement').click(function() {
        var n  = $(this).siblings('.itxt').val()
        if (n == 1) {
          return false
        }
        n--
        $(this).siblings('.itxt').val(n)
        var p = $(this).parents('.p-num').siblings('.p-price').html()
        p = p.substr(1)
        $(this).parents('.p-num').siblings('.p-sum').html('¥' + (p * n).toFixed(2))
        getSum()
      })

      // 输入框修改数值,商品价格跟随改变
      // .itxt的change事件,获取到自己的值赋值给n,再获取到自己父元素p-num的兄弟p-price的内容
      // 截取掉¥,将拼接后的结果保留2位小数,展示到自己父元素p-num的兄弟元素psum的html中,最后调用getSum函数求和
      $('.itxt').change(function() {
        var n = $(this).val()
        var p = $(this).parents('.p-num').siblings('.p-price').html()
        p = p.substr(1)
        $(this).parents('.p-num').siblings('.p-sum').html('¥' + (p * n).toFixed(2))
        getSum()
      })
      
      // 封装求和,each遍历方式去拿输入框的数量和商品的总价格
      // 封装getSum函数,新建count为0,和money为0,
      // 对itxt使用each进行遍历,参数1 i是下标, ele是输入框自己,count+= 就是元素自己的值,并parseInt取整
      // 将count数量展示到.amount-sum的 em元素中展示
      // 使用each对p-sum遍历,让moeny+=保留小数并截取第一位数,赋值给money。将money保留2位小数展示到em中
      getSum()

      function getSum() {
        var count = 0
        var money = 0
        $('.itxt').each(function(i, ele) {
          count += parseInt($(ele).val())
         
        })
	 $('.amount-sum em').text(count)
        $('.p-sum').each(function(i, ele) {
          money += parseFloat($(ele).text().substr(1))
          
        })
	$('.price-sum em').text('¥'+ money.toFixed(2))
      }

      // 删除商品:点击p-action 中的a,让自己的父元素cart-item自杀掉,调用getSum
      $('.p-action a').click(function() {
        $(this).parents('.cart-item').remove()
        getSum()
      })
      // 删除多件商品:点击renove-batch让复选框状态被选中的父元素cart-item自杀掉,调用getSum
      $('.remove-batch').click(function() {
        $('.j-checkbox:checked').parents('.cart-item').remove()
        getSum()
      })
      // 清空购物车:点击clear-all清空按钮,让所有的cart-item自杀掉,调用getSum
      $('.clear-all').click(function() {
        $('.cart-item').remove()
        getSum()
      })
      })
    </script>

商品电梯导航

 $(function () {
        // 创建节流阀,创建toolTop接收recommend的距离页面的顶部的距离,调用toggelTool函数
        var flag = true;
        var toolTop = $('.recommend').offset().top;
        toggleTool();

        // 封装函数,显示与隐藏电梯:
        // 封装toggleTool函数,判断页面scrollTop>=toolTop超出了就淡入fixedtool电梯,反之隐藏
        function toggleTool() {
          if ($(document).scrollTop() >= toolTop) {
            $('.fixedtool').fadeIn();
          } else {
            $('.fixedtool').fadeOut();
          }
        }

        // 监听页面滚动事件,根据商品区域显示对应的楼层:
        // 监听window.scroll事件,调用toggleTool函数,判断节流阀开启,each变量.floor 中的.w, 如果页面滚动出去的高度超出了每一层的ofset().top,就让fixedtool中的li,根据i添加current样式,兄弟元素移除样式
        $(window).scroll(function () {
          toggleTool();
          if (flag) {
            $('.floor .w').each(function (i, ele) {
              if ($(document).scrollTop() >= $(ele).offset().top) {
                $('.fixedtool li')
                  .eq(i)
                  .addClass('current')
                  .siblings()
                  .removeClass();
              }
            });
          }
        });

        // 点击电梯楼层,滚动到对应的商品页面区域:
        // .fixedtool li点击事件,关闭节流阀,创建current接收到floor .w根据自己的index获取到offset().top,获取到商品区域的当前位置
        // body,html调用animate函数,让scrollTop:current,让页面滚动到当前页面的位置,回调函数中关闭节流阀,
        // 并将自己添加高亮样式,移除兄弟的类样式
        $('.fixedtool li').click(function () {
          flag = false;
          var current = $('.floor .w').eq($(this).index()).offset().top;
          $('body, html')
            .stop()
            .animate(
              {
                scrollTop: current,
              },
              function () {
                flag = false;
              }
            );
          $(this).addClass('current').siblings().removeClass();
        });
      });

留言框案例

  <body>
    <div class="box" id="weibo">
      <span>微博发布</span>
      <textarea name="" class="txt" cols="30" rows="10"></textarea>
      <button class="btn">发布</button>
      <ul></ul>
    </div>

    <script>
      $(function () {
        // 按钮点击事件,动态创建li元素,设置li的hrml内容,就是输入框的内容+a标签,将li添加到ul中,slideDown下拉展示,并清空留言框中的内容
        $('.btn').click(function () {
          console.log(1);
          var li = $('<li></li>');
          li.html($('.txt').val() + '<a href="javascript:;">删除</a>');
          $('ul').prepend(li);
          li.slideDown();
          $('.txt').val('');
        });
        // 在ul中给a绑定点击事件,获取到自己父元素先,使用slideUp中开启函数,让自己自杀掉
        $('ul').on('click', 'a', function () {
          $(this)
            .parents('ul')
            .slideUp(function () {
              $(this).remove();
            });
        });
      });
    </script>
  </body>

todolist案例

  <body>
    <header>
      <section>
        <label for="title">ToDoList</label>
        <input
          type="text"
          id="title"
          name="title"
          placeholder="添加ToDo"
          required="required"
          autocomplete="off"
        />
      </section>
    </header>
    <section>
      <h2>正在进行 <span id="todocount"></span></h2>
      <ol id="todolist" class="demo-box"></ol>
      <h2>已经完成 <span id="donecount"></span></h2>
      <ul id="donelist"></ul>
    </section>
    <footer>Copyright &copy; 2014 todolist.cn</footer>

    <script
      type="text/javascript"
      src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"
    ></script>
    <script>
      $(function () {
        // 输入框事件,按下enter如果没有内容弹出提示,反之获取本地数据,向数组中插入一个对象,然后保存到本地中,在load更新页面。
        // 1:加载load函数
        // 2:监听#title的keydown事件,事件参数event,判断事e.keyCode键码如果相等于13,二层判断,如果自己输入的值等于空,弹出提示。反之调用getDate函数,将获取到的赋值给local
        // 3:local.push,向数组中插入一个对象,title就是自己输入框的值,done默认是false, 调用saveDate将这个对象存储,调用load函数更新页面,然后将自己输入框的内容清空

        $('#title').on('keydown', function (e) {
          if (e.keyCode === 13) {
            if ($(this).val() === '') {
              alert('请输入内容');
            } else {
              var local = getDate();
              local.push({ title: $(this).val(), done: false });
              saveDate(local);
              load();
              $(this).val('');
            }
          }
        });

        // 删除任务:通过getDate获取数据,通过attr获取到id,使用splice删除1个,在保存和刷新。
        // 4:给ol和ul中的a同时绑定点击事件,调用getDate获取本地数据赋值给date,获取到自己自定义属性id,赋值给id,data调用splice,根据index从数组中删除1项,调用saveDate函数保存数据, 调用load函数刷新页面
        $('ol, ul').on('click', 'a', function () {
          var date = getDate();
          var id = $(this).attr('id');
          date.splice(id, 1);
          saveDate(date);
          load();
        });

        // 点击input切换完成和未完成,获取数据,获取a标签的ID,让数组中的每一项根据id同步checked选中状态,完成数据保存,和load数据更新
        // 5:给ol和ul中的input绑定点击事件,先通过getDate获取数据赋值给date,获取到自己兄弟元素的自定义属性id,赋值给index。让data[index].done 接收自己的固有属性checked保持一致,saveDate保存数据,load刷新页面数据
        $('ol, ul').on('click', 'input', function () {
          var data = getDate();
          var id = $(this).siblings('a').attr('id');
          data[id].done = $(this).prop('checked');
          saveDate(data);
          load();
        });

        // 获取本地数据,保存本地数据,load渲染数据
        // 1:获取本地数据:
        // 通过localStorage.getItem获取到todolist数组,赋值给data,判断如果data不是null,就使用JSON.parse将数据转换为对象并return返回。反之就返回一个空数组。
        function getDate() {
          var data = localStorage.getItem('todolist');
          if (data !== null) {
            return JSON.parse(data);
          } else {
            return [];
          }
        }

        // 保存本地数据:赋值saveDate函数,形参是data,使用localStorage.setItem将名为todolist的数据保存,属性值用JSON.stringify转换为json字符串将data保存
        function saveDate(data) {
          localStorage.setItem('todolist', JSON.stringify(data));
        }

        // 封装load函数,首先通过getDate获取数据赋值给data,将ol和ul使用empty清空内容,创建2个新变量,todoCount和doneCount,初始值都是0.
        // 使用$.each对数据遍历,形参i表示第几个,n表示具体的元素。判断n.done属性是否已经完成,像ul中prepend添加新数据,将li标签中包含inpit和p+a标签,a标签有自己的id+i,让doneCount++
        // 反之就是让ol,使用prepend添加li+p的title,+a带上id。让todoCount++计算未完成的数量
        // 最后将#todoCount中的text文本赋值显示在页面中展示.
        function load() {
          var data = getDate();
          $('ol, ul').empty();
          var todoCount = 0;
          var doneCount = 0;
          $.each(data, function (i, ele) {
            if (ele.done) {
              $('ul').prepend(
                '<li><input type="checkbox" checked = "checked"><p>' +
                  ele.title +
                  '</p><a href="javascript:;" id=' +
                  i +
                  '></a></li>'
              );
              doneCount++;
            } else {
              $('ol').prepend(
                '<li><input type="checkbox"><p>' +
                  ele.title +
                  '</p><a href="javascript:;" id=' +
                  i +
                  '></a></li>'
              );
              todoCount++;
            }
          });
          $('#todoCount').text(todoCount);
          $('#doneCount').text(doneCount);
        }
      });
    </script>
  </body>