当前位置: 首页 > news >正文

vue3 用el-dialog实现用户协议,内容是富文本, 滚动到最后才允许关闭

vue3 用el-dialog实现用户协议,内容是富文本, 滚动到最后才允许关闭

<template><div><el-dialogv-model="dialogVisible"title="用户协议":close-on-click-modal="false":close-on-press-escape="false":show-close="false"width="50%"destroy-on-close><div class="ql-container ql-snow"><div ref="contentRef" class="notice-content ql-editor" v-html="protocolHtml" @scroll="handleScroll"></div></div><template #footer><div class="dialog-footer"><el-button size="default" @click="handleClose">关闭</el-button><el-button type="primary" @click="handleAgree" :disabled="!canClose"> 我已阅读并同意 </el-button></div></template></el-dialog></div>
</template><script setup>import { ref, nextTick, defineProps, defineEmits } from "vue";import { ElMessage, ElMessageBox } from "element-plus";const emits = defineEmits(["close"]);const props = defineProps({isShow: {type: Boolean,default: false}});const dialogVisible = ref(false);const protocolHtml = ref(`<h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1><h1>这是用户协议内容,您需要滚动到底部才能关闭本弹窗</h1>`);watch(() => props.isShow,(newVal, oldVal) => {dialogVisible.value = newVal;if (newVal) {canClose.value = false;nextTick(() => {const el = contentRef.value;if (el) {el.scrollTop = 0;el.addEventListener("scroll", handleScroll);}});}},{immediate: true,deep: true});const contentRef = ref(null);const canClose = ref(false);const handleScroll = () => {const el = contentRef.value;if (!el) return;const isBottom = Math.abs(el.scrollHeight - el.scrollTop - el.clientHeight) < 10;canClose.value = isBottom;};const handleClose = () => {if (canClose.value) {emits("close", false);} else {ElMessage.warning("请先阅读完用户协议");}};// 同意协议const handleAgree = () => {if (canClose.value) {ElMessage.success("您已同意用户协议");emits("agreeClose", false);}};// 清理滚动事件onBeforeUnmount(() => {const el = contentRef.value;if (el) {el.removeEventListener("scroll", handleScroll);}});
</script><style scoped>.notice-content {height: 400px;overflow-y: auto;border: 1px solid #eee;padding: 15px;border-radius: 4px;background-color: #f9f9f9;font-size: 14px;line-height: 1.6;white-space: pre-wrap;word-break: break-all;}.dialog-footer {text-align: right;}::v-deep .ql-container.ql-snow {border: none;}
</style>
http://www.dtcms.com/a/399032.html

相关文章:

  • 考研408《操作系统》复习笔记,第四章(1)《文件管理概念》
  • 如何整合 openSSL custom provider (以 TRNG 舉例)
  • 做电影网站一年赚多少钱wordpress 二级页面菜单 404
  • JAVA学习笔记——判断和循环的概念和一些习题
  • Java `synchronized` 关键字高频面试题(原理+场景+底层实现)
  • 微信企业号可以做微网站吗查看wordpress访问记录
  • 企业建站程序哪个好asp简单网站开发
  • 法术光环释义
  • todesk远程到被控Mac后不显示画面
  • 上网行为安全(2)
  • 网站颜色搭配技巧网站建设征税标准
  • 虚拟主机建网站网站建设技术主管
  • Transformer原理学习(4)注意力机制
  • Linux epoll 事件机制深度解析
  • 仿制网站软件王烨名字含义
  • 网站建设教程 乐视网冠辰网站建设
  • 网站建设方案说明微信里的小程序怎么删除
  • vue <img 图片标签 图片引入
  • 防伪网站怎么做为什么打开网址都是seo综合查询
  • 做极速赛车网站怎么做网站视频
  • DP4363远程无钥匙进入(PKE)技术:便利与安全的完美融合
  • 手机网站页面长沙网页设计培训班哪家好
  • 用 Codebuddy Code CLI 快速开发中小学数学测试系统
  • 开源 java android app 开发(十四)绘图定义控件--波形显示器
  • seo网站设计费用网站过期会怎样解决
  • 网站机房建设目的温州机械网站建设
  • WLB公司内推|招联金融2026届校招|18薪
  • 平安产险深圳分公司在深圳莲花山公园 参与2025年金融教育宣传周启动仪式活动
  • 从root用户切换到某个普通用户突然报错“su: failed to execute /bin/bash: 资源暂时不可用”
  • 沧州网站建设制作设计优化浏览器提醒 WordPress