zoukankan      html  css  js  c++  java
  • Vue监听子组件滚动条是否滑动底部

    需求说明:
    用户勾选协议,然后我们弹窗显示协议内容,

    前面是检测 滚动条这里一直出错,今天试了一下,已经出来了
    所以把代码贴出来

    在这里,我们使用element ui 的dialog 在加载内容的里面内容, 这里的内容我封装成了组件
    所以涉及到了父子组件

    方法:

    这个监听事件,只能放在子组件,然后在提交方法到父组件,父组件控制按钮禁用以及启用

    所有说话不贴代码的,都是耍流氓,特别是贴代码贴一半的

    <template>
      <div class="agreement">
        <ul class="agreement-ul">
          <li>请您仔细阅读以下风险提示:</li>
    
          <li>
            (1)本网站产品不属于生活消费品,不适用《中华人民共和国消费者权益保护法》、《网络购买商品七日无理由退货暂行办法》等规定。
          </li>
    
          <li>
            (2)本网站产品不同于生活消费类电子产品,而是根据客户需求特殊定制的产品。
          </li>
          <li>
            (3)除非本协议条款中有明确相反约定,您付款后均不能退款、退货、换货。
          </li>
        </ul> 
      </div>
    </template>
    
    

    css

    
    <style scoped>
    .agreement {
      height: 650px;
      overflow: auto;
    }
    .agreement-ul {
      text-decoration: underline;
      color: #000000;
      font-weight: bold;
    }
    .definition {
      font-weight: bold;
      color: #000000;
    }
    .agreement-ul2 {
      line-height: 30px;
    }
    </style>
    

    js

    <script>
    export default {
      methods: {
        handleScroll() {
          let scrollTop = document.querySelector(".agreement").scrollTop;
          console.log(scrollTop, "移动距离");
          //
          //变量windowHeight是可视区的高度
          var windowHeight =
            document.querySelector(".agreement").clientHeight;
          console.log(windowHeight, "windowHeight移动距离");
         
         //变量scrollHeight是滚动条的总高度
          var scrollHeight =
            document.querySelector(".agreement").scrollHeight;
          console.log(scrollHeight, "scrollHeight移动距离");
         
         if (scrollTop + windowHeight == scrollHeight) {
         this.$emit("closeagreementdialog"); // 重点是 这句,  触发父方法,然后更改按钮状态
       //三个距离加起来等于了,表示滑动到最底部
           console.log(
              "距顶部" +
                scrollTop +
                "可视区高度" +
                windowHeight +
                "滚动条总高度" +
                scrollHeight
            );
          }
        },
      },
      mounted() {
        document
          .querySelector(".agreement")
          .addEventListener("scroll", this.handleScroll);
      },
    };
    </script>
    
    

    上面这部分,就是 子组件的整个页面代码

    下面是父组件 代码

              <el-checkbox v-model="checked" @change="Agreement"
                >协议条款</el-checkbox>
    
    
        <!-- 协议条款 -->
          <el-dialog
          v-loading="loading"
          width="60%"
          :top="'5vh'"
          :close-on-click-modal="false"
          :close-on-press-escape="false"
          :visible.sync="Agreementdialog"
          :destroy-on-close="true"
          :before-close="closeagreement"
          @open="openagereement(12)"
        >
          <span slot="title" class="dialog-title">
            协议条款 <span v-if="Agreementread != 0"> {{ Agreementread }} 秒 </span>
          </span>
          <agreement-tontent
            ref="achiness"
            @closeagreementdialog="closeagreementdialog"
          />
    
          <span slot="footer" class="dialog-footer">
            <el-button @click="closeagreement">取 消</el-button>
            <el-button type="primary" :disabled="butdisabled" @click="agree"
              >确 定</el-button
            >
          </span>
        </el-dialog>
    

    js

    
    export default {
      data() {
        return { 
          checked: false, // 协议条款 是否同意,默认不同意
          Agreementdialog: false,  //协议弹窗
          Agreementread: 12, //秒
          Agreementdialogtime: {}, // 定时器
          butdisabled: true, //按钮是否禁用?
              
    };
      },
      methods: {
        //协议条款
        //协议条款
        Agreement() {
          this.Agreementdialog = true;
        },
        openagereement(value) {
          // 重新打开dialog  协议弹窗
          this.Agreementread = value;
          this.butdisabled = true;
          this.Agreementdialogtime = window.setInterval(() => {
            this.Agreementread--;
            if (this.Agreementread == 0) {
              //当倒计时小于0时清除定时器
              window.clearInterval(this.Agreementdialogtime);
            }
          }, 1000);
        },
        //用户没有等待时间结束就关闭了dialog,清空 定时器
        closeagreement() {
          //
          console.log("非正常同意协议");
          window.clearInterval(this.Agreementdialogtime);
          this.checked = false;
          this.butdisabled=true;
          this.Agreementdialog = false;
        },
        //关闭协议弹窗
        closeagreementdialog() {
          let ageretimes = null;
          //用户阅读完协议, 确认按钮可以点击,并且选择 复选框, 提交订单按钮也可以点击
          if (ageretimes) {
            //不为空,表示已经创建了定时器
            return;
          }
          ageretimes = window.setInterval(() => {
            console.log("定时器触发");
            if (this.Agreementread == 0) {
              console.log("定时器进入");
              this.butdisabled = false;
              //当倒计时小于0时清除定时器
              window.clearInterval(ageretimes);
              console.log("关闭定时器");
            }
          }, 1000);
          console.log("已关闭定时器");
        },
        //用户点击同意协议
        agree() { 
          this.Agreementdialog = false;
          this.butdisabled = false;
          this.checked = true;
        },
      },
    
      components: {
        AgreementTontent,
      },
      mounted: function () {
      },
    };
    
    

    截图:


    假如我们 ,点击取消,以及关闭 右上方的 X

  • 相关阅读:
    git 工作流程
    微信小程序 scroll-view 水平滚动使用
    微信小程序 tree组件
    微信小程序各类生命周期
    JS/Jquey 图片链接点击直接下载
    JS/Jquery 表单方式提交总结
    Nodejs 发送邮件 激活邮箱
    搭建Nodejs环境 创建Express应用
    break、continue、return区别
    shell(一)
  • 原文地址:https://www.cnblogs.com/whatarey/p/14562504.html
Copyright © 2011-2022 走看看