📄 sliderbehavior.js
字号:
// (c) Copyright Microsoft Corporation.
// This source is subject to the Microsoft Permissive License.
// See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
// All other rights reserved.
/// <reference name="MicrosoftAjax.debug.js" />
/// <reference name="MicrosoftAjaxTimer.debug.js" />
/// <reference name="MicrosoftAjaxWebForms.debug.js" />
/// <reference path="../ExtenderBase/BaseScripts.js" />
/// <reference path="../Common/Common.js" />
/// <reference path="../Compat/Timer/Timer.js" />
/// <reference path="../Compat/DragDrop/DragDropScripts.js" />
/// <reference path="../Animation/Animations.js" />
Type.registerNamespace('AjaxControlToolkit');
// _SliderDragDropManagerInternal
// This is a DragDropManager that returns always a GenericDragDropManager instance.
// It is used in the Slider control to prevent IE from displaying the drag/drop icons
// when dragging the slider's handle.
//
AjaxControlToolkit._SliderDragDropManagerInternal = function() {
AjaxControlToolkit._SliderDragDropManagerInternal.initializeBase(this);
this._instance = null;
}
AjaxControlToolkit._SliderDragDropManagerInternal.prototype = {
_getInstance : function() {
this._instance = new AjaxControlToolkit.GenericDragDropManager();
this._instance.initialize();
this._instance.add_dragStart(Function.createDelegate(this, this._raiseDragStart));
this._instance.add_dragStop(Function.createDelegate(this, this._raiseDragStop));
return this._instance;
}
}
AjaxControlToolkit._SliderDragDropManagerInternal.registerClass('AjaxControlToolkit._SliderDragDropManagerInternal', AjaxControlToolkit._DragDropManager);
AjaxControlToolkit.SliderDragDropManagerInternal = new AjaxControlToolkit._SliderDragDropManagerInternal();
// SliderOrientation
// Specifies the orientation of the slider.
//
AjaxControlToolkit.SliderOrientation = function() {
}
AjaxControlToolkit.SliderOrientation.prototype = {
Horizontal : 0,
Vertical : 1
}
AjaxControlToolkit.SliderOrientation.registerEnum('AjaxControlToolkit.SliderOrientation', false);
// The SliderBehavior upgrades a textbox to a graphical slider.
//
AjaxControlToolkit.SliderBehavior = function(element) {
AjaxControlToolkit.SliderBehavior.initializeBase(this, [element]);
// Members
//
this._minimum = 0;
this._maximum = 100;
this._value = null;
this._steps = 0;
this._decimals = 0;
this._orientation = AjaxControlToolkit.SliderOrientation.Horizontal;
this._railElement = null;
this._railCssClass = null;
this._isHorizontal = true;
this._isUpdatingInternal = false;
this._isInitializedInternal = false;
this._enableHandleAnimation = false;
this._handle = null;
this._handleImage = null;
this._handleAnimation = null;
this._handleAnimationDuration = 0.1;
this._handleImageUrl = null;
this._handleCssClass = null;
this._dragHandle = null;
this._mouseupHandler = null;
this._selectstartHandler = null;
this._boundControlChangeHandler = null;
this._boundControlKeyPressHandler = null;
this._boundControlID = null;
this._boundControl = null;
this._length = null;
this._raiseChangeOnlyOnMouseUp = true;
this._animationPending = false;
this._selectstartPending = false;
this._tooltipText = '';
// Events
//
// sliderInitialized
// valueChanged
// slideStart
// slideEnd
}
AjaxControlToolkit.SliderBehavior.prototype = {
// initialize / dispose
//
initialize : function() {
AjaxControlToolkit.SliderBehavior.callBaseMethod(this, 'initialize');
this._initializeLayout();
},
dispose : function() {
this._disposeHandlers();
this._disposeBoundControl();
if(this._enableHandleAnimation && this._handleAnimation) {
this._handleAnimation.dispose();
}
AjaxControlToolkit.SliderBehavior.callBaseMethod(this, 'dispose');
},
// _initializeLayout
_initializeLayout : function() {
// Element for the slider's rail.
this._railElement = document.createElement('DIV');
this._railElement.id = this.get_id() + '_railElement';
// Key events in Firefox are raised only if a DIV has
// tabIndex set to -1.
this._railElement.tabIndex = -1;
// Layout for the slider's handle.
this._railElement.innerHTML = '<div></div>';
this._handle = this._railElement.childNodes[0];
this._handle.style.overflow = 'hidden';
this._handle.style.position = 'absolute';
// Initialize left and top to 0px for Opera
if(Sys.Browser.agent == Sys.Browser.Opera) {
this._handle.style.left = '0px';
this._handle.style.top = '0px';
}
// Replace the textbox with the graphical slider.
var textBoxElement = this.get_element();
var textBoxElementBounds = $common.getBounds(textBoxElement);
textBoxElement.parentNode.insertBefore(this._railElement, textBoxElement);
textBoxElement.style.display = 'none';
// This is a flag for saving keystrokes.
this._isHorizontal = (this._orientation == AjaxControlToolkit.SliderOrientation.Horizontal);
var defaultRailCssClass = (this._isHorizontal) ? 'ajax__slider_h_rail' : 'ajax__slider_v_rail';
var defaultHandleCssClass = (this._isHorizontal) ? 'ajax__slider_h_handle' : 'ajax__slider_v_handle';
var defaultHandleImageUrl = (this._isHorizontal) ? '<%= WebResource("AjaxControlToolkit.Slider.Images.slider_h_handle.gif") %>'
: '<%= WebResource("AjaxControlToolkit.Slider.Images.slider_v_handle.gif") %>';
this._railElement.className = (this._railCssClass) ? this._railCssClass : defaultRailCssClass;
this._handle.className = (this._handleCssClass) ? this._handleCssClass : defaultHandleCssClass;
if(!this._handleImageUrl) this._handleImageUrl = defaultHandleImageUrl;
// If the length property is set, override rail's CSS.
if (this._isHorizontal) {
if(this._length) this._railElement.style.width = this._length;
}
else {
if(this._length) this._railElement.style.height = this._length;
}
this._loadHandleImage();
// Enforce positioning set via the associated textbox's style.
this._enforceTextBoxElementPositioning();
// Layout is done.
this._initializeSlider();
},
// _enforceTextBoxElementPositioning
// Enforce positioning set via the associated textbox's style.
//
_enforceTextBoxElementPositioning : function() {
var tbPosition =
{
position: this.get_element().style.position,
top: this.get_element().style.top,
right: this.get_element().style.right,
bottom: this.get_element().style.bottom,
left: this.get_element().style.left
};
if(tbPosition.position != '') {
this._railElement.style.position = tbPosition.position;
}
if(tbPosition.top != '') {
this._railElement.style.top = tbPosition.top;
}
if(tbPosition.right != '') {
this._railElement.style.right = tbPosition.right;
}
if(tbPosition.bottom != '') {
this._railElement.style.bottom = tbPosition.bottom;
}
if(tbPosition.left != '') {
this._railElement.style.left = tbPosition.left;
}
},
// _loadHandleImage
// This method loads the image used for the handle.
//
_loadHandleImage : function() {
this._handleImage = document.createElement('IMG');
this._handleImage.id = this.get_id() + '_handleImage';
this._handle.appendChild(this._handleImage);
this._handleImage.src = this._handleImageUrl;
},
// _initializeSlider
// This method initializes the slider control and is called after the
// layout has been setup.
//
_initializeSlider : function() {
this._initializeBoundControl();
// Check if a value is already set in the textbox.
var _elementValue;
try {
_elementValue = parseFloat(this.get_element().value);
} catch(ex) {
_elementValue = Number.NaN;
}
this.set_Value(_elementValue);
// Position the slider's handle to the current value.
this._setHandleOffset(this._value);
// Setup the invisible drag handle.
this._initializeDragHandle();
// Register ourselves as a drop target.
AjaxControlToolkit.SliderDragDropManagerInternal.registerDropTarget(this);
this._initializeHandlers();
this._initializeHandleAnimation();
this._isInitializedInternal = true;
this._raiseEvent('sliderInitialized');
},
// _initializeBoundControl
// Creates and initializes the control that is bound to the slider.
//
_initializeBoundControl : function() {
if(this._boundControl) {
var isInputElement = this._boundControl.nodeName == 'INPUT';
if(isInputElement) {
this._boundControlChangeHandler = Function.createDelegate(this, this._onBoundControlChange);
this._boundControlKeyPressHandler = Function.createDelegate(this, this._onBoundControlKeyPress);
$addHandler(this._boundControl, 'change', this._boundControlChangeHandler);
$addHandler(this._boundControl, 'keypress', this._boundControlKeyPressHandler);
}
}
},
_disposeBoundControl : function() {
if(this._boundControl) {;
var isInputElement = this._boundControl.nodeName == 'INPUT';
if(isInputElement) {
$removeHandler(this._boundControl, 'change', this._boundControlChangeHandler);
$removeHandler(this._boundControl, 'keypress', this._boundControlKeyPressHandler);
}
}
},
_onBoundControlChange : function(evt) {
this._animationPending = true;
this._setValueFromBoundControl();
},
_onBoundControlKeyPress : function(evt) {
if(evt.charCode == 13) {
this._animationPending = true;
this._setValueFromBoundControl();
evt.preventDefault();
}
},
_setValueFromBoundControl : function() {
this._isUpdatingInternal = true;
if(this._boundControlID) {
this._calcValue($get(this._boundControlID).value);
}
this._isUpdatingInternal = false;
},
// _initializeHandleAnimation
// Initializes the animation for the handle element.
//
_initializeHandleAnimation : function() {
if(this._steps > 0) {
this._enableHandleAnimation = false;
return;
}
if(this._enableHandleAnimation) {
this._handleAnimation = new AjaxControlToolkit.Animation.LengthAnimation(
this._handle, this._handleAnimationDuration, 100, 'style');
}
},
// _ensureBinding
//
_ensureBinding : function() {
if(this._boundControl) {
var value = this._value;
if(value >= this._minimum || value <= this._maximum) {
var isInputElement = this._boundControl.nodeName == 'INPUT';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -