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

news2024/11/17 23:59:49

一、场景

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

二、解决方案

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

三、代码演示

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

<template>
  <v-dialog
    v-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">
      <button
        id="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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1476294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【kubernetes】关于云原生之k8s集群的pod理论详解

目录 一、pod的基础概念 什么是pod&#xff1f; k8s集群中pod的两种使用方式 pod中运行容器的原则&#xff1a; 创建pod的3种方式 第一种&#xff1a;自主式Pod 第二种&#xff1a;控制器管理的Pod 第三种&#xff1a;静态Pod 二、pod中容器的基础概念 pod容器的分类 …

阿里云4核16G服务器多少钱?幻兽帕鲁配置报价

2024阿里云幻兽帕鲁专用服务器价格表&#xff1a;4核16G幻兽帕鲁专用服务器26元一个月、149元半年&#xff0c;默认10M公网带宽&#xff0c;8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例&#xff0c;CPU采用Intel Xeon …

http模块-通过创建的服务器将本地文件转换成web资源

案例-通过创建的服务器将本地文件转换成web资源 目的&#xff1a;将本地文件转换成web资源思路&#xff1a;将文件实际存放的地址作为每个资源的请求url地址。大致流程&#xff1a; 浏览器–请求->自己写的web服务器–读文件->磁盘目录–读取完毕->自己写的web服务器…

JWT基于Cookie的会话保持,并解决CSRF问题的方案

使用JWT进行浏览器接口请求&#xff0c;在使用Cookie进行会话保持传递Token时&#xff0c;可能会存在 CSRF 漏洞问题&#xff0c;同时也要避免在产生XSS漏洞时泄漏Token问题&#xff0c;如下图在尽可能避免CSRF和保护Token方面设计了方案。 要点解释如下&#xff1a; 将JWT存入…

推荐一款桌面端redis连接工具, redis desktop manager替代品——another redis desktop manager

下载地址 Another Redis Desktop Manager | 更快、更好、更稳定的Redis桌面(GUI)管理客户端&#xff0c;兼容Windows、Mac、Linux&#xff0c;性能出众&#xff0c;轻松加载海量键值 封面对比 对比redis desktop manager &#xff0c;ui上有巨大的改进 但是redis desktop ma…

抖音视频评论批量下载软件|抖音数据抓取工具

随着业务需求的增长&#xff0c;抖音视频的下载需求也日益增加。传统的方式是通过逐个复制粘贴分享链接来下载视频&#xff0c;这种操作效率低下且耗时费力。为了解决这一问题&#xff0c;我们开发了一款基于C#的抖音视频评论批量下载软件&#xff0c;旨在实现通过关键词自动批…

网络爬虫的危害,如何有效的防止非法利用

近年来&#xff0c;不法分子利用“爬虫”软件收集公民隐私数据案件屡见不鲜。2023年8月23日&#xff0c;北京市高级人民法院召开北京法院侵犯公民个人信息犯罪案件审判情况新闻通报会&#xff0c;通报侵犯公民个人隐私信息案件审判情况&#xff0c;并发布典型案例。在这些典型案…

【物联网应用案例】智能农业应用案例

随着物联网 (IoT) 的广泛应用&#xff0c;各种互联设备已经深度融入我们的生活&#xff0c;涵盖了健康与健身、家庭自动化、物流运输以及智慧城市和工业物联网等多个领域。因此&#xff0c;将物联网、联网设备和自动化技术应用于农业&#xff0c;是十分符合时代发展需求的&…

vue3 开发记录

1.引入nprogress插件&#xff0c;显示未声明文件 无法找到模块“nprogress”的声明文件。 解决方法&#xff1a; vite-env.d.ts // 解决引入模块的报错提示 declare module "nprogress";2.在 .evn 文件中创建了自定义环境变量 VITE_APP_BASE_URL 但在项目中使用时出…

Real-time object detection and 3D scene perception in self-driving cars

摘要 可靠的城市自动驾驶取决于车辆感知和导航环境的能力。本论文的研究重点是设计并实现一个基于视觉的NUSTAG自动驾驶汽车感知系统。主要任务是使用立体相机馈送来估计汽车、自行车和行人的位置&#xff0c;从而实现3D边界框估计和深度感知。此外&#xff0c;使用2D对象检测…

SpringBoot集成EasyExcel快速人们

目录 1.背景介绍 2.EasyExcel的使用 1.添加依赖 2.相关代码准备 1.实体类 2.ExcelUtil工具类 3.写入控制类 1.背景介绍 EasyExcel 是阿里巴巴开发的一款基于 Java 的专业化 Excel 操作工具&#xff0c;主要用于在 Java 应用程序中快速、高效地读写 Excel 文件。EasyExce…

第二周opencv

一、边缘检测算子 边缘检测算子是用于检测图像中物体边界的工具。边缘通常表示图像中灰度值或颜色发生显著变化的地方。边缘检测有助于识别图像中的物体形状、轮廓和结构。这些算子通过分析图像的灰度或颜色梯度来确定图像中的边缘。 1、Roberts 算子 通过局部差分计算检测边缘…

Github 2024-02-28 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-28统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5Rust项目2Zig项目1JavaScript项目1C项目1 免费API集合列表 创建周期&#xff1a;2901 天开发语言…

C++观察者模式代码实例

文章目录 C观察者模式代码实例一C观察者模式代码实例二 C观察者模式代码实例一 下面是一个简单的C观察者模式的实现示例&#xff0c;这里仅给出核心代码框架&#xff0c;完整的工程应包含对应的头文件声明及必要的#include指令等。 // 观察者接口&#xff08;Observer&#x…

.net 在ubuntu下动态写入 中文字乱码 解决:ubuntu下添加中文字库

.net 在ubuntu下动态写入图片水印 中文字乱码 解决&#xff1a;ubuntu下添加中文字库 1.安装字体命令 sudo apt install -y fontconfig2.查看已安装的字体 &#xff08;1&#xff09;查看linux已安装字体 fc-list&#xff08;2&#xff09;查看linux已安装中文字体 fc-li…

内存函数(memcpy/memmove/memcmp/memset)

目录 memcpymemcpy函数的模拟实现 memmovememmove函数的模拟实现 memcmpmemset memcpy void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置这个函数在遇到 ‘\0’ 的时候…

实战Kafka的部署

目录 一、环境准备 二、安装配置jdk8 &#xff08;1&#xff09;Kafka、Zookeeper&#xff08;简称&#xff1a;ZK&#xff09;运行依赖jdk8 三、安装配置ZK &#xff08;1&#xff09;安装 &#xff08;2&#xff09;配置 四、配置Kafka &#xff08;1&#xff09;配置…

day08_面向对象基础_内存关系

零、今日内容 一、作业 二、面向对象 一、作业 package com.qf.homework;import java.util.Arrays;/*** --- 天道酬勤 ---** author QiuShiju* date 2024/2/28* desc*/ public class Homework {public static void main(String[] args) {test();}//写一个方法 用于合并两个int…

golang 泛型详解

目录 概念 ~int vs .int 常见的用途和错误 结论&#xff1a; 概念 Go 在1.18 中添加了泛型&#xff0c;这样Go 就可以在定义时不定义类型&#xff0c;而是在使用时进行类型的定义&#xff0c;并且还可以在编译期间对参数类型进行校验。Go 目前只支持泛型方法&#xff0c;还…

无源蜂鸣器驱动实验

1.原理 计划是&#xff0c;生成不同的7个频率控制蜂鸣器发声&#xff0c;每个音调发声0.5秒。 50MHZ计数0.5秒&#xff0c;50MHZ一个周期20ns&#xff0c;要计数0.5秒 &#xff0c;0.5/0.000_000_02s25000_000个时钟周期。因为是从0开始计数&#xff0c;所以计数的最大值是0-24…