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日

相关文章

  • 分享CSS3中必须要知道的10个顶级命令

    当提到CSS3时,许多人会想到它的一些令人兴奋的特性,如圆角边框、阴影和渐变。但除了这些新特性外,CSS3还引入了许多与核心语言中的基本语法和规程相关的新属性和选项。在本文中,我们将讨论那些必须掌握的CSS3顶级命令,这些命令将有助于提高Web开发人员的技能。下面是分享CSS3中需要知道的10个顶级命令。 1. border-radius border-ra…

    css 2023年6月9日
    00
  • Web标准建构的站点一览表

    让我来给你讲解一下“Web标准建构的站点一览表”的完整攻略。 一、什么是Web标准建构的站点一览表 Web标准建构的站点一览表是一个收集各种实例网站的网站列表,该列表仅收录那些完全符合Web标准并建构优良的网站。这个列表帮助网站设计师创建更好的网站,提高网站的可访问性、可维护性和可扩展性。Web标准建构的站点一览表帮助人们了解如何应用标准技术来创建可访问的、…

    css 2023年6月10日
    00
  • CSS实现连续数字和英文的自动换行的方法

    要实现连续数字和英文的自动换行,可以利用CSS中的word-break和overflow-wrap两个属性。 word-break属性:用于设置换行规则,共有三个值可选。分别是: normal(默认值):只在单词的边缘处换行。 break-all:单词内部可以换行。 keep-all:只有在字符之间换行。 overflow-wrap属性:用于设置当一段文字中…

    css 2023年6月10日
    00
  • jQuery实现可拖拽3D万花筒旋转特效

    jQuery实现可拖拽3D万花筒旋转特效攻略 一、需求分析 我们要实现一个可拖拽3D万花筒旋转特效,包含以下几个要求: 可以拖拽鼠标按下的元素; 元素在被拖拽时随着鼠标的移动而旋转; 元素的旋转效果需要有3D的视觉效果; 元素的旋转需要动画过渡效果。 二、技术选型 针对我们的需求,我们可以选择使用jQuery和CSS3来实现。 三、具体实现步骤 1. 拖拽实…

    css 2023年6月10日
    00
  • 屏蔽浏览器自动的input样式不影响设计整体的一致性

    屏蔽浏览器自动的input样式是一个常见的需求,因为浏览器自带的input样式可能不符合设计要求,会影响网站整体的一致性。以下是一些攻略,可以帮助你屏蔽浏览器自动的input样式。 方案一:使用伪类 可以使用伪类来屏蔽浏览器自动的input样式,具体做法如下: input[type="text"], input[type="pa…

    css 2023年6月9日
    00
  • 第一次接触神奇的Bootstrap

    Bootstrap是一种用于创建响应式、移动设备优先的Web应用程序的强大框架。对于新手来说,初次接触Bootstrap可能会感到有些挑战,但只要您按照以下步骤操作,就可以在不到几个小时内学会使用Bootstrap。 步骤一:准备工作 在开始学习Bootstrap之前,您需要执行以下准备工作:1. 确定您的开发环境:您需要一个文本编辑器,一个Web服务器和一…

    css 2023年6月9日
    00
  • 用一个DIV画图通过background-image叠加实现

    下面是用一个DIV画图通过background-image叠加实现的攻略。 什么是用一个DIV画图通过background-image叠加实现? 使用一个DIV元素来绘制复杂的图形,是一种常用的HTML和CSS技巧。这种技术有许多优点,包括简单、灵活、易于维护等。 background-image叠加则是指通过多张图片,依次叠加在背景上,实现一个图形的效果。…

    css 2023年6月10日
    00
  • 从console.log说起(console.log详细介绍)

    从console.log说起,它是JavaScript中最基础的调试工具之一,常用于输出变量或调试信息。下面就来详细介绍一下。 什么是console.log console.log是JavaScript中一个用来输出信息的函数,其使用方式为console.log(输出内容),输出内容可以是字符串、数字、布尔值、数组、对象等等。控制台可以输出该函数所传递的参数…

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