FormatTextBox jQuery插件

分享于 

32分钟阅读

Web开发

  繁體

介绍

你是否需要限制用户在文本框中输入的内容? 也许你希望用户只输入数字,但文本框也接受字母? 限制用户可以输入的优点是它减少了错误和失败的验证,但是无法替换完整的客户端和服务器验证。

在文本框中实施格式可以通过JavaScript或者jQuery实现,但是一旦需要多次,最好的解决方案是包装。 我寻找这样的jQuery插件,可以处理一些比整数。浮点。日期&时间更为频繁的格式。 有些插件在实现中更加特别,比如强制使用特定的信用卡格式,但我决定写这个。

在本文的前半部分,我将概述插件,它能做什么,以及如何使用它。 在演示HTML文件中还详细考察了各种格式的各种格式,并且具有大量示例。 在本文的第二部分中,我将展示如何使用jQuery模板构建jQuery插件以及如何将所有代码片段合并。

FormatTextBox插件

插件支持以下格式:

  • 整数- 整数。
  • 浮点- 十进制数。格式由精度&比例定义。
  • 日期- 短日期( 如 31/12/2015 )。
  • 时间- 时间格式( 例如 23: 59 )。
  • 正规表达式 - 通用格式强制使用 正规表达式的格式。
$("input:text").formatTextBox({ formatType: "integer" });
$("input:text").formatTextBox({ formatType: "float" });
$("input:text").formatTextBox({ formatType: "date" });
$("input:text").formatTextBox({ formatType: "time" });
$("input:text").formatTextBox({ formatType: "regex" });

插件禁止对给定格式不允许的字符闪烁。 例如如果插件强制使用整数格式,用户单击字母字符,那么该字母就不会出现,然后消失在( 闪烁) 中。 它将不会出现在文本框中。

对于大多数格式,用户可以在文本框为空时设置默认值。 插件还跟踪在用户开始写入文本框之前在文本框中的最后一个值。 如果用户输入的文本不符合特定格式,则该插件将还原为原始文本。

插件处理 shorthand 值,意思是如果用户输入了部分值,它将完成它以确认给定的格式。 一些示例:对于浮点格式,". 12"的值将完成" 0.123"。 对于日期格式," 311215"的值将完成为"31/12/2015"。

整型格式

整数格式只允许文本框中的数字。 如果数字范围( 按最小&设置设置) 小于 0,则在文本开始处允许单个标签。 带有前导 0的数字将被截断。

// defaults$("input:text").formatTextBox({ 
 formatType: "integer",
 integer: {
 format: {
 digitGroupSymbol: "," },
 min: -2147483648,
 max: 2147483647 },
 valueOnEmpty: null});

本示例将范围限制为 -10和 10之间的数字。 如果文本框为空,则它将还原为 1.

$("input:text").formatTextBox({ 
 formatType: "integer",
 integer: {
 min: -10,
 max: 10 },
 valueOnEmpty: 1});

浮点格式

浮点格式只允许文本框中的数字和指定的十进制符号。 允许的数字是由精度和比例决定的。 精度决定数字的最大位数,小数位数决定小数点后有多少位数字。 如果数字范围( 按最小&设置设置) 小于 0,则在文本开始处允许单个标签。 带有前导 0的数字将被截断。

// defaults$("input:text").formatTextBox({ 
 formatType: "float",
 float: {
 format: {
 precision: 18,
 scale: 2,
 digitGroupSymbol: ",",
 decimalSymbol: "." },
 min: null,
 max: null },
 valueOnEmpty: null});

本示例将范围限制为 -10.123和 10.456之间的数字。 数字在十进制符号( 缩放 3 ) 之后有 3位数字。 如果文本框为空,则它将还原为 0.000.

$("input:text").formatTextBox({ 
 formatType: "float",
 float: {
 format: {
 scale: 3 },
 min: -10.123,
 max: 10.456 },
 valueOnEmpty: 0});

解析&格式数字

这个插件有两个实用函数可以用于整数&浮点格式。 parseNumber 函数解析文本框中的文本并返回一个JavaScript整数/浮点号。 formatNumber 函数接受文本框中的数字,并用数字组符号和十进制符号对它的进行格式化。 这两个函数考虑了数字组符号和使用的十进制符号。 它们非常有用,尤其当符号不是无关紧要的时候。 这里示例具有非平凡符号。

$("input:text").val(1234.567);
$("input:text").formatTextBox({ 
 formatType: "float", 
 float: { 
 format: { 
 scale: 3,
 digitGroupSymbol: ".", 
 decimalSymbol: "," 
 } 
 }
});// the text in text box will be"1234,567"// because the decimal symbol is","// parse number: float number 1234.567$("input:text").formatTextBox("parseNumber");// format number: string"1.234,567"$("input:text").formatTextBox("formatNumber");

日期格式

日期格式启用短日期,例如 31/12/2015. 格式允许数字和指定的分隔符。 日期可以在最小值和最大值之间限制。

// defaults$("input:text").formatTextBox({ 
 formatType: "date",
 date: {
 format: {
 shortDate: "dd/mm/yyyy",
 separator: "/" },
 min: null,
 max: null },
 nowOnEmpty: false,
 valueOnEmpty: null});

下面是一些简单的示例。除非另外说明,否则默认格式为 dd/mm/yyyy.

// limit date to 2014$("input:text").formatTextBox({ 
 formatType: "date", 
 date: { 
 min: '2014-01-01', 
 max: '2014-12-31' 
 } 
});// set date to 01/01/1900 when empty$("input:text").formatTextBox({ 
 formatType: "date", 
 valueOnEmpty: new Date('1900-01-01') 
});// set date to today when empty$("input:text").formatTextBox({ 
 formatType: "date", 
 nowOnEmpty: true 
});

本示例使用不同的日期格式 mm.dd. yyyy。

$("input:text").formatTextBox({ 
 formatType: "date", 
 date: { 
 format: { 
 shortDate: "mm.dd.yyyy",
 separator: "." } 
 }
});

分析日期

parseDate是适用于日期格式的实用工具函数。 这里函数解析文本框中的文本并返回一个JavaScript日期对象。 它考虑到日期和日期分隔符的格式。

$("input:text").val("12.31.2015");
$("input:text").formatTextBox({ 
 formatType: "date", 
 date: { 
 format: { 
 shortDate: "mm.dd.yyyy",
 separator: "." } 
 }
});// parse date: Date object 31/12/2015$("input:text").formatTextBox("parseDate");

时间格式

时间格式支持短时间格式,不需要秒,例如 23: 59. 它不仅是一个 24-hours 循环。 格式允许数字和: 分隔符。在最小值和最大值之间可以限制时间。

// defaults$("input:text").formatTextBox({ 
 formatType: "time",
 time: {
 min: null,
 max: null },
 nowOnEmpty: false,
 valueOnEmpty: null});

一些示例。

// limit time to 24 hours$("input:text").formatTextBox({ 
 formatType: "time", 
 time: { 
 min: "00:00", 
 max: "23:59" 
 } 
});// set time to 12:00 PM when empty$("input:text").formatTextBox({ 
 formatType: "time", 
 valueOnEmpty: 1200 
});// set time to now when empty$("input:text").formatTextBox({ 
 formatType: "time", 
 nowOnEmpty: true 
});

解析时间

parseTime 是适用于时间格式的实用工具函数。 函数解析文本框中的文本并返回 01/01/1900 JavaScript对象,并将小时和分钟添加到文本框中。

$("input:text").val("23:59");
$("input:text").formatTextBox({ formatType: "time" });// parse time: Date object 01/01/1900 23:59:00.$("input:text").formatTextBox("parseTime");

正规表达式 格式

正规表达式 格式是用户通过 正规表达式 实现自己的格式的地方。 regex.pattern 是文本 Pattern。 当设置为空时,正规表达式 Pattern 将默认为,以允许所有模式。 regex.chars 确定允许哪些键笔划,最好用括号表达式编写,例如 [0-9a-zA-Z]。 当设置为空时,允许所有键笔划通过。 regex.length 是文本允许的最大长度。 当设置为空时,禁用。 regex.empty 确定文本框是否可以为空。 regex.pattern & regex.chars 可以是字符串或者正则表达式对象。

// defaults$("input:text").formatTextBox({ 
 formatType: "regex",
 regex: {
 pattern: null,
 chars: null,
 length: null,
 empty: true },
 valueOnEmpty: null});

本示例强制使用字母数字格式。第一个字符必须是字母。

$("input:text").formatTextBox({ 
 formatType: "regex", 
 regex: { 
 pattern: "[a-zA-Z].*", 
 chars: "[0-9a-zA-Z]" } 
});

本示例实施强密码。 至少 16个字符有大写字母。 有 lowercase 字母。有数字。 有符号。

$("input:text").formatTextBox({ 
 formatType: "regex", 
 regex: { 
 pattern:/(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[-+_=!@#$%^&*|.,:;~?`'"(){}[]<>/]).{16,}/,
 chars:/[0-9a-zA-Z-+_=!@#$%^&*|.,:;~?`'"(){}[]<>/]/
 }
});

命名格式

用户可以将 register 格式与插件作为 key-value 对,它的中键是格式为 NAME的用户,值是选项对象。 在使用任意数量的文本框之前,这种机制可以用于 register的所有格式。 注册由 static 函数 namedFormat 完成,它是一个 getter/setter函数。 namedFormat 不是递归的,注册另一个命名格式将无法工作。

// register Y2K format$.fn.formatTextBox.namedFormat("Y2K", { 
 formatType: "integer", 
 integer: { min: 2000, max: 2999 },
 valueOnEmpty: 2000});// get Y2K format$.fn.formatTextBox.namedFormat("Y2K");// use Y2K format$("input:text").formatTextBox({ formatType: "Y2K" });

回拨

插件支持多个回调,用户可以通过 register。 按触发顺序的回调是 onBeforeFocusonFocusonBeforeKeypressonKeypressonBeforeBluronEmptyonValidationErroronBlur。 事件参数是一个 jQuery规范化事件对象。 数据参数是在初始化格式时作为选项传递的数据。 this 引用输入DOM控件。

焦点回调

onBeforeFocusonFocus 回调在插件处理焦点事件之前和之后触发。 这就是当用户开始在文本框中写入前,插件本质上设置当前文本的时候。 onBeforeFocus 是用户在处理输入文本之前可以更改输入文本的地方。 onFocus 数据参数在焦点事件发生时保存输入文本。 当 options.clearOnFocus = true 在焦点事件末尾为空,并且用户不能通过 $.val() 获取时,这里数据参数非常有用。

$("input:text").formatTextBox({ 
 onBeforeFocus: function (event, data) { 
 },
 onFocus: function (event, data) {
 data.value; // text box value }
});

插件为聚焦事件上的常见操作提供了一些选项,因这里用户不需要在焦点回调中实现它们。 当输入控件获得焦点时,clearOnFocus 将清除文本。 当输入控件获得焦点时,selectOnFocus 将选择所有文本。 两个选项都可以使用布尔值或者函数。

$("input:text").formatTextBox({ 
 formatType: "integer",
 clearOnFocus: true,
 selectOnFocus: true});// clear if the text is 0, otherwise select all the text$("input:text").formatTextBox({ 
 formatType: "integer",
 clearOnFocus: function(text) {
 return (text == "0");
 },
 selectOnFocus: function(text) {
 return (text!= "0");
 }
});
按键回调

在插件处理按下的键之前和之后,onBeforeKeypressonKeypress 回调。 onBeforeKeypress 是通过调用 event.preventDefault() 来阻止Keypress事件继续进行的。 数据参数保存键的字符代码,以及是否阻止或者接受按下的键。 data.charCodeevent.which 相同。 data.isPrevented 与调用 event.isDefaultPrevented() 相同。

$("input:text").formatTextBox({ 
 onBeforeKeypress: function (event, data) { 
 data.charCode; // key pressedevent.preventDefault(); // stop key press },
 onKeypress: function (event, data) {
 data.charCode; // key pressed data.isPrevented; // whether the pressed key was accepted or rejected }
});

插件提供了一些预定义的按键字符代码,用户可以通过 $.fn.formatTextBox.keypressCodes 访问它们。 这里示例演示如何防止 tilde ( ~ ) 键笔画。

$("input:text").formatTextBox({ 
 onBeforeKeypress: function (event, data) { 
 if (data.charCode == $.fn.formatTextBox.keypressCodes.Tilde) // ~event.preventDefault();
 }
});
模糊回调

onBeforeBluronBlur 回调在插件处理模糊事件之前和之后触发。 当插件检查文本框中的文本并查看它是否确认它的格式时。 如果没有,它将恢复到原始文本。 如果文本框为空,则 onEmpty 回调将激发。 如果文本框中的文本未以格式进行确认,则 onValidationError 回调将激发。 onValidationError 数据参数保存被拒绝的文本。
当文本不使用格式确认文本时,clearOnError 将清除文本,而不是检索原始文本。 这里选项可以使用布尔值或者函数。

$("input:text").formatTextBox({ 
 onBeforeBlur: function (event, data) { 
 },
 onEmpty: function (event, data) { 
 },
 onValidationError: function (event, data) {
 data.value; // rejected text },
 onBlur: function (event, data) { 
 },
 clearOnError: false,
 // or clearOnError: function(text) {
 return (text!= "");
 }
});

这个例子演示了如何使用 onBeforeBlur 回调和数据选项在电子邮件格式中利用自动完成功能。 如果电子邮件没有主机,它会自动完成它,自动完成是通过 onBeforeBlur 回调实现的,因为我们想验证自动完成的文本,而不是使用电子邮件 正规表达式 Pattern 确认自动完成的文本。

$("input:text").formatTextBox({
 formatType: "regex",
 regex: {
 pattern:/([a-zA-Z0-9'_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+/,
 keystrokePattern:/[^@]+@?[^@]*/,
 chars:"[0-9A-Za-z'-.@_]" },
 data: {
 host:"gmail.com" },
 onBeforeBlur: function (event, data) {
 if (data!= null && data.host!= null && data.host.toString()!="") {
 var $elem = $(this);
 var value = $elem.val();
 if (value!="") {
 var index = value.lastIndexOf("@");
 if (index == -1) {
 value +="@" + data.host;
 $elem.val(value);
 } else if (index == value.length - 1) {
 value += data.host;
 $elem.val(value);
 }
 }
 }
 }
});

jQuery样板插件模板

我们从 jQuery样板文件的模板插件开始。 这里站点具有针对简单和高级用例的各种模板。 它还有针对 jQuery UI的小部件模板。 这些模板代表创作最佳实践的累积。 目的是防止用户重新发明轮子,让他专注于插件核心和主要逻辑。 FormatTextBox插件使用的模板是高度配置 Pattern。 Pattern 还使用扩展jQuery样板文件,提供对Prototype方法的访问,防止多个插件实例的出现。 所以我们从这个模板开始。

; (function ($, window, document, undefined) {
 /* private plugin members */ var pluginName = "nameOfThePlugin",
 // instance of the Plugin object Plugin = function (elem, options) {
 this.elem = elem;
 this.$elem = $(elem);
 this.options = options;
 this._name = pluginName;
 this.init();
 };
 /* Plugin object prototype */ Plugin.prototype = {
 defaults: { },
 init: function () { },
 destroy: function () { }
 // plugin functions here };
 Plugin.defaults = Plugin.prototype.defaults;
 /* register plugin with jQuery */ $.fn[pluginName] = function (options) {
 var args = arguments;
 // instantiate a new instance of the plugin if (options === undefined || typeof options === "object") {
 return this.filter("*").each(function () {
 if (!$.data(this, "plugin_" + pluginName))
 $.data(this, "plugin_" + pluginName, new Plugin(this, options));
 });
 // call to a public method } elseif (typeof options === "string" && options[0]!== "_" && options!== "init") {
 // cache the method call var returns;
 this.filter("*").each(function () {
 var instance = $.data(this, "plugin_" + pluginName);
 // call the method if (instance instanceof Plugin && typeof instance[options] === "function")
 returns = 
 instance[options].apply(instance, Array.prototype.slice.call(args, 1));
 // allow instances to be destroyed via the"destroy" method if (options === "destroy")
 $.data(this, "plugin_" + pluginName, null);
 });
 // if the cached method call didn't returned a value// return this to preserve chainability return (returns!== undefined? returns : this);
 }
 };
})(jQuery, window, document);

对DOM对象调用插件时,首先检查DOM对象是否与插件对象实例( 使用 jQuery $.data() ) 关联。 如果已经有一个实例,那么插件已经被调用并被初始化。 这样就不做任何事情,也没有多重实例化。 如果是第一次调用,插件将创建一个新的插件对象实例并将它与DOM对象关联起来。 如果我们看到were构造函数,我们可以看到它保持了对DOM对象( this.elem )。它的jQuery对象( this.$elem ) 和传入的选项( this.options )。 然后,构造函数首先调用 init,并且在这个时候,插件是简单的并初始化的。

如果我们想调用一个插件 public 函数,函数的NAME 必须作为第一个参数,它的余的参数是选项。 函数的NAME 不能以下划线( _ ) 开头,因为它是 private 函数,我们不能再次调用 init。 插件检索位于插件实例中的函数,并且如果存在任何选项,则执行它。

调用 destroy 时,首先执行的函数与其他 public 插件函数一样。 这就是我们要移除我们附加到DOM对象的任何事件处理程序,并将DOM对象恢复到原始状态。 然后,DOM对象与它的插件实例解除关联。 表示插件不再对DOM对象进行操作,对该对象的后续调用可能是。

你还可以注意到模板有 this.filter("*") 子句。 过滤器旨在防止插件在错误的DOM对象类型上操作。 由于 FormatTextBox,过滤器将是 this.filter("input:text"),因为插件只适用于文本框。

插件实现

init 函数,我们将 3个事件。焦点。按键&模糊和文本框连接在一起。 destroy 函数是我们解开这些事件的地方。 当我们挂钩事件处理程序时,我们使用 $.proxy() 来确保 this 总是指向 Plugin 对象实例。

Plugin.prototype = {
 init: function () {
 this.settings = $.extend(true, {}, this.defaults, this.options);
 if (this.settings.formatType == "integer") {
 this.$elem
. on("focus.formatTextBox", $.proxy(this._integerFocus, this))
. on("keypress.formatTextBox", $.proxy(this._integerKeypress, this))
. on("blur.formatTextBox", $.proxy(this._integerBlur, this));
 }
 elseif (this.settings.formatType == "float") { }
 elseif (this.settings.formatType == "date") { }
 elseif (this.settings.formatType == "time") { }
 elseif (this.settings.formatType == "regex") { }
 returnthis;
 },
 destroy: function () {
 this.$elem.off(".formatTextBox");
 }
};
聚焦

现在我们要在插件上放一些肉。 从现在开始,我们将重点实现整数格式,所有函数都将在 Plugin.prototype 对象中声明。 我们从焦点事件处理程序开始。 焦点是在更改前保存当前文本,因这里在需要时可以将它的恢复到它的中。 焦点事件还负责清除文本框或者选择其中的所有文本。

_integerFocus: function (event) {
 // save the current textthis.currentValue = this.$elem.val();
 // clear the text boxif (this.settings.clearOnFocus)
 this.$elem.val("");
 // select all the textif (this.settings.selectOnFocus) 
 this.$elem.select();
}
按键

keypress事件处理程序确定击键是有效的还是不有效的。 对于整数格式,我们只想在文本的开头允许数字和减号。 不允许任何其他键笔划,并且已经被阻止。

_integerKeypress: function (event) {
 // jQuery event.which normalizes event.keyCode and event.charCodevar charCode = event.which;
 // if the event was suppressed before, don't do anythingif (event.isDefaultPrevented())
 returnfalse;
 // keystrokes allowed: control keys, digits, minus signif (!(
 charCode == 0 || // arrows charCode == 8 || // backspace charCode == 9 || // tab  charCode == 13 || // enter charCode == 27 || // escape (48<= charCode && charCode <= 57) || // 0-9 charCode == 45// - )) {
 event.preventDefault();
 returnfalse;
 }
 // minus sign at the beginning of the textif (charCode == 45) {
 var txtFieldPosition = this._getTextFieldPosition(this.elem);
 var caretPosition = 
 txtFieldPosition.caretPosition - txtFieldPosition.selectionLength;
 if (this.elem.value.charAt(0) == '-') {
 // already contains -if (caretPosition!= 0) {
 event.preventDefault();
 returnfalse;
 }
 } else {
 // allow only in the beginning of the textif (caretPosition!= 0) {
 event.preventDefault();
 returnfalse;
 }
 }
 }
 returntrue;
}

getTextFieldPosition 函数返回文本框的插入符位置和选择长度。 当你希望在文本框中允许特定位置( 如开始或者结束)的某些字符时,它非常有用。

_getTextFieldPosition: function (elem) {
 var caretPosition = 0;
 var selectionLength = 0;
 // IEif (document.selection) {
 elem.focus();
 var selection = document.selection.createRange();
 selectionLength = selection.text.length;
 selection.moveStart('character', -elem.value.length);
 caretPosition = selection.text.length;
 }
 // Firefoxelseif (elem.selectionStart || elem.selectionStart == '0') {
 caretPosition = elem.selectionEnd;
 selectionLength = elem.selectionEnd - elem.selectionStart;
 }
 return {
 caretPosition: caretPosition,
 selectionLength: selectionLength
 };
}
模糊

模糊事件处理程序确定文本是否有效,并确认给定的格式。 否则,它将恢复到文本框中的前一个文本。 模糊事件处理程序还负责自动完成场景。 如果用户输入部分输入,则该函数将完成文本以确认格式。 例如在小数点后两位小数和用户输入整数后,模糊事件处理程序将在文本末尾使用完成它。 在整数格式的情况下,自动完成将负责前导 0.

var INTEGER_REGEX_1 =/^d*$|^-d+$/, // empty, 123, -123 INTEGER_REGEX_2 =/^-?0+$/, // 000, -000 INTEGER_REGEX_3 =/^-?0+[1-9][0-9]*$/; // 000123, -000123_integerBlur: function (event) {
 // the current textvarvalue = this.$elem.val();
 // auto completevalue = this._integerAutoComplete(value, this.settings);
 // validationif (!!value.match(INTEGER_REGEX_1)) {
 // empty valueif (value == null || value.toString() == "") {
 // specific value when empty, set by the user in the optionsif (this.settings.valueOnEmpty!= null) {
 var valueOnEmpty = 
 this._integerAutoComplete(this.settings.valueOnEmpty, this.settings);
 if (!!valueOnEmpty.match(INTEGER_REGEX_1))
 this.$elem.val(valueOnEmpty);
 elsethis.$elem.val(value);
 } else {
 this.$elem.val(value);
 }
 } else {
 // parse the text to integervar intValue = this._parseNumber(value, false, 
 this.settings.integer.format.digitGroupSymbol, 
 this.settings.integer.format.decimalSymbol
 );
 // validate that the integer is between min and max values, // if they are specificed by the user in the optionsvar inMinRange = (intValue!= null && 
 (this.settings.integer.min == null || this.settings.integer.min <= intValue));
 var inMaxRange = (intValue!= null && 
 (this.settings.integer.max == null || intValue <= this.settings.integer.max));
 if (inMinRange && inMaxRange)
 this.$elem.val(value); // validation succeededelsethis._validationError(event, value); // validation error }
 } else {
 this._validationError(event, value); // validation error }
}// integer auto complete_integerAutoComplete: function (value, settings) {
 value = value.toString();
 if (!!value.match(INTEGER_REGEX_2)) {
 value = "0";
 } elseif (!!value.match(INTEGER_REGEX_3)) {
 value = this._parseNumber(value, false, 
 settings.integer.format.digitGroupSymbol, 
 settings.integer.format.decimalSymbol
 ).toString(10);
 }
 returnvalue;
}
回拨

现在 3事件。焦点。按键&模糊已经实现,我们希望将回调集成到代码中。 默认情况下,回调定义为空函数。 _onCallback 函数是一个 private 函数,负责对回调函数进行实际触发,所有事件都引用 _onCallback

// callbacks defined as empty functionsdefaults: {
 onBeforeFocus: $.noop,
 onFocus: $.noop,
 onBeforeKeypress: $.noop,
 onKeypress: $.noop,
 onBeforeBlur: $.noop,
 onEmpty: $.noop,
 onValidationError: $.noop,
 onBlur: $.noop
},// execute callback_onCallback: function (callbackName, event, data) {
 if ($.isFunction(this.settings[callbackName]) && event) {
 data = $.extend(true, {}, data, this.settings.data || {});
 this.settings[callbackName].call(this.elem, event, data);
 }
},// events_onBeforeFocus: function (event, data) { this._onCallback("onBeforeFocus", event, data); },
_onFocus: function (event, data) { this._onCallback("onFocus", event, data); },
_onBeforeKeypress: function (event, data) { this._onCallback("onBeforeKeypress", event, data); },
_onKeypress: function (event, data) { this._onCallback("onKeypress", event, data); },
_onBeforeBlur: function (event, data) { this._onCallback("onBeforeBlur", event, data); },
_onEmpty: function (event, data) { this._onCallback("onEmpty", event, data); },
_onValidationError: function (event, data) { this._onCallback("onValidationError", event, data); },
_onBlur: function (event, data) { this._onCallback("onBlur", event, data); }// focus_integerFocus: function (event) {
 this._onBeforeFocus(event);
 // focus codethis._onFocus(event, { 
 value: this.currentValue 
 });
},// keypress_integerKeypress: function (event) {
 var charCode = event.which;
 this._onBeforeKeypress(event, { 
 charCode: charCode 
 });
 // keypress codethis._onKeypress(event, { 
 charCode: charCode, 
 isPrevented: false 
 });
 returntrue;
},// blur_integerBlur: function (event) {
 this._onBeforeBlur(event);
 varvalue = this.$elem.val();
 // if value is emptythis._onEmpty(event);
 // if value is not validthis._validationError(event, value);
 this._onBlur(event);
}

历史记录

14/04/2016: Firefox 修正错误。无法在 Firefox 中 delete 文本。


相关文章