📄 spryvalidationtextfield.js
字号:
groupPatterns[i-1] = "\\d{1,2}";
fullGroupPatterns[i-1] = "\\d\\d";
dateValidationPatternString += "(" + groupPatterns[i-1] + ")";
autocompleteCharacters[i-1] = null;
break;
case "mm":
groupPatterns[i-1] = "\\d{1,2}";
fullGroupPatterns[i-1] = "\\d\\d";
dateValidationPatternString += "(" + groupPatterns[i-1] + ")";
autocompleteCharacters[i-1] = null;
break;
case "yy":
groupPatterns[i-1] = "\\d{1,2}";
fullGroupPatterns[i-1] = "\\d\\d";
dateValidationPatternString += "(\\d\\d)";
autocompleteCharacters[i-1] = null;
break;
case "yyyy":
groupPatterns[i-1] = "\\d{1,4}";
fullGroupPatterns[i-1] = "\\d\\d\\d\\d";
dateValidationPatternString += "(\\d\\d\\d\\d)";
autocompleteCharacters[i-1] = null;
break;
default:
groupPatterns[i-1] = fullGroupPatterns[i-1] = Spry.Widget.ValidationTextField.regExpFromChars(formatGroups[i]);
dateValidationPatternString += "["+ groupPatterns[i-1] + "]";
autocompleteCharacters[i-1] = formatGroups[i];
}
}
}
this.dateValidationPattern = new RegExp("^" + dateValidationPatternString + "$" , "");
this.dateAutocompleteCharacters = autocompleteCharacters;
this.dateGroupPatterns = groupPatterns;
this.dateFullGroupPatterns = fullGroupPatterns;
this.lastDateGroup = formatGroups.length-2;
};
Spry.Widget.ValidationTextField.prototype.getRegExpForGroup = function (group)
{
var ret = '^';
for (var j = 0; j <= group; j++) ret += this.dateGroupPatterns[j];
ret += '$';
return new RegExp(ret, "");
};
Spry.Widget.ValidationTextField.prototype.getRegExpForFullGroup = function (group)
{
var ret = '^';
for (var j = 0; j < group; j++) ret += this.dateGroupPatterns[j];
ret += this.dateFullGroupPatterns[group];
return new RegExp(ret, "");
};
Spry.Widget.ValidationTextField.prototype.getDateGroup = function(value, pos)
{
if (pos == 0) return 0;
var test_value = value.substring(0, pos);
for (var i=0; i <= this.lastDateGroup; i++)
if (this.getRegExpForGroup(i).test(test_value)) return i;
return -1;
};
Spry.Widget.ValidationTextField.prototype.isDateGroupFull = function(value, group)
{
return this.getRegExpForFullGroup(group).test(value);
};
Spry.Widget.ValidationTextField.prototype.isValueValid = function(value, pos, group)
{
var test_value = value.substring(0, pos);
return this.getRegExpForGroup(group).test(test_value);
};
Spry.Widget.ValidationTextField.prototype.isPositionAtEndOfGroup = function (value, pos, group)
{
var test_value = value.substring(0, pos);
return this.getRegExpForFullGroup(group).test(test_value);
};
Spry.Widget.ValidationTextField.prototype.nextDateDelimiterExists = function (value, pos, group)
{
var autocomplete = this.dateAutocompleteCharacters[group+1];
if (value.length < pos + autocomplete.length)
return false;
else
{
var test_value = value.substring(pos, pos+autocomplete.length);
if (test_value == autocomplete)
return true;
}
return false;
};
Spry.Widget.ValidationTextField.prototype.onKeyPress = function(e)
{
if (this.flags.skp) {
this.flags.skp = false;
Spry.Widget.Utils.stopEvent(e);
return false;
}
if (e.ctrlKey || e.metaKey || !this.useCharacterMasking) {
return true;
}
/*
if (Spry.is.safari) {
if ( (e.timeStamp - this.flags.lastKeyPressedTimeStamp)<10 ) {
return true;
}
this.flags.lastKeyPressedTimeStamp = e.timeStamp;
}
*/
if (Spry.is.opera && this.flags.operaRevertOnKeyUp) {
Spry.Widget.Utils.stopEvent(e);
return false;
}
if (this.keyCode == 8 || this.keyCode == 46) {
var mr = this.doValidations(this.input.value, this.input.value);
if (mr) {
return true;
}
}
var pressed = Spry.Widget.Utils.getCharacterFromEvent(e);
if (pressed && this.characterMasking) {
if (!this.characterMasking.test(pressed)) {
Spry.Widget.Utils.stopEvent(e);
this.redTextFlash();
return false;
}
}
if(pressed && this.pattern) {
var currentPatternChar = this.patternCharacters[this.selection.start];
if (/[ax]/i.test(currentPatternChar)) {
//convert the entered character to the pattern character case
if (currentPatternChar.toLowerCase() == currentPatternChar) {
pressed = pressed.toLowerCase();
} else {
pressed = pressed.toUpperCase();
}
}
var autocomplete = this.getAutoComplete(this.selection.start);
if (this.selection.start == this.oldValue.length) {
if (this.oldValue.length < this.patternLength) {
if (autocomplete) {
Spry.Widget.Utils.stopEvent(e);
var futureValue = this.oldValue.substring(0, this.selection.start) + autocomplete + pressed;
var mustRevert = this.doValidations(futureValue, this.oldValue);
if (!mustRevert) {
this.setValue(this.fixedValue);
this.selection.moveTo(this.fixedValue.length, this.fixedValue.length);
} else {
this.setValue(this.oldValue.substring(0, this.selection.start) + autocomplete);
this.selection.moveTo(this.selection.start + autocomplete.length, this.selection.start + autocomplete.length);
}
return false;
}
} else {
Spry.Widget.Utils.stopEvent(e);
this.setValue(this.input.value);
return false;
}
} else if (autocomplete) {
Spry.Widget.Utils.stopEvent(e);
this.selection.moveTo(this.selection.start + autocomplete.length, this.selection.start + autocomplete.length);
return false;
}
Spry.Widget.Utils.stopEvent(e);
var futureValue = this.oldValue.substring(0, this.selection.start) + pressed + this.oldValue.substring(this.selection.start + 1);
var mustRevert = this.doValidations(futureValue, this.oldValue);
if (!mustRevert) {
autocomplete = this.getAutoComplete(this.selection.start + 1);
this.setValue(this.fixedValue);
this.selection.moveTo(this.selection.start + 1 + autocomplete.length, this.selection.start + 1 + autocomplete.length);
} else {
this.selection.moveTo(this.selection.start, this.selection.start);
}
return false;
}
if (pressed && this.type == 'date' && this.useCharacterMasking)
{
var group = this.getDateGroup(this.oldValue, this.selection.start);
if (group != -1) {
Spry.Widget.Utils.stopEvent(e);
if ( (group % 2) !=0 )
group ++;
if (this.isDateGroupFull(this.oldValue, group))
{
if(this.isPositionAtEndOfGroup(this.oldValue, this.selection.start, group))
{
if(group == this.lastDateGroup)
{
this.redTextFlash(); return false;
}
else
{
// add or jump over autocomplete delimiter
var autocomplete = this.dateAutocompleteCharacters[group+1];
if (this.nextDateDelimiterExists(this.oldValue, this.selection.start, group))
{
var autocomplete = this.dateAutocompleteCharacters[group+1];
this.selection.moveTo(this.selection.start + autocomplete.length, this.selection.start + autocomplete.length);
if (pressed == autocomplete)
return false;
if (this.isDateGroupFull(this.oldValue, group+2))
// need to overwrite first char in the next digit group
futureValue = this.oldValue.substring(0, this.selection.start) + pressed + this.oldValue.substring(this.selection.start + 1);
else
futureValue = this.oldValue.substring(0, this.selection.start) + pressed + this.oldValue.substring(this.selection.start);
if (!this.isValueValid(futureValue, this.selection.start + 1, group +2 ))
{
this.redTextFlash(); return false;
}
else
{
this.setValue (futureValue);
this.selection.moveTo(this.selection.start + 1, this.selection.start + 1);
}
return false;
}
else
{
var autocomplete = this.dateAutocompleteCharacters[group+1];
var insertedValue = autocomplete + pressed;
futureValue = this.oldValue.substring(0, this.selection.start) + insertedValue + this.oldValue.substring(this.selection.start);
if (!this.isValueValid(futureValue, this.selection.start + insertedValue.length, group +2 ))
{
// block this type
insertedValue = autocomplete;
futureValue = this.oldValue.substring(0, this.selection.start) + insertedValue + this.oldValue.substring(this.selection.start);
this.setValue (futureValue);
this.selection.moveTo(this.selection.start + insertedValue.length, this.selection.start + insertedValue.length);
this.redTextFlash(); return false;
}
else
{
this.setValue (futureValue);
this.selection.moveTo(this.selection.start + insertedValue.length, this.selection.start + insertedValue.length);
return false;
}
}
}
}
else
{
// it's not the end of the full digits group
// overwrite
var movePosition = 1;
futureValue = this.oldValue.substring(0, this.selection.start) + pressed + this.oldValue.substring(this.selection.start + 1);
if (!this.isValueValid(futureValue, this.selection.start + 1, group))
{
this.redTextFlash(); return false;
}
else
{
if(this.isPositionAtEndOfGroup(futureValue, this.selection.start+1, group))
{
if (group != this.lastDateGroup)
{
if (this.nextDateDelimiterExists(futureValue, this.selection.start + 1, group))
{
var autocomplete = this.dateAutocompleteCharacters[group+1];
movePosition = 1 + autocomplete.length;
}
else
{
var autocomplete = this.dateAutocompleteCharacters[group+1];
futureValue = this.oldValue.substring(0, this.selection.start) + pressed + autocomplete + this.oldValue.substring(this.selection.start + 1);
movePosition = 1 + autocomplete.length;
}
}
}
this.setValue (futureValue);
this.selection.moveTo(this.selection.start + movePosition, this.selection.start + movePosition);
return false;
}
}
}
else
{
// date group is not full
// insert
futureValue = this.oldValue.substring(0, this.selection.start) + pressed + this.oldValue.substring(this.selection.start);
var movePosition = 1;
if (!this.isValueValid(futureValue, this.selection.start + 1, group) && !this.isValueValid(futureValue, this.selection.start + 1, group+1))
{
this.redTextFlash(); return false;
}
else
{
var autocomplete = this.dateAutocompleteCharacters[group+1];
if (pressed == autocomplete)
{
if (this.nextDateDelimiterExists(this.oldValue, this.selection.start, group))
{
futureValue = this.oldValue;
movePosition = 1;
}
}
else
{
if(this.isPositionAtEndOfGroup(futureValue, this.selection.start+1, group))
{
if (group != this.lastDateGroup)
{
if (this.nextDateDelimiterExists(futureValue, this.selection.start + 1, group))
{
var autocomplete = this.dateAutocompleteCharacters[group+1];
movePosition = 1 + autocomplete.length;
}
else
{
var autocomplete = this.dateAutocompleteCharacters[group+1];
futureValue = this.oldValue.substring(0, this.selection.start) + pressed + autocomplete + this.oldValue.substring(this.selection.start + 1);
movePosition = 1 + autocomplete.length;
}
}
}
}
this.setValue (futureValue);
this.selection.moveTo(this.selection.start + movePosition, this.selection.start + movePosition);
return false;
}
}
}
return false;
}
};
Spry.Widget.ValidationTextField.prototype.onKeyDown = function(e)
{
this.saveState();
this.keyCode = e.keyCode;
if (Spry.is.opera) {
if (this.flags.operaPasteOperation) {
window.clearInterval(this.flags.operaPasteOperation);
this.flags.operaPasteOperation = null;
}
if (e.ctrlKey) {
var pressed = Spry.Widget.Utils.getCharacterFromEvent(e);
if (pressed && 'vx'.indexOf(pressed.toLowerCase()) != -1) {
var self = this;
this.flags.operaPasteOperation = window.setInterval(function() { self.operaPasteMonitor();}, 1);
return true;
}
}
}
if (this.keyCode != 8 && this.keyCode != 46 && Spry.Widget.Utils.isSpecialKey(e)) {
return true;
}
if (this.keyCode == 8 || this.keyCode == 46 ) {
var mr = this.doValidations(this.input.value, this.input.value);
if (mr) {
return true;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -