热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

jquery一个标签选择的实现请教请教

现在要做的就是最多可以选择三个标签,选中的标签要在“选择标签”那一栏里面显示。标签都是span元素,“选择标签”那一栏是个input。这个效果该怎么实现呢?请教jquery高手,谢谢~

现在要做的就是最多可以选择三个标签,选中的标签要在“选择标签”那一栏里面显示。

标签都是span元素,“选择标签”那一栏是个input。

这个效果该怎么实现呢?请教jquery高手 ,谢谢 ~

回复内容:

现在要做的就是最多可以选择三个标签,选中的标签要在“选择标签”那一栏里面显示。

标签都是span元素,“选择标签”那一栏是个input。

这个效果该怎么实现呢?请教jquery高手 ,谢谢 ~

假定你这些标签的数据都是从后端渲染的,那么就会有相应的id和值,假设页面渲染出来是这个效果

确定

公司运营 互联网营销 组织变革 招聘/激励 品牌公关 财务/法务

(function ($) { var $labels = $('#labels'); //标签栏 var $input = $('#input'); //输入框 var $certainBtn=$('#certainBtn'); //确定按钮 var data = {};//已选择的数据 var max = 3; //最多选择数目 var activeClass = 'btn-primary'; //选中的active样式 $labels.on('click', 'span', function () { var $this = $(this); var id = $this.data('id'); var value = $this.data('value'); var isSelected = $this.hasClass(activeClass);//是否被选中 //超过数目限制则不做处理 if (!isSelected && Object.keys(data).length >= max) { return; } isSelected ? delete data[id] : data[id] = value; $this.toggleClass(activeClass); renderInput(); }); $certainBtn.click(function () { console.log(data); }); function renderInput() { var values = []; for (var id in data) { values.push(data[id]); } $input.val(values.toString()); //with underscore //$input.val(_.values(data).toString()); } })(jQuery);

采用组件化的思想重新写一个

(function($){
    var labelChoose = {
        el: {
            $labels: $('#labels'),
            $input: $('#input'),
            $certainBtn: $('#certainBtn')
        },
        max: 3,
        data: {},
        activeClass: 'btn-primary',
        init: function (defaultData) {
            var self = this;
            this.renderInit(defaultData); //初始化
            this.el.$labels.on('click', 'span', function (e) {
                self.labelsClick(e);
            });
            this.el.$certainBtn.on('click', function (e) {
                self.certainClick(e);
            });
        },
        labelsClick: function (e) {
            var $this = $(e.currentTarget);
            var id = $this.data('id');
            var value = $this.data('value');
            var isSelected = $this.hasClass(this.activeClass);//是否被选中

            //超过数目限制则不做处理
            if (!isSelected && Object.keys(this.data).length >= this.max) {
                return;
            }

            isSelected ? delete this.data[id] : this.data[id] = value;
            $this.toggleClass(this.activeClass);
            this.renderInput();
        },
        renderLabels: function () {
            var self = this;
            this.el.$labels.find('span').each(function () {
                var $this = $(this);
                var id = $this.data('id');

                for (var idz in self.data) {
                    if (idz === id.toString()) {
                        $this.addClass(self.activeClass);
                    }
                }
            });
        },
        renderInput: function () {
            var values = [];
            for (var id in this.data) {
                values.push(this.data[id]);
            }
            //with underscore
            //this.el.$input.val(_.values(this.data).toString());
            this.el.$input.val(values.toString());
        },
        certainClick: function (e) {
            console.log(this.data);
        },
        renderInit: function (defaultData) {
            this.data = defaultData || {};
            this.renderLabels();
            this.renderInput();
        }
    };

    labelChoose.init({
        '1': '公司运营',
        '2': '互联网营销'
    });
})(jQuery);

由于涉及到数据操作和this绑定,和underscore结合起来使用会比较好点,以上代码仅供参考!

大概要做这么几件事:

1.定义显示被选中的标签的函数
2.在每个标签上设置点击事件

在每次点击标签的时候,把当前的this标签传到1的函数里,append到input的value里。

这种插件自己写的话会很麻烦 建议直接用插件去实现
给你说两个吧 都是我经常用到的:
select2 和 flatui(前端UI框架)

点进去看看文档稍有JQ基础都可以做出你想要的效果。

我再简单描述一下自己写代码要怎么实现:
input框里肯定是要有CSS和JS来控制的
span标签添加点击事件,点击后加个display:none的style(并不是删除 方便在input中点击移除后重新展现)。
假定span有个id叫sp1 input的id叫show,大概的思路是这样的:

$('#sp1').click(function(){
    $(this).css('display','none');
    //获取span中的值复制给input
    $('#show').val($(this).html());
})

span中的值赋值给input久做好了,但是如果在input点击后取消显示就有一些复杂了,你需要定制一些样式,最起码input中的值可以点击并且触发事件。我就说这么多,起到抛砖引玉的作用。

推荐阅读
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了解决IE678伪类不兼容问题的方法,包括少用CSS3和HTML5独有的属性,使用CSS hacker,使用last-child清除浮动、批量添加标签、去掉list item最后一个的border-right等技巧。同时还介绍了使用after清除浮动时加上IE独有属性zoom:1的处理方法。另外,本文还提到可以使用jQuery代替批量添加标签的功能,以及使用负边距和CSS2选择器element+element去掉list item最后一个的border-right的方法。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
author-avatar
电信他爹_186
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有