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日

相关文章

  • 8款替代Dreamweaver的开源网页开发工具

    8款替代Dreamweaver的开源网页开发工具 如果你需要一个替代Adobe的Dreamweaver网页开发工具,以下是8款开源的网页开发工具,它们拥有不同的优点,可以满足不同的需求,其中一些是WYSIWYG编辑器,而其他的则提供代码编辑环境。 1. Bluefish Bluefish 是一款小巧的文本编辑器,它可以用来编写HTML、CSS、JavaScr…

    css 2023年6月9日
    00
  • 深入剖析从输入URL到页面显示过程原理

    下面我将详细讲解“深入剖析从输入URL到页面显示过程原理”的完整攻略。 1.域名解析(DNS解析) 当用户在浏览器中输入一个URL时,浏览器首先需要将URL中的域名解析为IP地址,从而定位到服务器。这个解析的过程叫做DNS解析。具体过程如下: 浏览器首先会检查浏览器缓存中是否保存了该域名的IP地址。 如果浏览器缓存中没有,那么浏览器会向本地DNS服务器发送一…

    css 2023年6月10日
    00
  • HTML如何在两个div标签中间画一条竖线

    要在两个div标签中间画一条竖线,可以通过以下步骤实现: 1.在HTML中的两个div标签之间插入一个空div元素作为竖线的容器。 2.使用CSS样式为这个空div元素添加宽度、高度、背景颜色以及边框宽度和样式等属性,来呈现出竖线的效果。 下面是两个示例来说明这个过程: 示例1: html和css代码 <div class="left&quo…

    css 2023年6月10日
    00
  • jQuery插件实现带圆点的焦点图片轮播切换

    实现带圆点的焦点图片轮播切换的关键在于利用jQuery插件来实现,以下是实现的详细攻略: 步骤一,编写HTML结构 首先,需要编写HTML结构,包括轮播图图片和对应的圆点: <div class="slider"> <ul class="slider-list"> <li><i…

    css 2023年6月11日
    00
  • JavaScript实现一个前端会魔法的旋转魔方相册

    首先我们需要明确一下魔方相册的效果和基本知识。魔方相册其实就是六个面,每个面都有若干张图片,可以通过鼠标拖拽的方式对相册进行旋转,显示不同的图片。那么我们需要用到的技术就是CSS3的transform和JavaScript的事件监听。 我们可以将魔方的每个面看成一个盒子,每个盒子里面包含若干张图片,然后将这些盒子通过CSS3的transform样式进行变形,…

    css 2023年6月9日
    00
  • firebug如何使用以及firebug安装的图文步骤

    Firebug是一款前端调试工具,可以用于实时编辑、调试和监测网页源码,帮助前端开发人员更加高效地进行开发和调试。下面是Firebug的安装及使用攻略。 Firebug的安装步骤 在Firefox浏览器中搜索Firebug插件,找到适合自己的版本下载; 安装下载的插件; 重启Firefox浏览器,就可以使用Firebug了。 Firebug的使用步骤 打开F…

    css 2023年6月10日
    00
  • 第一次动手实现bootstrap table分页效果

    下面是实现 Bootstrap Table 分页效果的攻略: 准备工作 在开始前,我们需要先引入 Bootstrap 和 jQuery,可以在头部加入以下代码: <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/…

    css 2023年6月10日
    00
  • jQuery实现轮播图源码

    下面是详细的jQuery实现轮播图源码攻略,包括完整过程和示例说明: 1. 确定HTML结构和CSS样式 在开始编写轮播图的jQuery源码之前,我们首先需要确定轮播图的HTML结构和CSS样式。一般来说,轮播图的HTML结构应该包含轮播图容器以及若干个轮播图项,而CSS样式则用于设置轮播图的尺寸、布局以及动画效果等。 以下是一个简单的HTML结构和CSS样…

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