打造 Bootstrap Tags Input 同 Modal 结合的利器

2023-05-16

       Boostrap Tags input 的使用:http://bootstrap-tagsinput.github.io/bootstrap-tagsinput/examples/

       Boostrap Tags Input 插件基于Bootstrap实现了如:打Tag 和 删除Tag等功能,如:


点击右侧的 x 号可以进行删除。可以通过 tagsinput('items') 方法获取定义的tag的内容。如:

console.log($('#input').val());
console.log($('#input').tagsinput('items'));


       但仅是这样并不能满足自身的需求,于是对结合自身需求,进行了修改实现:当点击 “输入框” 时,将出现一个 Modal(模态框),用于定义tag的内容,当输入内容后,点击确定,即可生成具有相应信息的tag。同样点击右侧的 x 号可以删除当前 tag 。再次点击 tag 可以对 tag 进行再次编辑。效果如下:




点击“显示信息”可以查看一个 tag 保存的信息:

  

再次点击 tag 进行编辑:


      


具体实现如下:(主要需要先引入 bootstrap 框架 和 boostrap tags input 插件)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Tags Input</title>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="bootstrap-tagsinput/bootstrap-tagsinput.css">

    <style>
        .bootstrap-tagsinput {
            display: block;
        }
        .bootstrap-tagsinput .tag {
            display: inline-block;
            margin: 0.4em 0;
            font-size: 1.1em;
        }
    </style>
</head>
<body>
    <div class="container" style="margin: 50px auto;">
        <p><input type="text" id="input"/></p>
        <p><button class="btn btn-default" id="showInfo">显示信息</button></p>
        <div id="info" style="margin: 10px 0;"></div>
    </div>

    <div id="modal-add" class="modal fade">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
                    <h4 class="modal-title">Modal title</h4>
                </div>
                <div class="modal-body">
                    <form class="form-horizontal">
                        <div class="form-group">
                            <label for="tname" class="col-sm-2 control-label">名称</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control" id="tname" placeholder="请输入名称">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="tcontent" class="col-sm-2 control-label">内容</label>
                            <div class="col-sm-10">
                                <textarea id="tcontent" rows="5" class="form-control" placeholder="请输入内容"></textarea>
                            </div>
                        </div>
                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    <button type="button" class="btn btn-primary" id="btn-add">确定</button>
                </div>
            </div><!-- /.modal-content -->
        </div><!-- /.modal-dialog -->
    </div><!-- /.modal -->

    <div id="modal-change" class="modal fade">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
                    <h4 class="modal-title">Modal title</h4>
                </div>
                <div class="modal-body">
                    <form class="form-horizontal">
                        <div class="form-group">
                            <label for="tname" class="col-sm-2 control-label">名称</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control" id="tname" placeholder="请输入名称">
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="tcontent" class="col-sm-2 control-label">内容</label>
                            <div class="col-sm-10">
                                <textarea id="tcontent" rows="5" class="form-control" placeholder="请输入内容"></textarea>
                            </div>
                        </div>
                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                    <button type="button" class="btn btn-primary" id="btn-change">确定</button>
                </div>
            </div><!-- /.modal-content -->
        </div><!-- /.modal-dialog -->
    </div><!-- /.modal -->
    <script src="jquery.min.js"></script>
    <script src="bootstrap/js/bootstrap.min.js"></script>
    <script src="bootstrap-tagsinput/bootstrap-tagsinput.js"></script>

    <script>
        $(function() {

            var tagsinput = $('#input').tagsinput({
                trimValue: true,
                itemValue: function(item) {
                    return item.title;
                },
                tagClass: function(item) {
                    var type = 'label-default';
                    switch (parseInt(Math.random() * 6)) {
                        case 0:
                            type = 'label-default'; break;
                        case 1:
                            type = 'label-primary'; break;
                        case 2:
                            type = 'label-success'; break;
                        case 3:
                            type = 'label-info'; break;
                        case 4:
                            type = 'label-warning'; break;
                        case 5:
                            type = 'label-danger'; break;
                    }
                    return 'label ' + type;
                }
            })[0];

            var input = tagsinput.$element;
            var tagsArray = tagsinput.itemsArray;
            var tagsContainer = tagsinput.$container; // tag 的容器

            var modalAdd = $('#modal-add'); //添加 tag 时,显示的模态框
            var modalChange = $('#modal-change'); //修改 tag 时,显示的模态框

            // 点击tagsinput输入框,显示模态框
            tagsContainer.on('click', function() {
                $(this).find('input').blur();

                // 清除原来的内容,打开用于 增加tag的模态框
                modalAdd.find('input').val('');
                modalAdd.find('textarea').val('');
                modalAdd.modal('show');
            });

            // 添加tag的模态框的确认按钮
            $('#btn-add').on('click', function() {
                var minput = modalAdd.find('input').val();
                var mtextarea = modalAdd.find('textarea').val();

                if(minput == '' || mtextarea =='') {
                    return false;
                }

                input.tagsinput('add', {'title' : minput, 'text' : mtextarea});

                modalAdd.modal('hide');

                // 当前新创建的标签
                var cur = $(tagsContainer.children('span.tag:last'));

                cur.on('click', function(e) {
                    e.stopPropagation();
                    tagsContainer.find('input').blur();

                    // 显示模态框
                    var item = $(this).data('item');
                    var title = item.title;
                    var text = item.text;

                    modalChange.data('tag', $(this));
                    modalChange.find('input').val(title);
                    modalChange.find('textarea').val(text);
                    modalChange.modal('show');
                });


                // 当前新建的标签的删除事件
                cur.children('span[data-role=remove]').on('click', function(e) {
                    e.stopPropagation();
                    if (tagsinput.$element.attr('disabled')) {
                        return;
                    }
                    tagsinput.remove($(e.target).closest('.tag').data('item'));
                });

            });

            $('#btn-change').on('click', function() {

                var title = modalChange.find('input').val();
                var text = modalChange.find('textarea').val();

                // 当前正在编辑的 tag
                var tag = modalChange.data('tag');
                var beforeTitle = tag.data('item').title;
                tag.data('item', {title: title, text: text});

                // 修改 tagsArray 中保存的内容
                for(var i = 0; i < tagsArray.length; i++) {
                    if(tagsArray[i].title == beforeTitle) {
                        tagsArray[i].title = title;
                        tagsArray[i].text = text;
                    }
                }

                input.tagsinput('pushVal');
                input.tagsinput('refresh'); //“刷新界面”

                modalChange.modal('hide');
            });

            $('#showInfo').on('click', function() {
                $('#info').html('<pre>' + $('#input').val() + '<br/>' + $('#input').tagsinput('items') + '</pre>');

                console.log($('#input').val());
                console.log($('#input').tagsinput('items'));
            });

        });
    </script>
</body>
</html>



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打造 Bootstrap Tags Input 同 Modal 结合的利器 的相关文章

  • 我的LabPHP框架的Demo应用——课程设计题目统计系统

    1 界面制作 xff08 为了方便起见 xff0c 这里我采用了Bootstrap 框架制作界面 xff09 xff1b 2 数据库设计 xff0c 正确创建students 表 xff1b admin表 xff1a 3 项目目录结构如下
  • 基于Bootstrap使用jQuery实现输入框组input-group的添加与删除

    注意这里要求使用到Bootstrap框架的输入框组 xff0c 如 xff1a lt div class 61 34 row 34 gt lt div class 61 34 col lg 6 34 gt lt div class 61 3
  • 网页中时光轴的简单实现

    时光轴效果如下 xff1a 鼠标滑过当前项时 xff0c 左侧图标大小变大 xff1a index html lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta
  • 伸缩自如的时光轴实现

    上回说到简单时间轴的实现 xff0c 这一次针对上回的实现的时光轴 xff0c 增加时光轴收起的功能 为了方便重用 xff0c 我分离css样式和js 使用过程中主要注意一下尽量使用css定义的时光轴样式即可 时光轴收起功能的实现过程可以查
  • 伸缩自如的时光轴实现——改进版

    上回讲到的是时光轴 伸缩自如 的实现 xff0c 如果基于响应式制作的话 xff0c 可能存在着许多潜在的BUG 如 xff1a 窗口变化时 xff0c 时光轴的 收起 和 展开 xff0c 都发生了一些变形 为此 xff0c 对原来的 t
  • 伸缩自如的时光轴实现_样式改版

    针对前几篇文章中实现的 伸缩自如 的时光轴 xff0c 对时光轴的样式进行又一次修改 xff0c 效果如下 xff1a 点击 收起 后 xff1a 修改后的 timeline css xff0c 如下 xff1a vertical time
  • ThinkPHP中的create方法与自动令牌验证

    转载自 xff1a Thinkphp中Create方法深入探究 ThinkPHP中的create方法与自动令牌验证实例教程 Thinkphp中Create方法深入探究 由于工作原因在thinkPHP的create 方法上遇到了问题 xff0
  • web安全之token和CSRF攻击

    上文我转载了两篇关于ThinkPHP令牌验证的文章 xff08 ThinkPHP中的create方法与自动令牌验证 xff09 其中提及到了 token xff0c 这里针对 token 的作用 xff0c 转载了另外两篇文章 xff08
  • java中的==、equals和hashCode以及hashCode生成

    转载自 xff1a xff08 点击打开链接 xff09 前言 java中 61 61 equals hashCode 都和对象的比较有关 xff0c 在java中这三者各有什么用处呢 xff0c 即java中为什么需要设计这三种对象的比较
  • javascript调用微信或QQ扫一扫

    项目里为了体验做的好点 xff0c 想直接通过js调用手机的扫一扫 xff1a 服务的用户主要是通过 xff1a 微信或QQ 之前使用过 微信或QQ的分享 腾讯移动WEB开发平台的 39 对外分享组件接口文档 39 http open mo
  • Java中的反射机制

    获取类的类类型的3种方式 xff0c 以及如何通过类的类类型创建实例对象 xff1f ClassDemo1 java package com reflect public class ClassDemo1 public static voi
  • Java中的自定义注解

    自定义注解 Description java xff08 这里自定义Description注解 xff09 package com ann test import java lang annotation Documented import
  • Java中自定义注解的应用

    来自 慕课网 的学习 我们可以使用自定义注解 xff0c 实现ORM xff0c 即对象 关系的映射 通过自定义注解 xff0c 定义对象对应数据表的属性 xff0c 如表名 xff0c 表字段等 Table java xff08 Tabl
  • Intellij IDEA下的第一个Hibernate项目

    参考 xff1a intellij配置hibernate自动生成hbm xml文件 从零开始用Intellij idea14创建hibernate项目 下面我要讲的创建方式 xff0c 可能更加原生态 xff0c 更加类似于Eclipse下
  • Intellij IDEA使用注解创建Hibernate项目中的OR映射类

    上回说到 xff1a Intellij IDEA下的第一个Hibernate项目 我们需要创建 对象到关系的映射配置文件 xff0c 如 entity hbm xml xff08 其中 entity 是我们将要创建的实体 xff09 下面讲
  • Hibernate中Blob对象类型的使用

    使用Intellij IDEA创建Hibernate项目 xff0c 目录结构如下 xff1a 其中 assets app png 为将要存储的照片 xff0c src hibernate cfg xml 为Hibernate的配置文件 x
  • Hibernate组件映射

    转载自 xff1a 点击打开链接 在Hibernate中 component 是某个实体的逻辑组成部分 xff0c 它与实体的根本区别是没有oid xff08 对象标识符 xff09 xff0c component是一个被包含的对象 它作为
  • Hibernate中的单向一对多关联

    源自 imooc 中的学习 Hibernate中的单向一对多关联 xff0c 这里举例 班级对学生 的单向一对多关联 xff0c 即一个班级可以有多个学生 那么在Hibernate中实体对象间如何体现出单向一对多的关联关系呢 xff1f 如
  • Hibernate中的单向多对一关联

    继上回讲到 Hibernate中的单向一对多关联 xff0c 这次来实现一下Hibernate中的单向多对一关联 对原来的项目修改如下 xff1a Hibernate中的单向多对一关联 xff0c 需要我们在多方增加一个一方的属性 xff0
  • Hibernate中的双向多对一关联以及 inverse属性、cascade属性的用法

    上回 说了 Hibernate中的单向一对多关联 和 Hibernate中的单向多对一关联 这次针对这两个 单向 进行整合即可实现双向的多对一关联 如 xff1a 学生与班级的关系 在Grade类中需要添加 Set集合保存Student对象

随机推荐

  • 优化器 optimizer

    优化器 optimizer optimizer 优化器 xff0c 用来根据参数的梯度进行沿梯度下降方向进行调整模型参数 xff0c 使得模型loss不断降低 xff0c 达到全局最低 xff0c 通过不断微调模型参数 xff0c 使得模型
  • Hibernate中的多对多关联

    源自 imooc 的学习 多对多关联是一种常见的关联关系 多对多关联关系一般采用中间表的形式来实现 xff0c 即新增一张包含关联双方主键的关联表 那么 xff0c 在Hibernate中如何实现多对多的关联关系呢 xff1f 多对多关联可
  • HQL数据查询基础(一)

    源自 imooc 的学习 什么是HQL呢 xff1f HQL 是Hibernate Query Language xff0c Hibernate查询语言 xff1b 同时HQL是一种面向对象的查询语言 xff0c HQL查询的主体是映射配置
  • HQL数据查询基础(二)

    继上回 xff08 HQL数据查询基础 xff08 一 xff09 xff09 说到的例子 网上商店 xff0c 来继续完善持久化类和配置文件的创建 上回 在 com imooc model 包中创建 Seller java 持久化类 xf
  • HQL数据查询基础(三)

    继上回 xff08 HQL数据查询基础 xff08 二 xff09 xff09 xff0c 针对 网上商店 这个例子 xff0c 来讲解一些HQL简单的子句用法 xff08 以下的所有测试方法均在 MyTest java 测试类 xff08
  • Maven中pom.xml的解析

    Maven项目中的 pom xml lt project xmlns 61 34 http maven apache org POM 4 0 0 34 xmlns xsi 61 34 http www w3 org 2001 XMLSche
  • IntelliJ使用指南—— 导入Eclipse的Web项目

    通常一个团队中可能有人用eclipse xff0c 有人用intelliJ xff0c 那么经常会出现需要导入别人用eclipse建好的web项目 而IntelliJ提供了多种项目类型的导入方式 xff0c 其中就有eclipse 在初始窗
  • JQuery、JSON、Ajax在Servlet中的应用

    1 在Java中正确得到JSONObject xff0c 需要导入JSON的JAVA支持包 json lib 2 3 jdk15 jar xff0c 同时需导入 JSON依赖包 commons logging 1 0 4 jar xff0c
  • 20个很有用的CSS技巧

    转载自 xff1a 20个很有用的CSS技巧 导语 xff1a 下面这几个 CSS 技巧你可能不知道 xff0c 1 彩色照片变黑白 xff0c 2 所有元素垂直居中 xff0c 3 禁用鼠标 xff0c 4 模糊文字 xff0c 小编学完
  • 「理解HTTP」之常见的状态码

    转载自 xff1a 理解HTTP 之常见的状态码 状态码的职责是当客户端向服务器端发送请求时 xff0c 描述返回请求结果 借助状态码 xff0c 用户可以知道服务器端是正常处理了请求 xff0c 还是出现了什么错误 RFC2616 定义的
  • jQuery UI的简单使用,轻松实现二级菜单

    jQuery UI 的API手册地址 xff1a http api jqueryui com jQuery UI 实现百叶窗效果 菜单 Tab导航 xff1b 最后组合 百叶窗效果 43 菜单 xff0c 实现二级菜单 案例如下 xff1a
  • Python爬虫实战:抓取并保存百度云资源(附代码)

    專 欄 王雨城 xff0c Python中文社区专栏作者 博客 xff1a http www jianshu com u 88ff70818bd1 寻找并分析百度云的转存api 首先你得有一个百度云盘的账号 xff0c 然后登录 xff0c
  • Android 系统禁止应用的某个弹框

    需求 xff1a 谷歌拼音输入法首次使用会弹出以下提示 xff0c 为了提高用户体验 xff0c 在系统层屏蔽此弹窗 这里以谷歌输入法首次使用为例 分析 xff1a 系统dialog的弹出都是集成Dialog java 所以我们先找到dia
  • mysql中的null值和空值区别

    转载自 xff1a 点击打开链接 标签 xff1a 笔记 mysql null 发表时间 xff1a 2014 06 06 23 46 作者 xff1a 出处 xff1a http jackyrong iteye com mysql中的nu
  • bootstrap-table的入门使用——从服务器获取数据

    参考 xff1a Bootstrap Table 查询 xff08 服务器端 xff09 刷新数据 这里需要使用 bootstrap table 插件 使用了CSS3loader显示加载过程 效果如下 xff1a index html lt
  • MySql中UTF8 和 GBK 编码中文字符长度问题

    转载自 xff1a MySql中UTF8 和 GBK 编码中文字符长度问题 MySql中UTF8 和 GBK 编码中文字符长度问题 出处 xff1a http blog csdn net 为什么要了解MySql中UTF8 和 GBK 编码中
  • PHP对表单提交特殊字符的过滤和处理

    转载自 xff1a PHP对表单提交特殊字符的过滤和处理 函数名 释义 介绍htmlspecialchars将与 单双引号 大于和小于号化成HTML格式 amp 转成 amp amp 34 转成 amp quot 39 转成 amp 039
  • ThinkPHP中数据库操作返回值总结

    转载自 xff1a ThinkPHP中数据库操作返回值总结 关键字 xff1a Thinkphp 返回值 数据库操作 select返回值 add返回值 setDec返回值 Thinkphp中的Think Model类提供了数据库的基本CUR
  • 基于 Token 的身份验证

    转载自 xff1a 基于 Token 的身份验证 最近了解下基于 Token 的身份验证 xff0c 跟大伙分享下 很多大型网站也都在用 xff0c 比如 Facebook xff0c Twitter xff0c Google 43 xff
  • 打造 Bootstrap Tags Input 同 Modal 结合的利器

    Boostrap Tags input 的使用 xff1a http bootstrap tagsinput github io bootstrap tagsinput examples Boostrap Tags Input 插件基于Bo