任务目的
- 学习与实践JavaScript的基本语法、语言特性
- 练习使用JavaScript实现拖拽功能
任务描述
- 基于上个任务,将任务的代码进行抽象、封装,然后在此基础上实现如图中的两个需求:Tag输入和兴趣爱好输入
- 实现一个tag输入框
- 要求遇到用户输入空格,逗号,回车时,都自动把当前输入的内容作为一个tag放在输入框下面。
- Tag不能有重复的,遇到重复输入的Tag,自动忽视。
- 每个Tag请做trim处理
- 最多允许10个Tag,多于10个时,按照录入的先后顺序,把最前面的删掉
- 当鼠标悬停在tag上时,tag前增加删除二字,点击tag可删除
- 实现一个兴趣爱好输入的功能
- 通过一个Textarea进行兴趣爱好的输入,可以通过用回车,逗号(全角半角均可),顿号,空格(全角半角、Tab等均可)等符号作为间隔。
- 当点击“确认兴趣爱好”的按钮时,将textarea中的输入按照你设定的间隔符,拆解成一个个的爱好,显示在textarea下方
- 爱好不能重复,所以在下方呈现前,需要做一个去重
- 每个爱好内容需要做trim处理
- 最多允许10个兴趣爱好,多于10个时,按照录入的先后顺序,把最前面的删掉
整体思路
依然是按照要求首先写出HTML代码
<label>Tag: </label>
<input type="text" id="user_tag">
<div id="tags_wrap"></div>
<textarea id="hobby_input"></textarea>
<button id="hobby_btn">确认兴趣爱好</button>
<div id="hobby_wrap"></div>
然后给相应的元素绑定事件
function addHandler(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false);
}else if(element.attachEvent){
element.attachEvent("on" + type,handler);
}else{
element["on" + type] = handler;
}
}
function init(){
var tag = $("#user_tag");
var hobby_btn = $("#hobby_btn");
var tags_wrap = $("#tags_wrap");
var hobby_wrap = $("#hobby_wrap");
addHandler(tag,"keyup",addTag);
addHandler(hobby_btn,"click",addHobby);
}
init();
这里,我们用两个数组,分别用来保存Tag和Hobby。为了能够在添加Tag和Hobby时共用渲染数据函数,可以设置一个标志参数,用来标志是否需要添加点击删除事件
//渲染数据
function renderData(element,data,isDel){
var text = "";
for(var i=0;i<data.length;i++){
text += '<div>' + data[i] + '</div>';
}
element.innerHTML = text;
if(isDel){
tagsEvent();
}
}
然后根据题目要求,将添加Tag和Bobby函数写出来,其实就是对用户输入的数据进行检测和处理
//添加tag
function addTag(){
var value = $("#user_tag").value;
if(textCheck(value) || event.keyCode == 13){
value = value.trim().replace(/[,, ]/, '');
if(value){
if(!contains(tags,value)){
if(tags.length<10){
tags.push(value);
}else{
tags.shift();
tags.push(value);
}
}
$("#user_tag").value = "";
}
}
renderData(tags_wrap,tags,true);
}
//添加兴趣
function addHobby(){
var str_hobby = $("#hobby_input").value.trim();
if(str_hobby){
var hobbyWord = str_hobby.split(/[^0-9a-zA-Z\u4e00-\u9fa5]+/);
for(var i=0;i<hobbyWord.length;i++){
if(!contains(hobby,hobbyWord[i])){
if(hobby.length<10){
hobby.push(hobbyWord[i]);
}else{
hobby.shift();
hobby.push(hobbyWord[i]);
}
}
}
renderData(hobby_wrap,hobby,false);
$("#hobby_input").value = "";
}else{
alert("请输入兴趣");
}
}
最后只需把点击删除函数补充完整即可
//给每个tag添加mouse和click事件
function tagsEvent(){
var eles = tags_wrap.children;
for(var i=0;i<eles.length;i++){
eles[i].addEventListener("mouseover",function(e){
e.target.firstChild.insertData(0,'点击删除 ');
});
eles[i].addEventListener("mouseout",function(e){
e.target.firstChild.deleteData(0,4);
});
eles[i].addEventListener("click",function(e){
var node = e.target;
//获取当前div在数组中的索引
var index = [].indexOf.call(node.parentNode.children,node);
tags.splice(index,1);
//渲染数据
renderData(tags_wrap,tags,true);
});
}
}
最终代码
时间确实不够用,也没有对页面进行美美的修饰 有时间的话一定补上