本题的重点在于分清楚,什么时候才可以添加标签、移除标签,至于添加和移除标签,都是非常简单事情
相关键码值,回车键=13,删除键=8
1、当用户输入内容并敲回车键时,获取input框的值,清除两边空格,
1.1若为空,不创建标签,清除input框内容
1.2若有值,需要确定该值不与之前的标签值重复,若不重复,方可添加标签,而后清除input框内容
2.当用户敲删除键时,如果输入框当前没有内容,则删除前一个标签
var tagInput = { isInited: false, init: init, bindEvent: bindEvent, addTag: addTag, removeTag: removeTag }; tagInput.init(); // 函数作用:只调用一次bindEvent函数 function init() { var that = this; // this为tagInput if (that.isInited) return; that.isInited = true; // 请修改这一行代码,保存class为js-input的输入框的dom元素引用 that.input = document.querySelector('.js-input') that.bindEvent(); } function bindEvent() { var that = this; // this为tagInput var input = that.input; if (!input) return; input.addEventListener('keydown', function (event) { // 请修改这一行代码,判断用户是否按了回车键 var isEnter = event.keyCode === 13; // 请修改这一行代码,判断用户是否按了删除键 var isDelete = event.keyCode === 8; isEnter && event.preventDefault(); // 阻止默认事件,我觉得阻止删除键的默认事件影响体验感,这里删掉了 isEnter && that.addTag(); isDelete && that.removeTag(); }); input.parentNode.addEventListener('click', function () { input.focus(); }); } function addTag() { let inputValue = this.input.value let value = inputValue.trim() if (value == '') { this.input.value = '' return } let spans = document.querySelectorAll('.tag-input span') let spanContents = [].map.call(spans, item => item.innerText) if (spanContents.includes(value)) { this.input.value = '' return } let spanTag = document.createElement('span') spanTag.className = 'tag' spanTag.innerHTML = value this.input.before(spanTag) this.input.value = '' } function removeTag() { if (this.input.value != '') return this.input.previousElementSibling && this.input.previousElementSibling.remove() }