jQuery蒙面输入插件。 文本框获得焦点时选择所有内容

这是这个问题的后续问题:

在获得焦点时选择文本框的所有内容(Javascript或jQuery)

基本上我使用的文本框与jQuery蒙版输入插件一起使用(编辑:链接可能不再指向相关版本)

当蒙版输入文本框获得焦点时,我想选择该文本框的所有内容,但似乎将此插件绑定到文本框可以防止这种情况。 我只是想知道是否有办法解决这个问题。

下面是一个示例.html页面,演示了该问题:

      
$(function() { $("#masktest").mask("99/99/9999"); // Contents of textboxes will be selected when receiving focus. $("input[type=text]") .focus(function() { $(this).select(); }); });

我是jQuery的Masked Input Plugin的作者。 我决定这应该是已完成掩码的默认行为,我将其纳入最新版本。 你可以在这里阅读详细信息

嘿乔恩,不太确定这个的表现,但这应该有效:

  $(function() { // Contents of textboxes will be selected when receiving focus. $("input[type=text]") .focus(function() { var mask = "99/99/9999"; $(this).unmask(mask).select().mask(mask); }); }); 

它在FF3为我工作。

 $("input[type=text]").focus(function(e) { var that = this; setTimeout(function(){$(that).select();},10); return false; }); 

setTimeout将“排队”select()执行,我想知道: – Ok掩码函数完成你的工作然后我将选择内容。 那就是队列有用的地方。

只是一个想法。 我希望它按预期工作。

问题

焦点时删除Defaut值

解决:为mask.js文件添加了一些补丁代码(jquery.maskedinput-1.2.2.min.js)

 (function(a){var c=(a.browser.msie?"paste":"input")+".mask";var b=(window.orientation!=undefined);a.mask={definitions:{"9":"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"}};a.fn.extend({caret:function(e,f){if(this.length==0){return}if(typeof e=="number"){f=(typeof f=="number")?f:e;return this.each(function(){if(this.setSelectionRange){this.focus();this.setSelectionRange(e,f)}else{if(this.createTextRange){var g=this.createTextRange();g.collapse(true);g.moveEnd("character",f);g.moveStart("character",e);g.select()}}})}else{if(this[0].setSelectionRange){e=this[0].selectionStart;f=this[0].selectionEnd}else{if(document.selection&&document.selection.createRange){var d=document.selection.createRange();e=0-d.duplicate().moveStart("character",-100000);f=e+d.text.length}}return{begin:e,end:f}}},unmask:function(){return this.trigger("unmask")},mask:function(j,d){if(!j&&this.length>0){var f=a(this[0]);var g=f.data("tests");return a.map(f.data("buffer"),function(l,m){return g[m]?l:null}).join("")}d=a.extend({placeholder:"_",completed:null},d);var k=a.mask.definitions;var g=[];var e=j.length;var i=null;var h=j.length;a.each(j.split(""),function(m,l){if(l=="?"){h--;e=m}else{if(k[l]){g.push(new RegExp(k[l]));if(i==null){i=g.length-1}}else{g.push(null)}}});return this.each(function(){var ORJ=$(this).val();var r=a(this);var m=a.map(j.split(""),function(x,y){if(x!="?"){return k[x]?d.placeholder:x}});var n=false;var q=r.val();r.data("buffer",m).data("tests",g);function v(x){while(++x<=h&&!g[x]){}return x}function t(x){while(!g[x]&&--x>=0){}for(var y=x;y16&&z<32)||(z>32&&z<41));if((x.begin-x.end)!=0&&(!n||z==8||z==46)){w(x.begin,x.end)}if(z==8||z==46||(b&&z==127)){t(x.begin+(z==46?0:-1));return false}else{if(z==27){r.val(q);r.caret(0,p());return false}}}function o(B){if(n){n=false;return(B.keyCode==8)?false:null}B=B||window.event;var C=B.charCode||B.keyCode||B.which;var z=a(this).caret();if(B.ctrlKey||B.altKey||B.metaKey){return true}else{if((C>=32&&C<=125)||C>186){var x=v(z.begin-1);if(xz.length){break}}else{if(m[B]==z[x]&&B!=e){x++;C=B}}}if(!y&&C+1=e){s();if(!y){r.val(r.val().substring(0,C+1))}}}return(e?B:i)}if(!r.attr("readonly")){r.one("unmask",function(){r.unbind(".mask").removeData("buffer").removeData("tests")}).bind("focus.mask",function(){q=r.val();var x=p();s();setTimeout(function(){if(x==j.length){r.caret(0,x)}else{r.caret(x)}},0)}).bind("blur.mask",function(){p();if(r.val()!=q){r.change()}}).bind("keydown.mask",l).bind("keypress.mask",o).bind(c,function(){setTimeout(function(){r.caret(p(true))},0)})}p()})}})})(jQuery); 

如果您的“已完成”function不起作用,请尝试替换此行:

if (settings.completed && next == len)

(这是非压缩插件的第169行),其中:

if (settings.completed && eval(+next - 1) == len)

在使用带有firebug的插件时,我注意到,当最后一个掩码字符输入时,’next’变量会跳过符号。 这种方式应该有效。

我找到了比超时更好的解决方案。

您可以查看jquery.maskedinput.js:293有一个输入焦点函数,它只在没有“readonly”属性的输入上触发,因此:

$("input[type=text]").attr("readonly", true).select().removeAttr("readonly");

……就像那样。 奇迹般有效 ;)