首页 > 代码库 > 改造jQuery-Tagit 插件支持中文全角的逗号和空格
改造jQuery-Tagit 插件支持中文全角的逗号和空格
jQuery 的 tagit 插件效果还是不错的,今天用到该插件但发现不能自定义标签分隔符,只能是英文半角逗号或空格,于是想改造下
效果:
先研究了一番插件的代码,发现并不能通过插件自身的扩展方法来实现,
标签输入框是插件自己生成的,所以本来想在外部绑定 keydown 事件但由于事件绑定先后顺序的问题不能实现,只能修改代码了:
改动不多,主要是增加了三个事件绑定在插件原来的 keydown 事件之前绑定一个自定义的 keydown 以及 blur 事件处理标签内容的过滤,以及 keyup 后模拟键盘的半角逗号按键回调触发原来的 keydown 事件,从而不会太多改动插件代码,不妨碍以后升级
这里还有一个问题,涉及到 keydown、keypress、keyup 顺序和效率的问题,简单说说:keydown是指键盘开始往下按下,此时 input 控件并没有得到最终的按键字符,只有一个响应事件 keyCode,而且此时如果是用的中文输入法则 keyCode 始终都是 229,也就不能通过该事件来判断全角中文的输入字符了,但这个效率应该是很高的,处理效果会很流畅,keypress 也是差不多的
代码:
/* * jQuery UI Tag-it! * * @version v2.0 (06/2011) * * Copyright 2011, Levy Carneiro Jr. * Released under the MIT license. * http://aehlke.github.com/tag-it/LICENSE * * Homepage: * http://aehlke.github.com/tag-it/ * * Authors: * Levy Carneiro Jr. * Martin Rehfeld * Tobias Schmidt * Skylar Challand * Alex Ehlke * * Maintainer: * Alex Ehlke - Twitter: @aehlke * * Dependencies: * jQuery v1.4+ * jQuery UI v1.8+ */ (function($) { $.widget('ui.tagit', { options: { allowDuplicates : false, caseSensitive : true, fieldName : 'tags', placeholderText : null, // Sets `placeholder` attr on input field. readOnly : false, // Disables editing. removeConfirmation: false, // Require confirmation to remove tags. tagLimit : null, // Max number of tags allowed (null for unlimited). // Used for autocomplete, unless you override `autocomplete.source`. availableTags : [], // Use to override or add any options to the autocomplete widget. // // By default, autocomplete.source will map to availableTags, // unless overridden. autocomplete: {}, // Shows autocomplete before the user even types anything. showAutocompleteOnFocus: false, // When enabled, quotes are unneccesary for inputting multi-word tags. allowSpaces: false, // The below options are for using a single field instead of several // for our form values. // // When enabled, will use a single hidden field for the form, // rather than one per tag. It will delimit tags in the field // with singleFieldDelimiter. // // The easiest way to use singleField is to just instantiate tag-it // on an INPUT element, in which case singleField is automatically // set to true, and singleFieldNode is set to that element. This // way, you don't need to fiddle with these options. singleField: false, // This is just used when preloading data from the field, and for // populating the field with delimited tags as the user adds them. singleFieldDelimiter: ',', // Set this to an input DOM node to use an existing form field. // Any text in it will be erased on init. But it will be // populated with the text of tags as they are created, // delimited by singleFieldDelimiter. // // If this is not set, we create an input node for it, // with the name given in settings.fieldName. singleFieldNode: null, // Whether to animate tag removals or not. animate: true, // Optionally set a tabindex attribute on the input that gets // created for tag-it. tabIndex: null, // Event callbacks. beforeTagAdded : null, afterTagAdded : null, beforeTagRemoved : null, afterTagRemoved : null, onTagClicked : null, onTagLimitExceeded : null, // DEPRECATED: // // /!\ These event callbacks are deprecated and WILL BE REMOVED at some // point in the future. They're here for backwards-compatibility. // Use the above before/after event callbacks instead. onTagAdded : null, onTagRemoved: null, // `autocomplete.source` is the replacement for tagSource. tagSource: null // Do not use the above deprecated options. }, _create: function() { // for handling static scoping inside callbacks var that = this; // There are 2 kinds of DOM nodes this widget can be instantiated on: // 1. UL, OL, or some element containing either of these. // 2. INPUT, in which case 'singleField' is overridden to true, // a UL is created and the INPUT is hidden. if (this.element.is('input')) { this.tagList = $('<ul></ul>').insertAfter(this.element); this.options.singleField = true; this.options.singleFieldNode = this.element; this.element.addClass('tagit-hidden-field'); } else { this.tagList = this.element.find('ul, ol').andSelf().last(); } this.tagInput = $('<input type="text" />').addClass('ui-widget-content'); if (this.options.readOnly) this.tagInput.attr('disabled', 'disabled'); if (this.options.tabIndex) { this.tagInput.attr('tabindex', this.options.tabIndex); } if (this.options.placeholderText) { this.tagInput.attr('placeholder', this.options.placeholderText); } if (!this.options.autocomplete.source) { this.options.autocomplete.source = function(search, showChoices) { var filter = search.term.toLowerCase(); var choices = $.grep(this.options.availableTags, function(element) { // Only match autocomplete options that begin with the search term. // (Case insensitive.) return (element.toLowerCase().indexOf(filter) === 0); }); if (!this.options.allowDuplicates) { choices = this._subtractArray(choices, this.assignedTags()); } showChoices(choices); }; } if (this.options.showAutocompleteOnFocus) { this.tagInput.focus(function(event, ui) { that._showAutocomplete(); }); if (typeof this.options.autocomplete.minLength === 'undefined') { this.options.autocomplete.minLength = 0; } } // Bind autocomplete.source callback functions to this context. if ($.isFunction(this.options.autocomplete.source)) { this.options.autocomplete.source = $.proxy(this.options.autocomplete.source, this); } // DEPRECATED. if ($.isFunction(this.options.tagSource)) { this.options.tagSource = $.proxy(this.options.tagSource, this); } this.tagList .addClass('tagit') .addClass('ui-widget ui-widget-content ui-corner-all') // Create the input field. .append($('<li class="tagit-new"></li>').append(this.tagInput)) .click(function(e) { var target = $(e.target); if (target.hasClass('tagit-label')) { var tag = target.closest('.tagit-choice'); if (!tag.hasClass('removed')) { that._trigger('onTagClicked', e, {tag: tag, tagLabel: that.tagLabel(tag)}); } } else { // Sets the focus() to the input field, if the user // clicks anywhere inside the UL. This is needed // because the input field needs to be of a small size. that.tagInput.focus(); } }); // Single field support. var addedExistingFromSingleFieldNode = false; if (this.options.singleField) { if (this.options.singleFieldNode) { // Add existing tags from the input field. var node = $(this.options.singleFieldNode); var tags = node.val().split(this.options.singleFieldDelimiter); node.val(''); $.each(tags, function(index, tag) { that.createTag(tag, null, true); addedExistingFromSingleFieldNode = true; }); } else { // Create our single field input after our list. this.options.singleFieldNode = $('<input type="hidden" style="display:none;" value=http://www.mamicode.com/"" name="' + this.options.fieldName + '" />');>
使用方法很简单的就不多说了,下面是相关网址介绍:
https://github.com/aehlke/tag-it
需要配置 jQuery-ui 一起使用的:
http://jqueryui.com/download/
效果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。