diff --git a/jquery.tag-editor.js b/jquery.tag-editor.js index 769b9a9..804acc2 100644 --- a/jquery.tag-editor.js +++ b/jquery.tag-editor.js @@ -243,7 +243,7 @@ var $t = $(this); // left/up key + backspace key on empty field - if ((e.which == 37 || !o.autocomplete && e.which == 38) && !$t.caret() || e.which == 8 && !$t.val()) { + if (o.keyboardEdit && ((e.which == 37 || !o.autocomplete && e.which == 38) && !$t.caret() || e.which == 8 && !$t.val())) { var prev_tag = $t.closest('li').prev('li').find('.tag-editor-tag'); if (prev_tag.length) prev_tag.click().find('input').caret(-1); else if ($t.val()) $(new_tag).insertBefore($t.closest('li')).find('.tag-editor-tag').click(); @@ -267,8 +267,8 @@ else { el.attr('disabled', 'disabled'); setTimeout(function(){ el.removeAttr('disabled'); }, 30); - return; - } + return; + } return false; // tab } else { @@ -280,7 +280,7 @@ } } // del key - else if (e.which == 46 && (!$.trim($t.val()) || ($t.caret() == $t.val().length))) { + else if (o.keyboardEdit && (e.which == 46 && (!$.trim($t.val()) || ($t.caret() == $t.val().length)))) { var next_tag = $t.closest('li').next('li').find('.tag-editor-tag'); if (next_tag.length) next_tag.click().find('input').caret(0); else if ($t.val()) ed.click(); @@ -292,9 +292,9 @@ return false; } // pos1 - else if (e.which == 36 && !$t.caret()) ed.find('.tag-editor-tag').first().click(); + else if (o.keyboardEdit && (e.which == 36 && !$t.caret())) ed.find('.tag-editor-tag').first().click(); // end - else if (e.which == 35 && $t.caret() == $t.val().length) ed.find('.tag-editor-tag').last().click(); + else if (o.keyboardEdit && (e.which == 35 && $t.caret() == $t.val().length)) ed.find('.tag-editor-tag').last().click(); // esc else if (e.which == 27) { $t.val($t.data('old_tag') ? $t.data('old_tag') : '').blur(); @@ -329,6 +329,7 @@ placeholder: '', forceLowercase: true, clickDelete: false, + keyboardEdit: true, sortable: true, // jQuery UI sortable autocomplete: null, // options dict for jQuery UI autocomplete diff --git a/jquery.tag-editor.min.js b/jquery.tag-editor.min.js index e8f1761..faadf86 100644 --- a/jquery.tag-editor.min.js +++ b/jquery.tag-editor.min.js @@ -1,3 +1,3 @@ // jQuery tagEditor v1.0.14 // https://github.com/Pixabay/jQuery-tagEditor -!function(t){t.fn.tagEditorInput=function(){var e=" ",i=t(this),a=parseInt(i.css("fontSize")),r=t("").css({position:"absolute",top:-9999,left:-9999,width:"auto",fontSize:i.css("fontSize"),fontFamily:i.css("fontFamily"),fontWeight:i.css("fontWeight"),letterSpacing:i.css("letterSpacing"),whiteSpace:"nowrap"}),l=function(){if(e!==(e=i.val())){r.html(e.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"));var t=r.width()+a;20>t&&(t=20),t!=i.width()&&i.width(t)}};return r.insertAfter(i),i.bind("keyup keydown focus",l)},t.fn.tagEditor=function(e,a,r){function l(e){if(8==e.which||46==e.which||e.ctrlKey&&88==e.which){try{var a=getSelection(),r=t(a.getRangeAt(0).commonAncestorContainer)}catch(e){r=0}if(r&&r.hasClass("tag-editor")){var l=[],n=a.toString().split(r.prev().data("options").dregex);for(i=0;i
 '+l.delimiter[0]+'
').appendTo(n).find(".tag-editor-tag").html('').addClass("active").find("input").val(a).blur(),r?t(".placeholder",n).remove():n.click()):"removeTag"==e?(t(".tag-editor-tag",n).filter(function(){return t(this).html()==a}).closest("li").find(".tag-editor-delete").click(),r||n.click()):"destroy"==e&&i.removeClass("tag-editor-hidden-src").removeData("options").off("focus.tag-editor").next(".tag-editor").remove()}),"getTags"==e?s:this}return window.getSelection&&t(document).off("keydown.tag-editor").on("keydown.tag-editor",l),c.each(function(){function e(){!o.placeholder||c.length||t(".deleted, .placeholder, input",s).length||s.append('
  • '+o.placeholder+"
  • ")}function a(i){var a=c.toString();c=t(".tag-editor-tag:not(.deleted)",s).map(function(e,i){var a=t.trim(t(this).hasClass("active")?t(this).find("input").val():t(i).text());return a?a:void 0}).get(),s.data("tags",c),l.val(c.join(o.delimiter[0])),i||a!=c.toString()&&o.onChange(l,s,c),e()}function r(e){var r=e.closest("li"),n=e.val().replace(/ +/," ").split(o.dregex),d=e.data("old_tag"),g=c.slice(0);for(i=0;i
     '+o.delimiter[0]+'
    '+u+'
    '));e.attr("maxlength",o.maxLength).removeData("old_tag").val("").focus(),a()}var l=t(this),c=[],s=t("
      ').insertAfter(l);l.addClass("tag-editor-hidden-src").data("options",o).on("focus.tag-editor",function(){s.click()}),s.append('
    •  
    • ');var d='
    •  '+o.delimiter[0]+'
    • ';s.click(function(e,i){var a,r,l=99999;if(!window.getSelection||""==getSelection())return n=!0,t("input:focus",s).blur(),n?(n=!0,t(".placeholder",s).remove(),i&&i.length?r="before":t(".tag-editor-tag",s).each(function(){var n=t(this),o=n.offset(),c=o.left,s=o.top;e.pageY>=s&&e.pageY<=s+n.height()&&(e.pageXa&&(l=a,i=n))}),"before"==r?t(d).insertBefore(i.closest("li")).find(".tag-editor-tag").click():"after"==r?t(d).insertAfter(i.closest("li")).find(".tag-editor-tag").click():t(d).appendTo(s).find(".tag-editor-tag").click(),!1):!1}),s.on("click",".tag-editor-delete",function(i){if(t(this).prev().hasClass("active"))return t(this).closest("li").find("input").caret(-1),!1;var r=t(this).closest("li"),n=r.find(".tag-editor-tag");return o.beforeTagDelete(l,s,c,n.html())===!1?!1:(n.addClass("deleted").animate({width:0},175,function(){r.remove(),e()}),a(),!1)}),o.clickDelete&&s.on("mousedown",".tag-editor-tag",function(i){if(i.ctrlKey||i.which>1){var r=t(this).closest("li"),n=r.find(".tag-editor-tag");return o.beforeTagDelete(l,s,c,n.html())===!1?!1:(n.addClass("deleted").animate({width:0},175,function(){r.remove(),e()}),a(),!1)}}),s.on("click",".tag-editor-tag",function(e){if(o.clickDelete&&(e.ctrlKey||e.which>1))return!1;if(!t(this).hasClass("active")){var i=t(this).html(),a=Math.abs((t(this).offset().left-e.pageX)/t(this).width()),r=parseInt(i.length*a),l=t(this).html('').addClass("active").find("input");if(l.data("old_tag",i).tagEditorInput().focus().caret(r),o.autocomplete){var n=t.extend({},o.autocomplete),c="select"in n?o.autocomplete.select:"";n.select=function(e,i){c&&c(e,i),setTimeout(function(){s.trigger("click",[t(".active",s).find("input").closest("li").next("li").find(".tag-editor-tag")])},20)},l.autocomplete(n)}}return!1}),s.on("blur","input",function(i){var d=t(this),g=d.data("old_tag"),f=t.trim(d.val().replace(/ +/," ").replace(o.dregex,o.delimiter[0]));if(f){if(f.indexOf(o.delimiter[0])>=0)return void r(d);f!=g&&(o.forceLowercase&&(f=f.toLowerCase()),f=o.beforeTagSave(l,s,c,g,f)||f,t(".tag-editor-tag:not(.active)",s).each(function(){t(this).html()==f&&t(this).closest("li").remove()}))}else{if(g&&o.beforeTagDelete(l,s,c,g)===!1)return d.val(g).focus(),n=!1,void a();try{d.closest("li").remove()}catch(i){}g&&a()}d.parent().html(f).removeClass("active"),f!=g&&a(),e()});var g;s.on("paste","input",function(e){t(this).removeAttr("maxlength"),g=t(this),setTimeout(function(){r(g)},30)});var f;s.on("keypress","input",function(e){o.delimiter.indexOf(String.fromCharCode(e.which))>=0&&(f=t(this),setTimeout(function(){r(f)},20))}),s.on("keydown","input",function(e){var i=t(this);if((37==e.which||!o.autocomplete&&38==e.which)&&!i.caret()||8==e.which&&!i.val()){var a=i.closest("li").prev("li").find(".tag-editor-tag");return a.length?a.click().find("input").caret(-1):i.val()&&t(d).insertBefore(i.closest("li")).find(".tag-editor-tag").click(),!1}if((39==e.which||!o.autocomplete&&40==e.which)&&i.caret()==i.val().length){var r=i.closest("li").next("li").find(".tag-editor-tag");return r.length?r.click().find("input").caret(0):i.val()&&s.click(),!1}if(9==e.which){if(e.shiftKey){var a=i.closest("li").prev("li").find(".tag-editor-tag");if(a.length)a.click().find("input").caret(0);else{if(!i.val())return l.attr("disabled","disabled"),void setTimeout(function(){l.removeAttr("disabled")},30);t(d).insertBefore(i.closest("li")).find(".tag-editor-tag").click()}return!1}var r=i.closest("li").next("li").find(".tag-editor-tag");if(r.length)r.click().find("input").caret(0);else{if(!i.val())return;s.click()}return!1}if(!(46!=e.which||t.trim(i.val())&&i.caret()!=i.val().length)){var r=i.closest("li").next("li").find(".tag-editor-tag");return r.length?r.click().find("input").caret(0):i.val()&&s.click(),!1}if(13==e.which)return s.trigger("click",[i.closest("li").next("li").find(".tag-editor-tag")]),!1;if(36!=e.which||i.caret()){if(35==e.which&&i.caret()==i.val().length)s.find(".tag-editor-tag").last().click();else if(27==e.which)return i.val(i.data("old_tag")?i.data("old_tag"):"").blur(),!1}else s.find(".tag-editor-tag").first().click()});var h=o.initialTags.length?o.initialTags:l.val().split(o.dregex);for(i=0;i
       '+o.delimiter[0]+'
      '+u+'
      '))}a(!0),o.sortable&&t.fn.sortable&&s.sortable({distance:5,cancel:".tag-editor-spacer, input",helper:"clone",update:function(){a()}})})},t.fn.tagEditor.defaults={initialTags:[],maxLength:50,delimiter:",;",placeholder:"",forceLowercase:!0,clickDelete:!1,sortable:!0,autocomplete:null,onChange:function(){},beforeTagSave:function(){},beforeTagDelete:function(){}}}(jQuery); \ No newline at end of file +(function(a){a.fn.tagEditorInput=function(){var c=" ",f=a(this),g=parseInt(f.css("fontSize")),b=a("").css({position:"absolute",top:-9999,left:-9999,width:"auto",fontSize:f.css("fontSize"),fontFamily:f.css("fontFamily"),fontWeight:f.css("fontWeight"),letterSpacing:f.css("letterSpacing"),whiteSpace:"nowrap"}),d=function(){if(c!==(c=f.val())){b.html(c.replace(/&/g,"&").replace(/\s/g," ").replace(//g,">"));var e=b.width()+g;20>e&&(e=20),e!=f.width()&&f.width(e)}};return b.insertAfter(f),f.bind("keyup keydown focus",d)};a.fn.tagEditor=function(d,j,h){var g,f=a.extend({},a.fn.tagEditor.defaults,d),b=this;f.dregex=new RegExp("["+f.delimiter.replace("-","-")+"]","g");if(typeof d=="string"){var c=[];b.each(function(){var l=a(this),m=l.data("options"),k=l.next(".tag-editor");if(d=="getTags"){c.push({field:l[0],editor:k,tags:k.data("tags")})}else{if(d=="addTag"){a('
    •  '+m.delimiter[0]+'
    • ').appendTo(k).find(".tag-editor-tag").html('').addClass("active").find("input").val(j).blur();if(!h){k.click()}else{a(".placeholder",k).remove()}}else{if(d=="removeTag"){a(".tag-editor-tag",k).filter(function(){return a(this).html()==j}).closest("li").find(".tag-editor-delete").click();if(!h){k.click()}}else{if(d=="destroy"){l.removeClass("tag-editor-hidden-src").removeData("options").off("focus.tag-editor").next(".tag-editor").remove()}}}}});return d=="getTags"?c:this}function e(p){if(p.which==8||p.which==46||p.ctrlKey&&p.which==88){try{var n=getSelection(),m=a(n.getRangeAt(0).commonAncestorContainer)}catch(p){m=0}if(m&&m.hasClass("tag-editor")){var l=[],o=n.toString().split(m.prev().data("options").dregex);for(i=0;i').insertAfter(l);l.addClass("tag-editor-hidden-src").data("options",f).on("focus.tag-editor",function(){p.click()});p.append('
    •  
    • ');var n='
    •  '+f.delimiter[0]+'
    • ';function m(){if(f.placeholder&&!s.length&&!a(".deleted, .placeholder, input",p).length){p.append('
    • '+f.placeholder+"
    • ")}}function r(w){var v=s.toString();s=a(".tag-editor-tag:not(.deleted)",p).map(function(x,y){var z=a.trim(a(this).hasClass("active")?a(this).find("input").val():a(y).text());if(z){return z}}).get();p.data("tags",s);l.val(s.join(f.delimiter[0]));if(!w){if(v!=s.toString()){f.onChange(l,p,s)}}m()}p.click(function(w,v){var z,y=99999,x;if(window.getSelection&&getSelection()!=""){return}g=true;a("input:focus",p).blur();if(!g){return false}g=true;a(".placeholder",p).remove();if(v&&v.length){x="before"}else{a(".tag-editor-tag",p).each(function(){var A=a(this),D=A.offset(),C=D.left,B=D.top;if(w.pageY>=B&&w.pageY<=B+A.height()){if(w.pageX1){var w=a(this).closest("li"),v=w.find(".tag-editor-tag");if(f.beforeTagDelete(l,p,s,v.html())===false){return false}v.addClass("deleted").animate({width:0},175,function(){w.remove();m()});r();return false}})}p.on("click",".tag-editor-tag",function(B){if(f.clickDelete&&(B.ctrlKey||B.which>1)){return false}if(!a(this).hasClass("active")){var x=a(this).html();var A=Math.abs((a(this).offset().left-B.pageX)/a(this).width()),w=parseInt(x.length*A),y=a(this).html('').addClass("active").find("input");y.data("old_tag",x).tagEditorInput().focus().caret(w);if(f.autocomplete){var z=a.extend({},f.autocomplete);var v="select" in z?f.autocomplete.select:"";z.select=function(D,C){if(v){v(D,C)}setTimeout(function(){p.trigger("click",[a(".active",p).find("input").closest("li").next("li").find(".tag-editor-tag")])},20)};y.autocomplete(z)}}return false});function k(x){var v=x.closest("li"),z=x.val().replace(/ +/," ").split(f.dregex),y=x.data("old_tag");var w=s.slice(0);for(i=0;i
       '+f.delimiter[0]+'
      '+t+'
      ')}}x.attr("maxlength",f.maxLength).removeData("old_tag").val("").focus();r()}p.on("blur","input",function(y){var w=a(this),x=w.data("old_tag"),v=a.trim(w.val().replace(/ +/," ").replace(f.dregex,f.delimiter[0]));if(!v){if(x&&f.beforeTagDelete(l,p,s,x)===false){w.val(x).focus();g=false;r();return}try{w.closest("li").remove()}catch(y){}if(x){r()}}else{if(v.indexOf(f.delimiter[0])>=0){k(w);return}else{if(v!=x){if(f.forceLowercase){v=v.toLowerCase()}v=f.beforeTagSave(l,p,s,x,v)||v;a(".tag-editor-tag:not(.active)",p).each(function(){if(a(this).html()==v){a(this).closest("li").remove()}})}}}w.parent().html(v).removeClass("active");if(v!=x){r()}m()});var o;p.on("paste","input",function(v){a(this).removeAttr("maxlength");o=a(this);setTimeout(function(){k(o)},30)});var q;p.on("keypress","input",function(v){if(f.delimiter.indexOf(String.fromCharCode(v.which))>=0){q=a(this);setTimeout(function(){k(q)},20)}});p.on("keydown","input",function(v){var y=a(this);if(f.keyboardEdit&&((v.which==37||!f.autocomplete&&v.which==38)&&!y.caret()||v.which==8&&!y.val())){var x=y.closest("li").prev("li").find(".tag-editor-tag");if(x.length){x.click().find("input").caret(-1)}else{if(y.val()){a(n).insertBefore(y.closest("li")).find(".tag-editor-tag").click()}}return false}else{if((v.which==39||!f.autocomplete&&v.which==40)&&(y.caret()==y.val().length)){var w=y.closest("li").next("li").find(".tag-editor-tag");if(w.length){w.click().find("input").caret(0)}else{if(y.val()){p.click()}}return false}else{if(v.which==9){if(v.shiftKey){var x=y.closest("li").prev("li").find(".tag-editor-tag");if(x.length){x.click().find("input").caret(0)}else{if(y.val()){a(n).insertBefore(y.closest("li")).find(".tag-editor-tag").click()}else{l.attr("disabled","disabled");setTimeout(function(){l.removeAttr("disabled")},30);return}}return false}else{var w=y.closest("li").next("li").find(".tag-editor-tag");if(w.length){w.click().find("input").caret(0)}else{if(y.val()){p.click()}else{return}}return false}}else{if(f.keyboardEdit&&(v.which==46&&(!a.trim(y.val())||(y.caret()==y.val().length)))){var w=y.closest("li").next("li").find(".tag-editor-tag");if(w.length){w.click().find("input").caret(0)}else{if(y.val()){p.click()}}return false}else{if(v.which==13){p.trigger("click",[y.closest("li").next("li").find(".tag-editor-tag")]);return false}else{if(f.keyboardEdit&&(v.which==36&&!y.caret())){p.find(".tag-editor-tag").first().click()}else{if(f.keyboardEdit&&(v.which==35&&y.caret()==y.val().length)){p.find(".tag-editor-tag").last().click()}else{if(v.which==27){y.val(y.data("old_tag")?y.data("old_tag"):"").blur();return false}}}}}}}}});var u=f.initialTags.length?f.initialTags:l.val().split(f.dregex);for(i=0;i
       '+f.delimiter[0]+'
      '+t+'
      ')}}r(true);if(f.sortable&&a.fn.sortable){p.sortable({distance:5,cancel:".tag-editor-spacer, input",helper:"clone",update:function(){r()}})}})};a.fn.tagEditor.defaults={initialTags:[],maxLength:50,delimiter:",;",placeholder:"",forceLowercase:true,clickDelete:false,keyboardEdit:true,sortable:true,autocomplete:null,onChange:function(){},beforeTagSave:function(){},beforeTagDelete:function(){}}}(jQuery)); \ No newline at end of file