📄 spryvalidationtextarea.js
字号:
this.cursorPosition.moveTo(end, end);
this.flags.locked = false;
ret = false;
} else{
this.setState(Spry.Widget.ValidationTextarea.VALID);
this.isMaxInvalid = false;
}
}
this.counterChar();
return ret;
};
Spry.Widget.ValidationTextarea.prototype.validateMinRequired = function(val){
var oldInvalid = false;
if (typeof this.notFireMinYet == 'undefined'){
this.notFireMinYet = false;
}else{
oldInvalid = true;
this.notFireMinYet = true;
}
if (this.onBlurOn){
this.notFireMinYet = true;
}else if (!this.onKeyEventOn){
this.notFireMinYet = true;
}
if (this.input && this.options && this.options.isRequired){
if (val.length > 0 && this.isRequireInvalid && (!this.hint || (this.hint && !this.flags.hintOn) || (this.hint && val != this.hint))){
this.switchClassName(this.validClass);
this.setState(Spry.Widget.ValidationTextarea.VALID);
this.isRequireInvalid = false;
}else if ((val.length == 0 || !(!this.hint || (this.hint && !this.flags.hintOn) || (this.hint && val != this.hint))) && (!this.isRequireInvalid || oldInvalid)){
if (this.notFireMinYet || Spry.is.ie){
this.switchClassName(this.requiredClass);
this.setState(Spry.Widget.ValidationTextarea.REQUIRED);
}
this.isRequireInvalid = true;
this.isMinInvalid = false;
}
}
if (this.input && this.options && this.options.minChars > 0 && !this.isRequireInvalid){
if (val.length >= this.options.minChars && (!this.hint || (this.hint && !this.flags.hintOn) || (this.hint && val != this.hint)) && this.isMinInvalid){
this.switchClassName(this.validClass);
this.setState(Spry.Widget.ValidationTextarea.VALID);
this.isMinInvalid = false;
}else if ( (val.length < this.options.minChars || (this.hint && val == this.hint && this.flags.hintOn)) && !this.isMinInvalid){
this.switchClassName(this.invalidCharsMinClass);
this.setState(Spry.Widget.ValidationTextarea.MINIMUM);
this.isMinInvalid = true;
}
}
};
Spry.Widget.ValidationTextarea.prototype.counterChar = function(){
if (!this.counterEl || !this.options || !this.options.counterType || (this.options.counterType != 'chars_remaining' && this.options.counterType != 'chars_count')){
return;
}
if (this.options.counterType == 'chars_remaining') {
if (this.options.maxChars > 0){
if (this.flags.hintOn){
this.setCounterElementValue(this.options.maxChars);
} else {
if (this.options.maxChars > this.input.value.length){
this.setCounterElementValue(this.options.maxChars - this.input.value.length);
}else{
this.setCounterElementValue(0);
}
}
}
} else {
if (this.flags.hintOn){
this.setCounterElementValue(0);
} else {
if (this.useCharacterMasking && typeof this.options.maxChars != 'undefined' && this.options.maxChars < this.input.value.length){
this.setCounterElementValue(this.options.maxChars);
} else {
this.setCounterElementValue(this.input.value.length);
}
}
}
};
Spry.Widget.ValidationTextarea.prototype.setCounterElementValue = function(val){
if ( this.counterEl.nodeName.toLowerCase() != 'input' &&
this.counterEl.nodeName.toLowerCase() != 'textarea' &&
this.counterEl.nodeName.toLowerCase() != 'select' &&
this.counterEl.nodeName.toLowerCase() != 'img'){
this.counterEl.innerHTML = val;
}
};
Spry.Widget.ValidationTextarea.prototype.reset = function() {
this.removeHint();
this.removeClassName(this.requiredClass);
this.removeClassName(this.invalidCharsMinClass);
this.removeClassName(this.invalidCharsMaxClass);
this.removeClassName(this.validClass);
this.setState(Spry.Widget.ValidationTextarea.INITIAL);
var self = this;
setTimeout(function() {self.putHint();self.counterChar();}, 10);
};
Spry.Widget.ValidationTextarea.prototype.validate = function(){
if (this.input.disabled == true || this.input.readOnly == true){
return true;
}
var val = this.input.value;
this.validateMinRequired(val);
var ret = !this.isMinInvalid && !this.isRequireInvalid;
if (ret && this.options.maxChars > 0 && !this.useCharacterMasking){
if (val.length <= this.options.maxChars || (this.hint && this.hint == val && this.flags.hintOn)) {
this.switchClassName(this.validClass);
this.setState(Spry.Widget.ValidationTextarea.VALID);
this.isMaxInvalid = false;
}else{
this.switchClassName(this.invalidCharsMaxClass);
this.setState(Spry.Widget.ValidationTextarea.MAXIMUM);
this.isMaxInvalid = true;
}
}
ret = ret && !this.isMaxInvalid;
if (ret) {
this.switchClassName(this.validClass);
}
this.counterChar();
return ret;
};
Spry.Widget.ValidationTextarea.prototype.setState = function(newstate){
this.state = newstate;
};
Spry.Widget.ValidationTextarea.prototype.getState = function(){
return this.state;
};
Spry.Widget.ValidationTextarea.prototype.removeHint = function()
{
if (this.flags.hintOn) {
this.flags.locked = true;
this.input.value = "";
this.flags.locked = false;
this.flags.hintOn = false;
}
};
Spry.Widget.ValidationTextarea.prototype.putHint = function()
{
if(this.hint && this.input.value == "") {
this.flags.hintOn = true;
this.input.value = this.hint;
}
};
Spry.Widget.ValidationTextarea.prototype.redTextFlash = function()
{
var self = this;
this.addClassName(this.textareaFlashClass);
setTimeout(function() {
self.removeClassName(self.textareaFlashClass)
}, 200);
};
Spry.Widget.ValidationTextarea.prototype.onKeyPress = function(e)
{
//ENTER has length 2 on IE Windows, so will exceed maxLength on proximity
if (Spry.is.ie && Spry.is.windows && e.keyCode == 13) {
if ( (this.initialCursor.length + this.options.maxChars - this.input.value.length) < 2) {
Spry.Widget.Utils.stopEvent(e);
return false;
}
}
};
Spry.Widget.ValidationTextarea.prototype.onKeyDown = function(e)
{
this.saveState();
this.keyCode = e.keyCode;
return true;
};
/*
* hadle for the max chars restrictions
* if key pressed or the input text is invalid it returns false
*
*/
Spry.Widget.ValidationTextarea.prototype.onKeyEvent = function(e){
// on IE we look only for this input value changes
if (e.type == 'propertychange' && e.propertyName != 'value'){
return true;
}
var allow = this.onTyping(e);
if (!allow){
Spry.Widget.Utils.stopEvent(e);
}
//return allow;
};
/*
* handle for the min or required value
* if the input text is invalid it returns false
*
*/
Spry.Widget.ValidationTextarea.prototype.onChange = function(e){
if (Spry.is.ie && e && e.type == 'propertychange' && 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 true;
}
if (this.flags.hintOn) {
return true;
}
this.onKeyEventOn = true;
var answer = this.validate();
this.onKeyEventOn = false;
return answer;
};
Spry.Widget.ValidationTextarea.prototype.onMouseDown = function(e)
{
if (this.flags.active) {
//mousedown fires before focus
//avoid double saveState on first focus by mousedown by checking if the control has focus
//do nothing if it's not focused because saveState will be called onfocus
this.saveState();
}
};
Spry.Widget.ValidationTextarea.prototype.onDrop = function(e)
{
//mark that a drop operation is in progress to avoid race conditions with event handlers for other events
//especially onchange and onfocus
this.flags.drop = true;
this.removeHint();
if (Spry.is.ie) {
var rng = document.body.createTextRange();
rng.moveToPoint(e.x, e.y);
rng.select();
}
this.saveState();
this.flags.active = true;
this.addClassName(this.focusClass);
};
Spry.Widget.ValidationTextarea.prototype.onFocus = function(e)
{
if (this.flags.drop) {
return;
}
this.removeHint();
this.saveState();
this.flags.active = true;
this.addClassName(this.focusClass);
};
Spry.Widget.ValidationTextarea.prototype.onBlur = function(e){
this.removeClassName(this.focusClass);
if (this.validateOn & Spry.Widget.ValidationTextarea.ONBLUR) {
this.onBlurOn = true;
this.validate();
this.onBlurOn = false;
}
this.flags.active = false;
var self = this;
setTimeout(function() {self.putHint();}, 10);
};
Spry.Widget.ValidationTextarea.prototype.safariMouseDown = function(e){
this.safariClicked = true;
};
Spry.Widget.ValidationTextarea.prototype.safariChangeMouseUp = function(e){
if (!this.safariClicked){
this.onKeyDown(e);
return this.safariChangeValidate(e, false);
}else{
this.safariClicked = false;
return true;
}
};
Spry.Widget.ValidationTextarea.prototype.safariMouseUp = function(e){
if (!this.safariClicked){
this.onKeyDown(e);
return this.safariValidate(e, false);
}else{
this.safariClicked = false;
return true;
}
};
Spry.Widget.ValidationTextarea.prototype.safariKeyPress = function(e){
this.safariFlag = new Date();
return this.safariValidate(e, true);
};
Spry.Widget.ValidationTextarea.prototype.safariValidate = function(e, recall)
{
if (e.keyCode && Spry.Widget.Utils.isSpecialKey(e) && e.keyCode != 8 && e.keyCode != 46){
return true;
}
var answer = this.onTyping(e);
// the answer to this is not yet final - we schedule another closing check
if (new Date() - this.safariFlag < 1000 && recall){
var self = this;
setTimeout(function(){self.safariValidate(e, false);}, 1000);
}
return answer;
};
Spry.Widget.ValidationTextarea.prototype.safariChangeKeyPress = function(e){
this.safariChangeFlag = new Date();
return this.safariChangeValidate(e, true);
};
Spry.Widget.ValidationTextarea.prototype.safariChangeValidate = function(e, recall){
if(e.keyCode && Spry.Widget.Utils.isSpecialKey(e) && e.keyCode != 8 && e.keyCode != 46){
return true;
}
var answer = this.onChange(e);
// the answer to this is not yet final - we schedule another closing check
if (new Date() - this.safariChangeFlag < 1000 && recall){
var self = this;
setTimeout(function(){ self.safariChangeValidate(e, false);}, 1000 - new Date() + this.safariChangeFlag);
}
return answer;
};
/*
* save an initial state of the input to restore if the value is invalid
*
*/
Spry.Widget.ValidationTextarea.prototype.saveState = function(e){
// we don't need this initial value that is already invalid
if (this.options.maxChars > 0 && this.input.value.length > this.options.maxChars){
return;
}
this.cursorPosition.update();
if (!this.flags.hintOn){
this.initialValue = this.input.value;
}else{
this.initialValue = '';
}
this.initialCursor = this.cursorPosition;
return true;
};
Spry.Widget.ValidationTextarea.prototype.checkClassName = function(ele, className){
if (!ele || !className){
return false;
}
if (typeof ele == 'string' ) {
ele = document.getElementById(ele);
if (!ele){
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -