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

弹窗内容由后端返回,如何让点击按钮的事件交由前端控制?

一、场景

  • 背景:因为系统里经常有新活动或者公告需要通知所有用户,希望前端维护的这个弹窗里的内容可以由后端接口返回。这样就不需要每次上新活动的时候,前端项目都发版了。因此,前端维护了这个弹窗和它的关闭事件,至于弹窗里展示什么内容,则由接口返回。
  • 问题:后端返回了展示的HTML里有一个按钮,希望点击这个按钮时可以关闭弹窗。如下图的交叉按钮:活动弹窗的示意图

二、解决方案

  • 考虑到需求的历史背景,以及后续的可维护性。决定在后端返回的HTML里,给期望关闭弹窗的按钮添加上ID。
  • 而在前端项目里,弹窗加载完成并且接口已经返回数据后,我们可以通过ID获取到用于关闭弹窗的按钮元素,然后给这个按钮添加一个点击事件监听器。当用户点击该元素时,会触发关闭弹窗的函数。

三、代码演示

Step1. 前端项目里存放着弹窗,弹窗里的内容通过读取接口返回的 html 赋值给content,然后通过v-html 呈现。将关闭弹窗的函数写在此处,下面仅展示一些核心的实现代码(Vue3+Vuetify):

<template><v-dialogv-model="visible"><v-card ><div v-html="content"></div></v-card></v-dialog>
</template>
handleClose() {this.visible = false
}

Step2. 此时,接口返回一段JSON,用于页面呈现。里面可能包含了一个按钮用于关闭这个弹窗,我们需要给这个按钮添加上ID(下图里的id=\"close-btn\"),与后续的步骤关联。

{"content": "<div>\n <a type=\"button\">\n <span class=\"v-btn__content\" id=\"close-btn\">关闭</span>\n    </a>\n  </div>","startTime": "2023-12-01 00:00:00","endTime": "2024-2-29 00:00:00"
}

Step3. 在前端项目里,弹窗加载完成并且接口已经返回数据后,我们可以通过ID获取到用于关闭弹窗的按钮元素,然后给这个按钮添加一个点击事件监听器。当用户点击该元素时,会触发关闭弹窗的函数。

document.getElementById('close-btn')?.addEventListener('click', this.handleClose)

四、可能存在的坑点

需要等接口的数据返回并且生成了相关的元素以后才能对按钮添加事件监听。否则会监听不到这个元素。验证过程如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>验证节点未生成时添加事件监听是否有效</title><!-- 这个案例证明了给一个不存在的节点(通过指定ID的方式)添加事件监听是无效的,即使之后会往页面上生成同样id的元素 --><!-- 因此,一定要确保元素已经在页面上挂载了,才去添加事件监听 --></head><body><div id="parent"><buttonid="create">生成新按钮</button></div><script>/*** 创造一个新的元素**/function createNewNode() {const parentElem = document.getElementById('parent')const newElem = document.createElement('button')newElem.textContent = '新按钮'newElem.setAttribute('id', 'new')parentElem?.insertBefore(newElem, document.getElementById('create'))document.getElementById('new')?.addEventListener('click', function () {newNodeOnClick('按钮生成后')})}/*** 新元素被点击时触发* @param timing 点击的时机**/function newNodeOnClick(timing) {console.log('newNodeOnClick', timing)}document.addEventListener('DOMContentLoaded', function (e) {document.getElementById('create')?.addEventListener('click', createNewNode)document.getElementById('new')?.addEventListener('click', function () {newNodeOnClick('页面加载完毕后')})})</script></body>
</html>

相关文章:

  • 基于SSM的校园订餐系统(有报告)。Javaee项目。ssm项目。
  • 配置与管理Samba服务器
  • 后端程序员入门react笔记——react的diff算法(三)
  • Python异常处理知识点汇总,五分钟就能学会
  • Spring boot 实现监听 Redis key 失效事件
  • 从新手到专家:AutoCAD 完全指南
  • Bicycles(变形dijkstra,动态规划思想)
  • 【大厂AI课学习笔记NO.53】2.3深度学习开发任务实例(6)数据采集
  • Git+py+ipynb Usage
  • 消息中间件篇之RabbitMQ-高可用机制
  • Unity(第五部)新手图层和标签的理解
  • http 状态码
  • 贪心算法练习day2
  • C++基础知识(六:继承)
  • Unity(第八部)Vector3的三维向量和旋转(坐标和缩放也简单讲了一下)
  • [deviceone开发]-do_Webview的基本示例
  • 《深入 React 技术栈》
  • 【391天】每日项目总结系列128(2018.03.03)
  • JS专题之继承
  • Node项目之评分系统(二)- 数据库设计
  • php中curl和soap方式请求服务超时问题
  • SAP云平台里Global Account和Sub Account的关系
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 闭包--闭包作用之保存(一)
  • 初识 webpack
  • 初识MongoDB分片
  • 浮现式设计
  • 模型微调
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 怎么将电脑中的声音录制成WAV格式
  • postgresql行列转换函数
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • ( 10 )MySQL中的外键
  • (4)事件处理——(7)简单事件(Simple events)
  • (7)STL算法之交换赋值
  • (C语言)球球大作战
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (初研) Sentence-embedding fine-tune notebook
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十一)手动添加用户和文件的特殊权限
  • (算法二)滑动窗口
  • (已解决)什么是vue导航守卫
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转载)虚函数剖析
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net2005怎么读string形的xml,不是xml文件。
  • .net6Api后台+uniapp导出Excel
  • .NET6实现破解Modbus poll点表配置文件
  • .NET序列化 serializable,反序列化