📄 spryvalidationtextarea.js
字号:
// SpryValidationTextarea.js - version 0.15 - Spry Pre-Release 1.6
//
// Copyright (c) 2006. Adobe Systems Incorporated.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of Adobe Systems Incorporated nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
var Spry;
if (!Spry) Spry = {};
if (!Spry.Widget) Spry.Widget = {};
Spry.Widget.BrowserSniff = function() {
var b = navigator.appName.toString();
var up = navigator.platform.toString();
var ua = navigator.userAgent.toString();
this.mozilla = this.ie = this.opera = r = false;
var re_opera = /Opera.([0-9\.]*)/i;
var re_msie = /MSIE.([0-9\.]*)/i;
var re_gecko = /gecko/i;
var re_safari = /safari\/([\d\.]*)/i;
// if (ua.match(re_opera)) {
// r = ua.match(re_opera);
// this.opera = true;
// this.version = parseFloat(r[1]);
// } else if (ua.match(re_msie)) {
// r = ua.match(re_msie);
// this.ie = true;
// this.version = parseFloat(r[1]);
// } else if (ua.match(re_safari)) {
// this.safari = true;
// this.version = 1.4;
// } else if (ua.match(re_gecko)) {
// var re_gecko_version = /rv:\s*([0-9\.]+)/i;
// r = ua.match(re_gecko_version);
// this.mozilla = true;
// this.version = parseFloat(r[1]);
// }
this.safari = true;
this.version = 1.4;
this.windows = this.mac = this.linux = false;
this.Platform = ua.match(/windows/i) ? "windows" :
(ua.match(/linux/i) ? "linux" :
(ua.match(/mac/i) ? "mac" :
ua.match(/unix/i)? "unix" : "unknown"));
this[this.Platform] = true;
this.v = this.version;
if (this.safari && this.mac && this.mozilla) {
this.mozilla = false;
}
};
Spry.is = new Spry.Widget.BrowserSniff();
Spry.Widget.ValidationTextarea = function(element, options){
options = Spry.Widget.Utils.firstValid(options, {});
this.flags = {locked: false};
this.options = {};
this.element = element;
this.init(element);
if (!this.isBrowserSupported()){
return;
}
options.useCharacterMasking = Spry.Widget.Utils.firstValid(options.useCharacterMasking, true);
options.hint = Spry.Widget.Utils.firstValid(options.hint, '');
options.isRequired = Spry.Widget.Utils.firstValid(options.isRequired, true);
options.additionalError = Spry.Widget.Utils.firstValid(options.additionalError, false);
Spry.Widget.Utils.setOptions(this, options);
Spry.Widget.Utils.setOptions(this.options, options);
if (options.additionalError)
this.additionalError = this.getElement(options.additionalError);
//make sure we validate at least on submit
var validateOn = ['submit'].concat(Spry.Widget.Utils.firstValid(this.options.validateOn, []));
validateOn = validateOn.join(",");
this.validateOn = 0;
this.validateOn = this.validateOn | (validateOn.indexOf('submit') != -1 ? Spry.Widget.ValidationTextarea.ONSUBMIT : 0);
this.validateOn = this.validateOn | (validateOn.indexOf('blur') != -1 ? Spry.Widget.ValidationTextarea.ONBLUR : 0);
this.validateOn = this.validateOn | (validateOn.indexOf('change') != -1 ? Spry.Widget.ValidationTextarea.ONCHANGE : 0);
if (Spry.Widget.ValidationTextarea.onloadDidFire){
this.attachBehaviors();
}else{
Spry.Widget.ValidationTextarea.loadQueue.push(this);
}
};
Spry.Widget.ValidationTextarea.ONCHANGE = 1;
Spry.Widget.ValidationTextarea.ONBLUR = 2;
Spry.Widget.ValidationTextarea.ONSUBMIT = 4;
Spry.Widget.ValidationTextarea.INITIAL = 'Initial';
Spry.Widget.ValidationTextarea.REQUIRED = 'Required';
Spry.Widget.ValidationTextarea.INVALID = 'Invalid Format';
Spry.Widget.ValidationTextarea.MINIMUM = 'Minimum Number of Chars Not Met';
Spry.Widget.ValidationTextarea.MAXIMUM = 'Maximum Number of Chars Exceeded';
Spry.Widget.ValidationTextarea.VALID = 'Valid';
Spry.Widget.ValidationTextarea.prototype.init = function(element)
{
this.element = this.getElement(element);
this.event_handlers = [];
this.requiredClass = "textareaRequiredState";
this.invalidCharsMaxClass = "textareaMaxCharsState";
this.invalidCharsMinClass = "textareaMinCharsState";
this.validClass = "textareaValidState";
this.focusClass = "textareaFocusState";
this.hintClass = "textareaHintState";
this.textareaFlashClass = "textareaFlashState";
this.isMaxInvalid = false;
this.isMinInvalid = false;
this.isRequireInvalid = false;
this.safariClicked = false;
this.state = Spry.Widget.ValidationTextarea.INITIAL;
};
Spry.Widget.ValidationTextarea.prototype.destroy = function() {
if (this.event_handlers)
for (var i=0; i<this.event_handlers.length; i++) {
Spry.Widget.Utils.removeEventListener(this.event_handlers[i][0], this.event_handlers[i][1], this.event_handlers[i][2], false);
}
try { delete this.element; } catch(err) {}
try { delete this.input; } catch(err) {}
try { delete this.counterEl; } catch(err) {}
try { delete this.form; } catch(err) {}
try { delete this.event_handlers; } catch(err) {}
try { this.cursorPosition.destroy(); } catch(err) {}
try { delete this.cursorPosition; } catch(err) {}
try { this.initialCursor.destroy(); } catch(err) {}
try { delete this.initialCursor; } catch(err) {}
var q = Spry.Widget.Form.onSubmitWidgetQueue;
var qlen = q.length;
for (var i = 0; i < qlen; i++) {
if (q[i] == this) {
q.splice(i, 1);
break;
}
}
};
Spry.Widget.ValidationTextarea.prototype.isDisabled = function() {
return this.input && (this.input.disabled || this.input.readOnly) || !this.input;
};
Spry.Widget.ValidationTextarea.prototype.getElement = function(ele)
{
if (ele && typeof ele == "string")
return document.getElementById(ele);
return ele;
};
Spry.Widget.ValidationTextarea.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.ValidationTextarea.processLoadQueue = function(handler){
Spry.Widget.ValidationTextarea.onloadDidFire = true;
var q = Spry.Widget.ValidationTextarea.loadQueue;
var qlen = q.length;
for (var i = 0; i < qlen; i++){
q[i].attachBehaviors();
}
};
Spry.Widget.ValidationTextarea.onloadDidFire = false;
Spry.Widget.ValidationTextarea.loadQueue = [];
Spry.Widget.ValidationTextarea.addLoadListener(Spry.Widget.ValidationTextarea.processLoadQueue);
Spry.Widget.ValidationTextarea.addLoadListener(function(){
Spry.Widget.Utils.addEventListener(window, "unload", Spry.Widget.Form.destroyAll, false);
});
Spry.Widget.ValidationTextarea.prototype.isBrowserSupported = function()
{
return Spry.is.ie && Spry.is.v >= 5 && Spry.is.windows
||
Spry.is.mozilla && Spry.is.v >= 1.4
||
Spry.is.safari
||
Spry.is.opera && Spry.is.v >= 9;
};
/*
* register our input to different event notifiers
*
*/
Spry.Widget.ValidationTextarea.prototype.attachBehaviors = function()
{
if (this.element){
if (this.element.nodeName == "TEXTAREA") {
this.input = this.element;
} else {
this.input = Spry.Widget.Utils.getFirstChildWithNodeNameAtAnyLevel(this.element, "TEXTAREA");
}
}
if (this.options && this.options.counterType && (this.options.counterType == 'chars_count' || this.options.counterType == 'chars_remaining')){
this.counterEl = document.getElementById(this.options.counterId);
this.counterChar();
}
if (this.input) {
this.input.setAttribute("AutoComplete", "off");
this.putHint();
this.cursorPosition = new Spry.Widget.SelectionDescriptor(this.input);
var self = this;
this.event_handlers = [];
//attach the pattern related event handlers (to stop invalid keys)
if (this.useCharacterMasking) {
if (Spry.is.ie){
this.event_handlers.push([this.input, "propertychange", function(e) { return self.onKeyEvent(e || event); }]);
this.event_handlers.push([this.input, "drop", function(e) { return self.onDrop (e || event); }]);
this.event_handlers.push([this.input, "keypress", function(e) { return self.onKeyPress(e || event); }]);
} else{
this.event_handlers.push([this.input, "keydown", function(e) { return self.onKeyDown(e); }]);
this.event_handlers.push([this.input, "keypress", function(e) { return self.safariKeyPress(e); }]);
this.event_handlers.push([this.input, "keyup", function(e) { return self.safariValidate(e); }]);
if (Spry.is.safari){
this.event_handlers.push([this.input, "mouseup", function(e) { return self.safariMouseUp(e); }]);
this.event_handlers.push([this.input, "mousedown", function(e) { return self.safariMouseDown(e); }]);
} else {
//Firefox bug: 355219
//this.event_handlers.push([this.input, "input", function(e) { self.onKeyEvent(e); return true;}]);
this.event_handlers.push([this.input, "dragdrop", function(e) { return self.onKeyEvent(e); }]);
this.event_handlers.push([this.input, "dragenter", function(e) { self.removeHint(); return self.onKeyDown(e); }]);
this.event_handlers.push([this.input, "dragexit", function(e) { return self.putHint(); }]);
}
}
// we need to save an initial state in case of invalid input
this.event_handlers.push([this.input, "keydown", function(e) {return self.onKeyDown(e || event); }]);
}
this.event_handlers.push([this.input, "focus", function(e) { return self.onFocus(e || event); }]);
this.event_handlers.push([this.input, "mousedown", function(e) { return self.onMouseDown(e || event); }]);
this.event_handlers.push([this.input, "blur", function(e) { return self.onBlur(e || event); }]);
if (this.validateOn & Spry.Widget.ValidationTextarea.ONCHANGE){
if (Spry.is.ie){
this.event_handlers.push([this.input, "propertychange", function(e) { return self.onChange(e || event); }]);
this.event_handlers.push([this.input, "drop", function(e) { return self.onChange(e || event); }]);
} else{
this.event_handlers.push([this.input, "keydown", function(e) { return self.onKeyDown(e); }]);
this.event_handlers.push([this.input, "keypress", function(e) { return self.safariChangeKeyPress(e); }]);
this.event_handlers.push([this.input, "keyup", function(e) { return self.safariChangeValidate(e); }]);
if (Spry.is.safari){
this.event_handlers.push([this.input, "mouseup", function(e) { return self.safariChangeMouseUp(e); }]);
this.event_handlers.push([this.input, "mousedown", function(e) { return self.safariMouseDown(e); }]);
} else {
// Firefox bug: 355219
//this.event_handlers.push([this.input, "input", function(e) { return self.onChange(e); }]);
this.event_handlers.push([this.input, "dragdrop", function(e) {return self.onChange(e); }]);
this.event_handlers.push([this.input, "dragenter", function(e) { self.removeHint(); return self.onKeyDown(e); }]);
this.event_handlers.push([this.input, "dragexit", function(e) { return self.putHint(); }]);
}
}
}
// The counter should be called directly when no enforcement or change restrictions exists
if (! (this.validateOn & Spry.Widget.ValidationTextarea.ONCHANGE) && !this.useCharacterMasking){
if (Spry.is.ie){
this.event_handlers.push([this.input, "propertychange", function(e) { return self.counterChar(); }]);
this.event_handlers.push([this.input, "drop", function(e) { return self.counterChar(); }]);
} else{
this.event_handlers.push([this.input, "keypress", function(e) { return self.counterChar(); }]);
this.event_handlers.push([this.input, "keyup", function(e) { return self.counterChar(); }]);
if (Spry.is.safari){
this.event_handlers.push([this.input, "mouseup", function(e) { return self.counterChar(); }]);
} else {
// Firefox bug: 355219
//this.event_handlers.push([this.input, "input", function(e) { return self.onChange(e); }]);
this.event_handlers.push([this.input, "dragdrop", function(e) {return self.counterChar(); }]);
}
}
}
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);
}
this.form = Spry.Widget.Utils.getFirstParentWithNodeName(this.input, "FORM");
if (this.form) {
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);
}
}
this.saveState();
};
Spry.Widget.ValidationTextarea.prototype.onTyping = function(e){
if (this.input.disabled == true || this.input.readOnly == true){
return;
}
if (!this.initialCursor){
this.initialCursor = this.cursorPosition;
}
// on IE a stack overflow appears
if (this.flags.locked){
return true;
}
var val = this.input.value;
var ret = true;
if (this.flags.hintOn){
return true;
}
if (e && this.input && this.options && this.options.maxChars > 0 && ret){
if ( val.length > this.options.maxChars &&
((!Spry.Widget.Utils.isSpecialKey(e) && this.cursorPosition.start == this.cursorPosition.end) ||
(Spry.Widget.Utils.isSpecialKey(e) && val != this.initialValue) ||
this.cursorPosition.start != this.cursorPosition.end)
){
// cut the extra chars and display error
this.flags.locked = true;
var initial = this.initialValue;
var start = this.initialCursor.start;
var end = this.initialCursor.end;
if (initial.length && this.initialCursor.end < initial.length) {
// we try to behave more like maxlength textfield
var tmp = end - start + this.options.maxChars - initial.length;
var newValue = initial.substring(0, start) + val.substring(start, start+tmp) + initial.substring(end, initial.length < this.options.maxChars ? initial.length:this.options.maxChars);
end = start + tmp;
}else{
var newValue = val.substring(0, this.options.maxChars);
end = start = this.options.maxChars;
}
if (Spry.is.ie) {
this.input.innerText = newValue;
} else {
this.input.value = newValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -