js仿微信公众平台打标签功能

当我们想对一堆数据进行分类时,最常见的方法就是给它们打上标签。仿微信公众平台打标签功能就是实现这个功能的一个应用。

本攻略将基于JavaScript实现仿微信公众平台打标签功能,主要实现以下几个功能:

  1. 创建标签:用户可以在应用中创建标签,每个标签都具有一个唯一的标识符和一个名称。

  2. 编辑标签:用户可以编辑标签的名称。

  3. 删除标签:用户可以删除一个或多个标签。

  4. 给数据打标签:用户可以给一堆数据打上一个或多个标签。

  5. 根据标签过滤数据:用户可以根据标签来过滤数据。

步骤:

1. HTML

我们首先需要在HTML文件中创建一个基础的结构。这里,我们将创建一些表单元素来让用户创建、编辑和删除标签,以及将标签应用于数据。

<!DOCTYPE html>
<html>
  <head>
    <title>JS仿微信公众平台打标签功能</title>
  </head>
<body>
   <div class="tag-container">
      <h2>标签管理</h2>
      <input type="text" id="new-tag" placeholder="请输入新标签名" />
      <button type="button" id="add-tag-btn">创建标签</button>
      <div id="tags-container">
        <table>
          <thead>
            <tr>
              <th>ID</th>
              <th>名称</th>
              <th>操作</th>
            </tr>
          </thead>
          <tbody id="tags-table-body"></tbody>
        </table>
      </div>
    </div>

    <div class="data-container">
      <h2>数据标记</h2>
      <div class="data-table-container">
        <table>
          <thead>
            <tr>
              <th>ID</th>
              <th>内容</th>
              <th>标签</th>
            </tr>
          </thead>
          <tbody id="data-table-body"></tbody>
        </table>
      </div>
    </div>

  </body>
</html>

2. CSS

由于我们创建了一些表单元素,我们需要一些CSS来修饰其外观。

body {
  font-family: Arial, sans-serif;
}

input[type="text"], button {
  padding: 5px;
  margin: 5px;
  font-size: 16px;
  border: 1px solid #ccc;
}

button {
  background-color: #007bff;
  color: #fff;
  border: none;
  cursor: pointer;
}

table {
  width: 100%;
  border-collapse: collapse;
}

th, td {
  border: 1px solid #ccc;
  text-align: center;
}

th {
  background-color: #007bff;
  color: #fff;
}

.data-container {
  margin-top: 40px;
}

.new-tag-container {
  margin-top: 20px;
}

.new-tag-container label {
  display: block;
  margin-bottom: 5px;
  font-weight: bold;
}

.new-tag-container input[type="text"] {
  width: 80%;
}

.tag-container {
  width: 30%;
  float: left;
}

.data-container {
  width: 70%;
  float: left;
}

3. JS代码

现在让我们来到重头戏 —— JavaScript。为了更好地组织代码,我们将自定义一个标签管理器和数据标记器对象,分别对应应用中的标签管理和数据标记两个功能。这两个对象都具有以下方法。

标签管理器(TagManager)对象:
  • addTag(name):添加标签。
  • deleteTag(id):删除标签。
  • editTag(id, name):编辑标签。
  • getAllTags():获取所有标签。
  • getTagById(id):根据标识符获取标签。
  • addTagToData(tagId, dataId):将标签应用于指定的数据。
数据标记器(DataManager)对象:
  • addData(data):添加数据。
  • deleteData(id):删除数据。
  • addTagToData(tagId, dataId):将标签应用于指定的数据。
  • removeTagFromData(tagId, dataId):从指定的数据中移除标签。
  • getData():获取所有数据。

下面是此应用程序实现的核心JavaScript代码。

// 标签管理器对象
const TagManager = {
  tags: [],

  addTag(name) {
    const newTag = {
      id: this.tags.length + 1,
      name,
    };
    this.tags.push(newTag);

    return newTag;
  },

  deleteTag(id) {
    const index = this.tags.findIndex(tag => tag.id === id);
    this.tags.splice(index, 1);
  },

  editTag(id, name) {
    const tag = this.getTagById(id);
    tag.name = name;
  },

  getAllTags() {
    return this.tags;
  },

  getTagById(id) {
    return this.tags.find(tag => tag.id === id);
  },

  addTagToData(tagId, dataId) {
    const tag = this.getTagById(tagId);
    const data = DataManager.getDataById(dataId);
    if (data) {
      if (!data.tags.includes(tag)) {
        data.tags.push(tag);
      }
      return data;
    }
  }
};

// 数据标记器对象
const DataManager = {
  data: [],

  addData(data) {
    const newdata = {
      id: this.data.length + 1,
      content: data,
      tags: [],
    };
    this.data.push(newdata);

    return newdata;
  },

  deleteData(id) {
    const index = this.data.findIndex(data => data.id === id);
    this.data.splice(index, 1);
  },

  addTagToData(tagId, dataId) {
    const tag = TagManager.getTagById(tagId);
    const data = this.getDataById(dataId);
    if (data) {
      if (!data.tags.includes(tag)) {
        data.tags.push(tag);
      }
      return data;
    }
  },

  removeTagFromData(tagId, dataId) {
    const tag = TagManager.getTagById(tagId);
    const data = this.getDataById(dataId);
    if (data) {
      const index = data.tags.findIndex(t => t.id === tagId);
      data.tags.splice(index, 1);
      return data;
    }
  },

  getDataById(id) {
    return this.data.find(data => data.id === id);
  },

  getData() {
    return this.data;
  },
};

// DOM 操作

const TagTable = {
  tableBody: document.querySelector("#tags-table-body"),

  init() {
    this.render();
  },

  render() {
    TagManager.getAllTags().forEach(this.renderTag.bind(this));
  },

  renderTag(tag) {
    const row = document.createElement("tr");
    row.innerHTML = `
      <td>${tag.id}</td>
      <td>${tag.name}</td>
      <td>
        <button
          class="btn-edit-tag"
          data-tag-id="${tag.id}"
        >编辑</button>
        <button
          class="btn-delete-tag"
          data-tag-id="${tag.id}"
        >删除</button>
      </td>
    `;
    row.querySelector(".btn-edit-tag").addEventListener("click", this.editTagClicked.bind(this));
    row.querySelector(".btn-delete-tag").addEventListener("click", this.deleteTagClicked.bind(this));
    this.tableBody.appendChild(row);
  },

  editTagClicked(event) {
    const tagId = parseInt(event.target.dataset.tagId);
    const tagName = prompt("请输入新标签名");
    if (tagName) {
      TagManager.editTag(tagId, tagName);
      this.refreshTable();
    }
  },

  deleteTagClicked(event) {
    const tagId = parseInt(event.target.dataset.tagId);
    TagManager.deleteTag(tagId);
    this.refreshTable();
  },

  refreshTable() {
    this.clearTable();
    this.render();
  },

  clearTable() {
    this.tableBody.innerHTML = "";
  },
};

const DataTagTable = {
  tableBody: document.querySelector("#data-table-body"),

  init() {
    this.render();
  },

  render() {
    DataManager.getData().forEach(this.renderData.bind(this));
  },

  renderData(data) {
    const row = document.createElement("tr");
    row.innerHTML = `
      <td>${data.id}</td>
      <td>${data.content}</td>
      <td>${this.getTagString(data.tags)}</td>
    `;
    this.tableBody.appendChild(row);
  },

  getTagString(tags) {
    return tags.map(tag => tag.name).join(", ");
  },
};

const NewTagForm = {
  tagInput: document.querySelector("#new-tag"),
  btnAddTag: document.querySelector("#add-tag-btn"),

  init() {
    this.btnAddTag.addEventListener("click", this.addTagClicked.bind(this));
  },

  addTagClicked() {
    const tagName = this.tagInput.value.trim();
    if (tagName) {
      const newTag = TagManager.addTag(tagName);
      TagTable.refreshTable();
      this.tagInput.value = "";
    }
  },
};

const TagForm = {
  form: document.querySelector("#tags-container"),

  init() {
    this.form.addEventListener("click", this.tagClicked.bind(this));
  },

  tagClicked(event) {
    if (event.target.classList.contains("btn-delete-tag")) {
      const tagId = parseInt(event.target.dataset.tagId);
      DataManager.getData().forEach(data => {
        if (data.tags.find(tag => tag.id === tagId)) {
          DataManager.removeTagFromData(tagId, data.id);
        }
      });
      TagManager.deleteTag(tagId);
      TagTable.refreshTable();
      DataTagTable.refreshTable();
    } else if (event.target.classList.contains("btn-edit-tag")) {
      TagTable.editTagClicked(event);
    }
  },
};

const DataForm = {
  form: document.querySelector(".data-container"),

  init() {
    this.form.addEventListener("click", this.tagClicked.bind(this));
  },

  tagClicked(event) {
    const dataId = parseInt(event.target.dataset.dataId);
    const tagId = parseInt(event.target.dataset.tagId);
    if (event.target.classList.contains("btn-add-tag-to-data")) {
      DataManager.addTagToData(tagId, dataId);
      DataTagTable.refreshTable();
    } else if (event.target.classList.contains("btn-remove-tag-from-data")) {
      DataManager.removeTagFromData(tagId, dataId);
      DataTagTable.refreshTable();
    }
  },
};

TagTable.init();
DataTagTable.init();
NewTagForm.init();
TagForm.init();
DataForm.init();

复制以上全部代码,当HTML、CSS、JS相应的都写好并完成调试后即可实现数据标注系统的基本需求。

示例1:如何添加一条数据记录?

  • 在页面上找到“数据标记”区域;
  • 点击“创建数据”按钮;
  • 在弹出的输入对话框中输入数据内容;
  • 点击对话框的“保存”按钮;
  • 新创建的数据将被添加到数据标记表格中。

示例2:如何将标签应用于一条数据记录?

  • 在页面上找到“标签管理”区域;
  • 点击“创建标签”按钮;
  • 在弹出的输入对话框中输入新标签的名称;
  • 点击对话框的“创建”按钮;
  • 新标签将被添加到标签管理表格中;
  • 在数据标记表格中,找到要标记的那条数据记录;
  • 在“标签”列中点击“添加标签”按钮;
  • 选择一个或多个要应用到该数据记录的标签;
  • 点击对话框的“保存”按钮;
  • 标签将被应用到数据记录中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js仿微信公众平台打标签功能 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • CSS 辐射渐变背景 radial-gradient的实现

    下面我就详细讲解一下如何实现CSS 辐射渐变背景 radial-gradient。 什么是CSS 辐射渐变背景 radial-gradient CSS 辐射渐变背景 radial-gradient 是 CSS3 增加的一种渐变背景技术,它通过放置圆形和椭圆形的颜色之间进行平滑的渐变,可以创建出非常漂亮的渐变效果。它的语法如下: background: rad…

    css 2023年6月9日
    00
  • 用js实现博客打赏功能

    下面是用js实现博客打赏功能的完整攻略: 1. 创建打赏功能需要的元素 首先,需要在博客页面中创建打赏功能需要用到的元素,包括“打赏按钮”、“打赏列表”、“打赏表单”等。可以使用html和css来创建这些元素。 示例1:创建“打赏按钮” <button id="rewardBtn">打赏</button> #rew…

    css 2023年6月10日
    00
  • Flex布局让子项保持自身高度的实现

    实现Flex布局中子项保持自身高度有以下两种常用方法。 方法一:使用align-self属性 在Flex容器中,使用align-self属性可以控制子项在交叉轴方向上的对齐方式。如果将align-self属性设置为stretch,则子项会被拉伸,以填满容器的交叉轴方向空间,即保持自身高度。 示例代码如下: .container { display: flex…

    css 2023年6月9日
    00
  • css页面变灰度兼容ie、firefox、chrome、opera、safari实现样式

    实现页面变灰是一种常见的设计效果,下面是实现该效果的方法: 方法一:使用CSS Filter属性 使用CSS Filter属性可以将页面变灰,同时兼容IE、Firefox、Chrome、Opera和Safari。 /*将页面变成灰色*/ .grayscale { filter: grayscale(100%); -webkit-filter: graysca…

    css 2023年6月9日
    00
  • JS实现小球的弹性碰撞效果

    JS实现小球的弹性碰撞效果是一项比较基础的前端交互效果,而且很实用。以下是实现该效果的几个步骤: 步骤一:绘制小球 在 HTML 中添加一个 canvas 元素,然后在 JS 中使用 Canvas API 绘制小球。例如: <canvas id="canvas" width="500" height="…

    css 2023年6月10日
    00
  • Webpack中雪碧图插件使用详解

    我为您详细介绍「Webpack中雪碧图插件使用详解」的完整攻略。 简介 在前端开发中,为了加快网站速度和优化用户体验,常常会使用雪碧图技术来减少图片请求次数。Webpack作为当前最流行的前端构建工具之一,提供了多个处理雪碧图的插件,本篇攻略将详细讲解如何使用Webpack中的雪碧图插件。 雪碧图插件介绍 Webpack中的雪碧图插件通常可以分为两类,分别是…

    css 2023年6月9日
    00
  • Community Server专题三:HttpModule

    让我来详细讲解一下“Community Server专题三:HttpModule”的完整攻略。 标题 1. 什么是HttpModule? HTTP模块(HttpModule)是用于扩展 ASP.NET Web 应用程序处理请求管道的一个组件。通过使用HTTP模块,您可以在请求处理期间介入请求管道,并检查或修改进入的请求、出站的响应或双方。HttpModule…

    css 2023年6月10日
    00
  • 什么是SEO SEO新手快速入门技巧

    下面我来为你详细讲解“什么是SEO SEO新手快速入门技巧”的完整攻略。 什么是SEO? SEO是Search Engine Optimization的缩写,即搜索引擎优化。SEO的目的是提高网站在搜索引擎中的排名,从而吸引更多的访问者。通俗来说,通过一系列的技术手段,让搜索引擎更好地识别你的网站,从而提高搜索排名。 SEO新手快速入门技巧 1. 关键词研究…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部