📄 spryvalidationtextfield.js
字号:
this.putHint();
this.compilePattern();
if (this.type == 'date') {
this.compileDatePattern();
}
this.input.setAttribute("AutoComplete", "off");
this.selection = new Spry.Widget.SelectionDescriptor(this.input);
this.oldValue = this.input.value;
var self = this;
this.event_handlers = [];
this.event_handlers.push([this.input, "keydown", function(e) { if (self.isDisabled()) return true; return self.onKeyDown(e || event); }]);
this.event_handlers.push([this.input, "keypress", function(e) { if (self.isDisabled()) return true; return self.onKeyPress(e || event); }]);
if (Spry.is.opera) {
this.event_handlers.push([this.input, "keyup", function(e) { if (self.isDisabled()) return true; return self.onKeyUp(e || event); }]);
}
this.event_handlers.push([this.input, "focus", function(e) { if (self.isDisabled()) return true; return self.onFocus(e || event); }]);
this.event_handlers.push([this.input, "blur", function(e) { if (self.isDisabled()) return true; return self.onBlur(e || event); }]);
this.event_handlers.push([this.input, "mousedown", function(e) { if (self.isDisabled()) return true; return self.onMouseDown(e || event); }]);
var changeEvent =
Spry.is.mozilla || Spry.is.opera || Spry.is.safari?"input":
Spry.is.ie?"propertychange":
"change";
this.event_handlers.push([this.input, changeEvent, function(e) { if (self.isDisabled()) return true; return self.onChange(e || event); }]);
if (Spry.is.mozilla || Spry.is.safari) {
//oninput event on mozilla does not fire ondragdrop
this.event_handlers.push([this.input, "dragdrop", function(e) { if (self.isDisabled()) return true; self.removeHint();return self.onChange(e || event); }]);
} else if (Spry.is.ie){
//ondrop&onpropertychange crash on IE
this.event_handlers.push([this.input, "drop", function(e) { if (self.isDisabled()) return true; return self.onDrop(e || event); }]);
}
for (var i=0; i<this.event_handlers.length; i++) {
Spry.Widget.Utils.addEventListener(this.event_handlers[i][0], this.event_handlers[i][1], this.event_handlers[i][2], false);
}
// submit
this.form = Spry.Widget.Utils.getFirstParentWithNodeName(this.input, "FORM");
if (this.form) {
// if no "onSubmit" handler has been attached to the current form, attach one
if (!this.form.attachedSubmitHandler && !this.form.onsubmit) {
this.form.onsubmit = function(e) { e = e || event; return Spry.Widget.Form.onSubmit(e, e.srcElement || e.currentTarget) };
this.form.attachedSubmitHandler = true;
}
if (!this.form.attachedResetHandler) {
Spry.Widget.Utils.addEventListener(this.form, "reset", function(e) { e = e || event; return Spry.Widget.Form.onReset(e, e.srcElement || e.currentTarget) }, false);
this.form.attachedResetHandler = true;
}
// add the currrent widget to the "onSubmit" check queue;
Spry.Widget.Form.onSubmitWidgetQueue.push(this);
}
}
};
Spry.Widget.ValidationTextField.prototype.isDisabled = function() {
return this.input && (this.input.disabled || this.input.readOnly) || !this.input;
};
Spry.Widget.ValidationTextField.prototype.getElement = function(ele)
{
if (ele && typeof ele == "string")
return document.getElementById(ele);
return ele;
};
Spry.Widget.ValidationTextField.addLoadListener = function(handler)
{
if (typeof window.addEventListener != 'undefined')
window.addEventListener('load', handler, false);
else if (typeof document.addEventListener != 'undefined')
document.addEventListener('load', handler, false);
else if (typeof window.attachEvent != 'undefined')
window.attachEvent('onload', handler);
};
Spry.Widget.ValidationTextField.processLoadQueue = function(handler)
{
Spry.Widget.ValidationTextField.onloadDidFire = true;
var q = Spry.Widget.ValidationTextField.loadQueue;
var qlen = q.length;
for (var i = 0; i < qlen; i++)
q[i].attachBehaviors();
};
Spry.Widget.ValidationTextField.addLoadListener(Spry.Widget.ValidationTextField.processLoadQueue);
Spry.Widget.ValidationTextField.addLoadListener(function(){
Spry.Widget.Utils.addEventListener(window, "unload", Spry.Widget.Form.destroyAll, false);
});
Spry.Widget.ValidationTextField.prototype.setValue = function(newValue) {
this.flags.locked = true;
this.input.value = newValue;
this.flags.locked = false;
this.oldValue = newValue;
if (!Spry.is.ie) {
this.onChange();
}
};
/**
* save the state of the input (selection and value) so we can revert to it
* should call this just before modifying the input value
*/
Spry.Widget.ValidationTextField.prototype.saveState = function()
{
this.oldValue = this.input.value;
this.selection.update();
};
Spry.Widget.ValidationTextField.prototype.revertState = function(revertValue)
{
if (revertValue != this.input.value) {
this.input.readOnly = true;
this.input.value = revertValue;
this.input.readOnly = false;
if (Spry.is.safari && this.flags.active) {
this.input.focus();
}
}
this.selection.moveTo(this.selection.start, this.selection.end);
this.redTextFlash();
};
Spry.Widget.ValidationTextField.prototype.removeHint = function()
{
if (this.flags.hintOn) {
this.input.value = "";
this.flags.hintOn = false;
}
};
Spry.Widget.ValidationTextField.prototype.putHint = function()
{
if(this.hint && this.input && this.input.type == "text" && this.input.value == "") {
this.flags.hintOn = true;
this.input.value = this.hint;
}
};
Spry.Widget.ValidationTextField.prototype.redTextFlash = function()
{
var self = this;
this.addClassName(this.element, this.textfieldFlashTextClass);
setTimeout(function() {
self.removeClassName(self.element, self.textfieldFlashTextClass)
}, 100);
};
Spry.Widget.ValidationTextField.prototype.doValidations = function(testValue, revertValue)
{
if (this.isDisabled()) return false;
if (this.flags.locked) {
return false;
}
if (testValue.length == 0 && !this.isRequired) {
this.errors = 0;
return false;
}
this.flags.locked = true;
var mustRevert = false;
var continueValidations = true;
if (!this.options.isRequired && testValue.length == 0) {
continueValidations = false;
}
var errors = 0;
var fixedValue = testValue;
//characterMasking - test if all characters are valid with the characterMasking (keyboard filter)
if (this.useCharacterMasking && this.characterMasking) {
for(var i=0; i<testValue.length; i++) {
if (!this.characterMasking.test(testValue.charAt(i))) {
errors = errors | Spry.Widget.ValidationTextField.ERROR_FORMAT;
fixedValue = revertValue;
mustRevert = true;
break;
}
}
}
//regExpFilter - character mask positioning (additional mask to restrict some characters only in some position)
if (!mustRevert && this.useCharacterMasking && this.regExpFilter) {
if (!this.regExpFilter.test(fixedValue)) {
errors = errors | Spry.Widget.ValidationTextField.ERROR_FORMAT;
mustRevert = true;
}
}
//pattern - testValue matches the pattern so far
if (!mustRevert && this.pattern) {
var currentRegExp = this.patternToRegExp(testValue.length);
if (!currentRegExp.test(testValue)) {
errors = errors | Spry.Widget.ValidationTextField.ERROR_FORMAT;
mustRevert = true;
} else if (this.patternLength != testValue.length) {
//testValue matches pattern so far, but it's not ok if it does not have the proper length
//do not revert, but should show the error
errors = errors | Spry.Widget.ValidationTextField.ERROR_FORMAT;
}
}
if (fixedValue == '') {
errors = errors | Spry.Widget.ValidationTextField.ERROR_REQUIRED;
}
if (!mustRevert && this.pattern && this.useCharacterMasking) {
var n = this.getAutoComplete(testValue.length);
if (n) {
fixedValue += n;
}
}
if(!mustRevert && this.minChars !== null && continueValidations) {
if (testValue.length < this.minChars) {
errors = errors | Spry.Widget.ValidationTextField.ERROR_CHARS_MIN;
continueValidations = false;
}
}
if(!mustRevert && this.maxChars !== null && continueValidations) {
if (testValue.length > this.maxChars) {
errors = errors | Spry.Widget.ValidationTextField.ERROR_CHARS_MAX;
continueValidations = false;
}
}
//validation - testValue passes widget validation function
if (!mustRevert && this.validation && continueValidations) {
var value = this.validation(fixedValue, this.options);
if (false === value) {
errors = errors | Spry.Widget.ValidationTextField.ERROR_FORMAT;
continueValidations = false;
} else {
this.typedValue = value;
}
}
if(!mustRevert && this.validation && this.minValue !== null && continueValidations) {
var minValue = this.validation(this.minValue, this.options);
if (minValue !== false) {
if (this.typedValue < minValue) {
errors = errors | Spry.Widget.ValidationTextField.ERROR_RANGE_MIN;
continueValidations = false;
}
}
}
if(!mustRevert && this.validation && this.maxValue !== null && continueValidations) {
var maxValue = this.validation(this.maxValue, this.options);
if (maxValue !== false) {
if( this.typedValue > maxValue) {
errors = errors | Spry.Widget.ValidationTextField.ERROR_RANGE_MAX;
continueValidations = false;
}
}
}
//an invalid value was tested; must make sure it does not get inside the input
if (this.useCharacterMasking && mustRevert) {
this.revertState(revertValue);
}
this.errors = errors;
this.fixedValue = fixedValue;
this.flags.locked = false;
return mustRevert;
};
Spry.Widget.ValidationTextField.prototype.onChange = function(e)
{
if (Spry.is.opera && this.flags.operaRevertOnKeyUp) {
return true;
}
if (Spry.is.ie && e && e.propertyName != 'value') {
return true;
}
if (this.flags.drop) {
//delay this if it's a drop operation
var self = this;
setTimeout(function() {
self.flags.drop = false;
self.onChange(null);
}, 0);
return;
}
if (this.flags.hintOn) {
return true;
}
if (this.keyCode == 8 || this.keyCode == 46 ) {
var mustRevert = this.doValidations(this.input.value, this.input.value);
this.oldValue = this.input.value;
if ((mustRevert || this.errors) && this.validateOn & Spry.Widget.ValidationTextField.ONCHANGE) {
var self = this;
setTimeout(function() {self.validate();}, 0);
return true;
}
}
var mustRevert = this.doValidations(this.input.value, this.oldValue);
if ((!mustRevert || this.errors) && this.validateOn & Spry.Widget.ValidationTextField.ONCHANGE) {
var self = this;
setTimeout(function() {self.validate();}, 0);
}
return true;
};
Spry.Widget.ValidationTextField.prototype.onKeyUp = function(e) {
if (this.flags.operaRevertOnKeyUp) {
this.setValue(this.oldValue);
Spry.Widget.Utils.stopEvent(e);
this.selection.moveTo(this.selection.start, this.selection.start);
this.flags.operaRevertOnKeyUp = false;
return false;
}
if (this.flags.operaPasteOperation) {
window.clearInterval(this.flags.operaPasteOperation);
this.flags.operaPasteOperation = null;
}
};
Spry.Widget.ValidationTextField.prototype.operaPasteMonitor = function() {
if (this.input.value != this.oldValue) {
var mustRevert = this.doValidations(this.input.value, this.input.value);
if (mustRevert) {
this.setValue(this.oldValue);
this.selection.moveTo(this.selection.start, this.selection.start);
} else {
this.onChange();
}
}
};
Spry.Widget.ValidationTextField.prototype.compileDatePattern = function ()
{
var dateValidationPatternString = "";
var groupPatterns = [];
var fullGroupPatterns = [];
var autocompleteCharacters = [];
var formatRegExp = /^([mdy]+)([\.\-\/\\\s]+)([mdy]+)([\.\-\/\\\s]+)([mdy]+)$/i;
var formatGroups = this.options.format.match(formatRegExp);
if (formatGroups !== null) {
for (var i=1; i<formatGroups.length; i++) {
switch (formatGroups[i].toLowerCase()) {
case "dd":
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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -