рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде WEB рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рджрд╢рдорд▓рд╡ рд╡рд┐рднрд╛рдЬрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ: рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреНрд╖реЗрддреНрд░ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рд╡рд░реНрдг, рд╕рдВрдЦреНрдпрд╛ рдФрд░ "-" рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдирд┐рд╖рд┐рджреНрдз рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЛрд╖ рд╣реИ: рдЬрдм рдХрдИ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреАрдкреИрдб рдкрд░ рджрд╢рдорд▓рд╡ рд╡рд┐рднрд╛рдЬрдХ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдгреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдорд╛рдирдХ Ext.form.field.Number рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдШрдЯрдХ рдореЗрдВ
рдЕрдХреНрд╖рдордХрдлрд╝рд┐рд▓реНрдЯрд░ рдЧреБрдг рд╣реИ, рдЬреЛ рдЗрдирдкреБрдЯ рд╡рд░реНрдгреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдФрд░ Ext.form.field.Text рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕реНрд░реЛрдд рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрд▓реНрд▓реЗрдЦ initEvents рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдлрд╝рд┐рд▓реНрдЯрд░рдХреЗрдпрд░ рд╣реИрдВрдбрд▓рд░ рдХреАрдк рдЗрд╡реЗрдВрдЯ рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рд╣рдо рдкрд╛рда рд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдХреНрд╖реЗрддреНрд░ рддрдХ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдЪрд▓реЗрдВрдЧреЗ" рдФрд░ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдП рдЧрдП рдлрд╝рд┐рд▓реНрдЯрд░рдХреЗрдп рд╡рд┐рдзрд┐ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреБрдЫ рднреА рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдкрд╛рдП рдЧрдП рдХреЛ рдЪреБрдиреЗрдВрдЧреЗред рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ: рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдЪрд░рд┐рддреНрд░ рдХреА рдЬрд╛рдВрдЪ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдШрдЯрдХ рдХреЛ
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рд╕рдВрдЦреНрдпрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ
рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдорд╛рд╕реНрдХрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЗрд╕ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЕрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд╕рдВрдЦреНрдпрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕реНрд░реЛрдд рдФрд░ initComponent () рд╡рд┐рдзрд┐ рдореЗрдВ рдЪрдврд╝рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:
if (me.disableKeyFilter !== true) { allowed = me.baseChars + ''; if (me.allowDecimals) { allowed += me.decimalSeparator; } if (me.minValue < 0) { allowed += '-'; } allowed = Ext.String.escapeRegex(allowed); me.maskRe = new RegExp('[' + allowed + ']'); if (me.autoStripChars) { me.stripCharsRe = new RegExp('[^' + allowed + ']', 'gi'); } }
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдЬрд╛рдирдмреВрдЭрдХрд░ рдмрдВрдж рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдШрдЯрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рдЖрдк рдорд╛рд╕реНрдХ рдмрдирд╛рддрд╛ рд╣реИред рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЗрдирдкреБрдЯ рд╡рд░реНрдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП 'ред-0123456789'ред рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдВрдкреВрд░реНрдг рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИред
рдкреНрд▓рдЧрдЗрди рдЦрд╛рд▓реА
рдХреМрди рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреИрд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ,
рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред
Ext.define('Ext.plugin.form.field.NumberInputFilter', { alias : 'plugin.numberinputfilter', extend : 'Ext.AbstractPlugin', init : function(field) { // , if (!(field && field.isXType('numberfield'))) { return; } Ext.apply(field, { // , // Ext.form.field.Text filterKeys : function(e){ if (e.ctrlKey && !e.altKey) { return; } var key = e.getKey(), charCode = String.fromCharCode(e.getCharCode()); if(Ext.isGecko && (e.isNavKeyPress() || key === e.BACKSPACE || (key === e.DELETE && e.button === -1))){ return; } if(!Ext.isGecko && e.isSpecialKey() && !charCode){ return; } if(!this.maskRe.test(charCode)){ e.stopEvent(); } } }); } });
рджрд╢рдорд▓рд╡ рд╡рд┐рднрд╛рдЬрдХ
рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕рдмрд╕реЗ рдЖрдо рд╕реАрдорд╛рдВрдХрдХ рдЕрд╡рдзрд┐ "рд╣реИрдВред" рдФрд░ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо ",", рдЗрд╕рд▓рд┐рдП рдпреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реАрдорд╛рдВрдХрдХ рд╣реЛрдВрдЧреЗред рдЪрд▓реЛ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдЕрдиреБрдордд рдбреАрдбрд┐рдорд▓рд╕реНрдореИрдкрд░реНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЛ рдЗрд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╕рд╛рде рд╣реА рд╕реНрд╡рдпрдВ рдлрд╝рд┐рд▓реНрдЯрд░рдХреЗрдп () рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгред
Ext.define('Ext.plugin.form.field.NumberInputFilter', { alias : 'plugin.numberinputfilter', extend : 'Ext.AbstractPlugin', constructor : function(cfg) { cfg = cfg || {}; // Ext.applyIf(cfg, { allowedDecimalSeparators : ',.' }); Ext.apply(this, cfg); }, init : function(field) { // , if (!(field && field.isXType('numberfield'))) { return; } Ext.apply(field, { // filterKeys : function(e){ if (e.ctrlKey && !e.altKey) { return; } var key = e.getKey(), charCode = String.fromCharCode(e.getCharCode()); if(Ext.isGecko && (e.isNavKeyPress() || key === e.BACKSPACE || (key === e.DELETE && e.button === -1))){ return; } if(!Ext.isGecko && e.isSpecialKey() && !charCode){ return; } // begin hack if (charCode != this.decimalSeparator && this.allowedDecimalSeparators.indexOf(charCode) != -1) { // , // , // charCode = this.decimalSeparator; if (Ext.isIE) { // IE e.browserEvent.keyCode = charCode.charCodeAt(0); } else if (Ext.isGecko) { // gecko- e.stopEvent(); // var newEvent = document.createEvent('KeyEvents'); // , // .. , // newEvent.initKeyEvent( e.browserEvent.type, e.browserEvent.bubbles, true, //cancellable e.browserEvent.view, e.browserEvent.ctrlKey, e.browserEvent.altKey, e.browserEvent.shiftKey, e.browserEvent.metaKey, 0, // keyCode charCode.charCodeAt(0) // charCode ); e.getTarget().dispatchEvent(newEvent); // , . return; } else if (Ext.isWebKit) { // e.stopEvent(); // webkit initKeyboardEvent , TextEvent if (this.maskRe.test(charCode)) { var newEvent = document.createEvent('TextEvent'); newEvent.initTextEvent( 'textInput', e.browserEvent.bubbles, true, e.browserEvent.view, charCode ); e.getTarget().dispatchEvent(newEvent); } return; } } // end hack if(!this.maskRe.test(charCode)){ e.stopEvent(); } } }); } });
рдЕрдм рдХрд┐рд╕реА рднреА рд╕рдорд░реНрдерд┐рдд рд╡рд┐рднрд╛рдЬрдХ рдХреЛ рд╕рд╣реА рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрд╣рд╛рдБ рдФрд░ рдЬрд╣рд╛рдБ рдЖрдк рдЪрд╛рд╣реЗрдВ, рдкрд░рд┐рд╕реАрдорди рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдареАрдХ рдХрд░реЛред
рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЫрджреНрдо рдореБрдЦреМрдЯрд╛ рд╕рдорд░реНрдерди
рдЫрджреНрдо рдореБрдЦреМрдЯрд╛ рд╕рдорд░реНрдерди рд╕реЗ, рд╣рдорд╛рд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдЕрдорд╛рдиреНрдп рдЪрд░рд┐рддреНрд░, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рд╡реИрдз рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдЗрдирд╕ рд╕рд╛рдЗрди "-" рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХрдИ рджрд╢рдорд▓рд╡ рд╡рд┐рднрд╛рдЬрдХ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЪрд░рд┐рддреНрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдирдкреБрдЯ рдорд╛рд╕реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдФрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдлрд╝реАрд▓реНрдб рдореЗрдВ рдПрдХ рдФрд░ рдЪреЗрдХрд╡реИрд▓реНрдпреВ () рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдЬреЛ рдирд╡рдкреНрд░рд╡реЗрд╢рд┐рдд рдЪрд░рд┐рддреНрд░ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдЧрд╛ рдФрд░ рдЫрджреНрдо рдореБрдЦреМрдЯрд╛ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ред
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдХреЗ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ "рд╡рд┐рднрд╛рдЬрдХ" рдФрд░ "рдмрд╛рдж рдореЗрдВ" рджрд╢рдорд▓рд╡ рд╡рд┐рднрд╛рдЬрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рд╣рдо рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ:
checkValue : function(newChar) { // input var raw = this.getRawValue(); if (Ext.isEmpty(raw)) { // , : // - // - "-", // - return (newChar == this.decimalSeparator || (this.minValue < 0) && newChar == '-') || /^\d$/.test(newChar); } // ,... if (raw.length == this.maxLength) { // ... return false; } if (newChar == this.decimalSeparator && (!this.allowDecimals || raw.indexOf(this.decimalSeparator) != -1)) { // ... , , // return false; } // raw += newChar; raw = raw.split(new RegExp(Ext.String.escapeRegex(this.decimalSeparator))); return (!raw[0] || this.intRe.test(raw[0])) && (!raw[1] || this.decRe.test(raw[1])); }
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рд╣реИ, intRe рдФрд░ decRe рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рдпреЗ рдХреНрд░рдорд╢рдГ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рднрд┐рдиреНрдирд╛рддреНрдордХ рднрд╛рдЧреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВ, рдЬреЛ рдХрд┐ рддрдм рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА рдЬрдм рдкреНрд▓рдЧрдЗрди рдЕрджреНрдпрддрди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИрд╕реБрд╡рд┐рдзрд╛рдПрдБ () рд╡рд┐рдзрд┐ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред
// decimalPrecision // updateDecimalPrecision : function(prec, force) { if (prec == this.decimalPrecision && force !== true) { return; } if (!Ext.isNumber(prec) || prec < 1) { // , this.allowDecimals = false; } else { this.decimalPrecision = prec; } // var intRe = '^'; if (this.minValue < 0) { intRe += '-?'; } // integerPrecision - decimalPrecision , // intRe += '\\d' + (Ext.isNumber(this.integerPrecision) ? '{1,' + this.integerPrecision + '}' : '+') + '$'; this.intRe = new RegExp(intRe); if (this.allowDecimals) { // this.decRe = new RegExp('^\\d{1,' + this.decimalPrecision + '}$'); } else { delete this.decRe; } }
рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд▓рдЧрдЗрди рдХреЗ рдЗрдирд┐рдЯ () рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд▓рдЧ-рдЗрди рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреБрдЫ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди, рджрд╢рдорд▓рд╡ рдХрд╛ рд╡рд╣ рднрд╛рдЧ рдЬреЛ рдЗрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдЕрдВрдХреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдШреЗрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдХреЗ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд╛рда рдХреЗ рдЪрдпрдирд┐рдд рднрд╛рдЧ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рдХрд░ CheckValue () рдХреЛрдб рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдирддреАрдЬрддрди, рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛
checkValue : function(newChar) { // input var raw = this.getRawValue(); // dom- var el = this.inputEl.dom; // var start = getSelectionStart(el); var end = getSelectionEnd(el); if (start != end) { // raw = raw.substring(0, start) + raw.substring(end); } if (Ext.isEmpty(raw)) { // , : // - // - "-", // - return (newChar == this.decimalSeparator || (this.minValue < 0) && newChar == '-') || /^\d$/.test(newChar); } // ,... if (raw.length == this.maxLength) { // ... return false; } if (newChar == this.decimalSeparator && (!this.allowDecimals || raw.indexOf(this.decimalSeparator) != -1)) { // ... , , // return false; } // raw = raw.substring(0, start) + newChar + raw.substring(start); raw = raw.split(new RegExp(Ext.String.escapeRegex(this.decimalSeparator))); return (!raw[0] || this.intRe.test(raw[0])) && (!raw[1] || this.decRe.test(raw[1])); }
рд╡рд╣ рд╕рдм рд╣реИред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдкреНрд▓рдЧрдЗрди рдФрд░ рдПрдХ рдбреЗрдореЛ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВред
Ext.define('Ext.plugin.form.field.NumberInputFilter', { alias: 'plugin.numberinputfilter', extend: 'Ext.AbstractPlugin', constructor : function(cfg) { cfg = cfg || {}; Ext.applyIf(cfg, { allowedDecimalSeparators : ',.' }); Ext.apply(this, cfg); }, init : function(field) { if (!(field && field.isXType('numberfield'))) { return; } Ext.apply(field, { allowedDecimalSeparators : this.allowedDecimalSeparators, checkValue : function(newChar) { var raw = this.getRawValue(); var el = this.inputEl.dom; // http://javascript.nwbox.com/cursor_position/ // cursor.js var start = getSelectionStart(el); var end = getSelectionEnd(el); if (start != end) { // raw = raw.substring(0, start) + raw.substring(end); } if (Ext.isEmpty(raw)) { return (newChar == this.decimalSeparator || (this.minValue < 0) && newChar == '-') || /^\d$/.test(newChar); } if (raw.length == this.maxLength) { return false; } if (newChar == this.decimalSeparator && (!this.allowDecimals || raw.indexOf(this.decimalSeparator) != -1)) { return false; } // raw = raw.substring(0, start) + newChar + raw.substring(start); raw = raw.split(new RegExp(Ext.String.escapeRegex(this.decimalSeparator))); return (!raw[0] || this.intRe.test(raw[0])) && (!raw[1] || this.decRe.test(raw[1])); }, filterKeys : function(e){ if (e.ctrlKey && !e.altKey) { return; } var key = e.getKey(), charCode = String.fromCharCode(e.getCharCode()); if(Ext.isGecko && (e.isNavKeyPress() || key === e.BACKSPACE || (key === e.DELETE && e.button === -1))){ return; } if(!Ext.isGecko && e.isSpecialKey() && !charCode){ return; } // begin hack if (charCode != this.decimalSeparator && this.allowedDecimalSeparators.indexOf(charCode) != -1) { // , // , // charCode = this.decimalSeparator; if (Ext.isIE) { // IE e.browserEvent.keyCode = charCode.charCodeAt(0); } else if (Ext.isGecko) { // gecko- e.stopEvent(); // var newEvent = document.createEvent('KeyEvents'); // , // .. , // newEvent.initKeyEvent( e.browserEvent.type, e.browserEvent.bubbles, true, //cancellable e.browserEvent.view, e.browserEvent.ctrlKey, e.browserEvent.altKey, e.browserEvent.shiftKey, e.browserEvent.metaKey, 0, // keyCode charCode.charCodeAt(0) // charCode ); e.getTarget().dispatchEvent(newEvent); // , . return; } else if (Ext.isWebKit) { // e.stopEvent(); // webkit initKeyboardEvent , TextEvent if (this.checkValue(charCode)) { var newEvent = document.createEvent('TextEvent'); newEvent.initTextEvent( 'textInput', e.browserEvent.bubbles, true, e.browserEvent.view, charCode ); e.getTarget().dispatchEvent(newEvent); } return; } } if (!this.checkValue(charCode)) { e.stopEvent(); } // end hack }, updateDecimalPrecision : function(prec, force) { if (prec == this.decimalPrecision && force !== true) { return; } if (!Ext.isNumber(prec) || prec < 1) { this.allowDecimals = false; } else { this.decimalPrecision = prec; } var intRe = '^'; if (this.minValue < 0) { intRe += '-?'; } intRe += '\\d' + (Ext.isNumber(this.integerPrecision) ? '{1,' + this.integerPrecision + '}' : '+') + '$'; this.intRe = new RegExp(intRe); if (this.allowDecimals) { this.decRe = new RegExp('^\\d{1,' + this.decimalPrecision + '}$'); } else { delete this.decRe; } }, fixPrecision : function(value) { // support decimalSeparators if (Ext.isString(value)) { value = value.replace(new RegExp('[' + Ext.String.escapeRegex(this.allowedDecimalSeparators + this.decimalSeparator) + ']'), '.'); } // end hack var me = this, nan = isNaN(value), precision = me.decimalPrecision; if (nan || !value) { return nan ? '' : value; } else if (!me.allowDecimals || precision <= 0) { precision = 0; } return parseFloat(Ext.Number.toFixed(parseFloat(value), precision)); } }); field.updateDecimalPrecision(field.decimalPrecision, true); } }); Ext.onReady(function() { Ext.create('Ext.window.Window', { renderTo : Ext.getBody(), width : 300, height : 230, minWidth : 300, minHeight : 230, closable : false, bodyStyle : 'padding:5px', layout : 'border', title : 'NumberInputFilterPlugin - Demo', items : [{ region : 'north', xtype : 'fieldset', defaults : { xtype : 'numberfield', hideTrigger : true, msgTarget : 'side', autoFitErrors : true }, title : 'without plugin', items : [{ fieldLabel : 'simple' },{ fieldLabel : 'autoStripChars', autoStripChars : true }] },{ region : 'center', xtype : 'fieldset', title : 'with plugin', defaults : { xtype : 'numberfield', hideTrigger : true, msgTarget : 'side', autoFitErrors : true }, layout : 'anchor', items : [{ fieldLabel : 'non negative', minValue : 0, plugins : Ext.create('plugin.numberinputfilter') },{ fieldLabel : '"@,./#" as decimal separators', plugins : Ext.create('plugin.numberinputfilter', { allowedDecimalSeparators : '@,./#' }) }] }] }).show(); Ext.tip.QuickTipManager.init(); });
UPD: рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдХрд╛рдо рдХреИрд╕реЗ рдХрд░реЗрдВ> 12. рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдпрд╣рд╛рдБ рд╕реЗ рд▓рд┐рдпрд╛
рдЧрдпрд╛ рд╣реИ , рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рддреЛ
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред рддреЛ, filterKeys рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛:
... } else if (Ext.isGecko) { // gecko- e.stopEvent(); // https://bugzilla.mozilla.org/show_bug.cgi?id=749185 // firefoxVersion . if (firefoxVersion < 12) { // var newEvent = document.createEvent('KeyEvents'); // , // .. , // newEvent.initKeyEvent( e.browserEvent.type, e.browserEvent.bubbles, true, //cancellable e.browserEvent.view, e.browserEvent.ctrlKey, e.browserEvent.altKey, e.browserEvent.shiftKey, e.browserEvent.metaKey, 0, // keyCode charCode.charCodeAt(0) // charCode ); e.getTarget().dispatchEvent(newEvent); } else if (this.checkValue(charCode)) { // http://forums.mozillazine.org/viewtopic.php?p=12198605&sid=3723622be9117f663d16d522fe03deb5#p12198605 var tgt = e.getTarget(); if ('selectionStart' in tgt) { if (tgt.selectionStart == tgt.textLength) { tgt.value += charCode; } else { var lastpos = tgt.selectionStart; tgt.value = tgt.value.substr(0, lastpos) + charCode + tgt.value.substr(lastpos); tgt.selectionStart = lastpos + 1; tgt.selectionEnd = lastpos + 1; } } } return; } else if (Ext.isWebKit) { ...