现在要做的就是最多可以选择三个标签,选中的标签要在“选择标签”那一栏里面显示。
标签都是span元素,“选择标签”那一栏是个input。
这个效果该怎么实现呢?请教jquery高手 ,谢谢 ~
回复内容:
现在要做的就是最多可以选择三个标签,选中的标签要在“选择标签”那一栏里面显示。
标签都是span元素,“选择标签”那一栏是个input。
这个效果该怎么实现呢?请教jquery高手 ,谢谢 ~
假定你这些标签的数据都是从后端渲染的,那么就会有相应的id和值,假设页面渲染出来是这个效果
<code><div class="container"> <div class="input-group input-group-sm"> <input type="text" class="form-control" id="input" readonly> <span class="input-group-addon" id="certainBtn">确定</span> </div> <div class="btn-group btn-group-sm mt" id="labels"> <span type="button" class="btn btn-default" data-id="1" data-value="公司运营">公司运营</span> <span type="button" class="btn btn-default" data-id="2" data-value="互联网营销">互联网营销</span> <span type="button" class="btn btn-default" data-id="3" data-value="组织变革">组织变革</span> <span type="button" class="btn btn-default" data-id="4" data-value="招聘/激励">招聘/激励</span> <span type="button" class="btn btn-default" data-id="5" data-value="品牌公关">品牌公关</span> <span type="button" class="btn btn-default" data-id="6" data-value="财务/法务">财务/法务</span> </div> </div> (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); </code>
采用组件化的思想重新写一个
<code>(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); </code>
由于涉及到数据操作和this绑定,和underscore结合起来使用会比较好点,以上代码仅供参考!
大概要做这么几件事:
<code>1.定义显示被选中的标签的函数 2.在每个标签上设置点击事件 </code>
在每次点击标签的时候,把当前的this标签传到1的函数里,append到input的value里。
这种插件自己写的话会很麻烦 建议直接用插件去实现
给你说两个吧 都是我经常用到的:
select2 和 flatui(前端UI框架)
点进去看看文档稍有JQ基础都可以做出你想要的效果。
我再简单描述一下自己写代码要怎么实现:
input框里肯定是要有CSS和JS来控制的
span标签添加点击事件,点击后加个display:none
的style(并不是删除 方便在input中点击移除后重新展现)。
假定span有个id叫sp1 input的id叫show,大概的思路是这样的:
<code>$('#sp1').click(function(){ $(this).css('display','none'); //获取span中的值复制给input $('#show').val($(this).html()); }) </code>
span中的值赋值给input久做好了,但是如果在input点击后取消显示就有一些复杂了,你需要定制一些样式,最起码input中的值可以点击并且触发事件。我就说这么多,起到抛砖引玉的作用。

实现方法:1、用“$("img").delay(毫秒数).fadeOut()”语句,delay()设置延迟秒数;2、用“setTimeout(function(){ $("img").hide(); },毫秒值);”语句,通过定时器来延迟。

修改方法:1、用css()设置新样式,语法“$(元素).css("min-height","新值")”;2、用attr(),通过设置style属性来添加新样式,语法“$(元素).attr("style","min-height:新值")”。

区别:1、axios是一个异步请求框架,用于封装底层的XMLHttpRequest,而jquery是一个JavaScript库,只是顺便封装了dom操作;2、axios是基于承诺对象的,可以用承诺对象中的方法,而jquery不基于承诺对象。

增加元素的方法:1、用append(),语法“$("body").append(新元素)”,可向body内部的末尾处增加元素;2、用prepend(),语法“$("body").prepend(新元素)”,可向body内部的开始处增加元素。

在jquery中,apply()方法用于改变this指向,使用另一个对象替换当前对象,是应用某一对象的一个方法,语法为“apply(thisobj,[argarray])”;参数argarray表示的是以数组的形式进行传递。

删除方法:1、用empty(),语法“$("div").empty();”,可删除所有子节点和内容;2、用children()和remove(),语法“$("div").children().remove();”,只删除子元素,不删除内容。

去掉方法:1、用“$(selector).removeAttr("readonly")”语句删除readonly属性;2、用“$(selector).attr("readonly",false)”将readonly属性的值设置为false。

on()方法有4个参数:1、第一个参数不可省略,规定要从被选元素添加的一个或多个事件或命名空间;2、第二个参数可省略,规定元素的事件处理程序;3、第三个参数可省略,规定传递到函数的额外数据;4、第四个参数可省略,规定当事件发生时运行的函数。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver CS6
Visual web development tools

Dreamweaver Mac version
Visual web development tools

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Notepad++7.3.1
Easy-to-use and free code editor

Zend Studio 13.0.1
Powerful PHP integrated development environment
