📄 popupbehavior.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="../Animation/Animations.js" />
/// <reference path="../Animation/AnimationBehavior.js" />
Type.registerNamespace('AjaxControlToolkit');
AjaxControlToolkit.PopupBehavior = function(element) {
/// <summary>
/// The PopupBehavior is used to show/hide an element at a position
/// relative to another element
/// </summary>
/// <param name="element" type="Sys.UI.DomElement" mayBeNull="false" domElement="true">
/// The DOM element the behavior is associated with
/// </param>
AjaxControlToolkit.PopupBehavior.initializeBase(this, [element]);
this._x = 0;
this._y = 0;
this._positioningMode = AjaxControlToolkit.PositioningMode.Absolute;
this._parentElement = null;
this._parentElementID = null;
this._moveHandler = null;
this._firstPopup = true;
this._originalParent = null;
this._visible = false;
// Generic animation behaviors that automatically build animations
// from JSON descriptions
this._onShow = null;
this._onShowEndedHandler = null;
this._onHide = null;
this._onHideEndedHandler = null;
}
AjaxControlToolkit.PopupBehavior.prototype = {
initialize : function() {
/// <summary>
/// Initialize the PopupBehavior
/// </summary>
AjaxControlToolkit.PopupBehavior.callBaseMethod(this, 'initialize');
this._hidePopup();
this.get_element().style.position = "absolute";
// Create handlers for the animation ended events
this._onShowEndedHandler = Function.createDelegate(this, this._onShowEnded);
this._onHideEndedHandler = Function.createDelegate(this, this._onHideEnded);
},
dispose : function() {
/// <summary>
/// Dispose the PopupBehavior
/// </summary>
var element = this.get_element();
if (element) {
if (this._visible) {
this.hide();
}
if (this._originalParent) {
element.parentNode.removeChild(element);
this._originalParent.appendChild(element);
this._originalParent = null;
}
// Remove expando properties
element._hideWindowedElementsIFrame = null;
}
this._parentElement = null;
// Remove the animation ended events and wipe the animations
// (we don't need to dispose them because that will happen
// automatically in our base dispose)
if (this._onShow && this._onShow.get_animation() && this._onShowEndedHandler) {
this._onShow.get_animation().remove_ended(this._onShowEndedHandler);
}
this._onShowEndedHandler = null;
this._onShow = null;
if (this._onHide && this._onHide.get_animation() && this._onHideEndedHandler) {
this._onHide.get_animation().remove_ended(this._onHideEndedHandler);
}
this._onHideEndedHandler = null;
this._onHide = null;
AjaxControlToolkit.PopupBehavior.callBaseMethod(this, 'dispose');
},
show : function() {
/// <summary>
/// Show the popup
/// </summary>
// Ignore requests to hide multiple times
if (this._visible) {
return;
}
var eventArgs = new Sys.CancelEventArgs();
this.raiseShowing(eventArgs);
if (eventArgs.get_cancel()) {
return;
}
// Either show the popup or play an animation that does
// (note: even if we're animating, we still show and position
// the popup before hiding it again and playing the animation
// which makes the animation much simpler)
this._visible = true;
var element = this.get_element();
$common.setVisible(element, true);
this.setupPopup();
if (this._onShow) {
$common.setVisible(element, false);
this.onShow();
} else {
this.raiseShown(Sys.EventArgs.Empty);
}
},
hide : function() {
/// <summary>
/// Hide the popup
/// </summary>
// Ignore requests to hide multiple times
if (!this._visible) {
return;
}
var eventArgs = new Sys.CancelEventArgs();
this.raiseHiding(eventArgs);
if (eventArgs.get_cancel()) {
return;
}
// Either hide the popup or play an animation that does
this._visible = false;
if (this._onHide) {
this.onHide();
} else {
this._hidePopup();
this._hideCleanup();
}
},
getBounds : function() {
/// <summary>
/// Get the expected bounds of the popup relative to its parent
/// </summary>
/// <returns type="Sys.UI.Bounds" mayBeNull="false">
/// Bounds of the popup relative to its parent
/// </returns>
/// <remarks>
/// The actual final position can only be calculated after it is
/// initially set and we can verify it doesn't bleed off the edge
/// of the screen.
/// </remarks>
var element = this.get_element();
// offsetParent (doc element if absolutely positioned or no offsetparent available)
var offsetParent = element.offsetParent || document.documentElement;
// diff = difference in position between element's offsetParent and the element we will attach popup to.
// this is basically so we can position the popup in the right spot even though it may not be absolutely positioned
var diff;
var parentBounds;
if (this._parentElement) {
// we will be positioning the element against the assigned parent
parentBounds = $common.getBounds(this._parentElement);
var offsetParentLocation = $common.getLocation(offsetParent);
diff = {x: parentBounds.x - offsetParentLocation.x, y:parentBounds.y - offsetParentLocation.y};
} else {
// we will be positioning the element against the offset parent by default, since no parent element given
parentBounds = $common.getBounds(offsetParent);
diff = {x:0, y:0};
}
// width/height of the element, needed for calculations that involve width like centering
var width = element.offsetWidth - (element.clientLeft ? element.clientLeft * 2 : 0);
var height = element.offsetHeight - (element.clientTop ? element.clientTop * 2 : 0);
// Setting the width causes the element to grow by border+passing every
// time. But not setting it causes strange behavior in safari. Just set it once.
if (this._firstpopup) {
element.style.width = width + "px";
this._firstpopup = false;
}
var position;
switch (this._positioningMode) {
case AjaxControlToolkit.PositioningMode.Center:
position = {
x: Math.round(parentBounds.width / 2 - width / 2),
y: Math.round(parentBounds.height / 2 - height / 2)
};
break;
case AjaxControlToolkit.PositioningMode.BottomLeft:
position = {
x: 0,
y: parentBounds.height
};
break;
case AjaxControlToolkit.PositioningMode.BottomRight:
position = {
x: parentBounds.width - width,
y: parentBounds.height
};
break;
case AjaxControlToolkit.PositioningMode.TopLeft:
position = {
x: 0,
y: -element.offsetHeight
};
break;
case AjaxControlToolkit.PositioningMode.TopRight:
position = {
x: parentBounds.width - width,
y: -element.offsetHeight
};
break;
case AjaxControlToolkit.PositioningMode.Right:
position = {
x: parentBounds.width,
y: 0
};
break;
case AjaxControlToolkit.PositioningMode.Left:
position = {
x: -element.offsetWidth,
y: 0
};
break;
default:
position = {x: 0, y: 0};
}
position.x += this._x + diff.x;
position.y += this._y + diff.y;
return new Sys.UI.Bounds(position.x, position.y, width, height);
},
adjustPopupPosition : function(bounds) {
/// <summary>
/// Adjust the position of the popup after it's originally bet set
/// to make sure that it's visible on the page.
/// </summary>
/// <param name="bounds" type="Sys.UI.Bounds" mayBeNull="true" optional="true">
/// Original bounds of the parent element
/// </param>
var element = this.get_element();
if (!bounds) {
bounds = this.getBounds();
}
// Get the new bounds now that we've shown the popup
var newPosition = $common.getBounds(element);
var updateNeeded = false;
if (newPosition.x < 0) {
bounds.x -= newPosition.x;
updateNeeded = true;
}
if (newPosition.y < 0) {
bounds.y -= newPosition.y;
updateNeeded = true;
}
// If the popup was off the screen, reposition it
if (updateNeeded) {
$common.setLocation(element, bounds);
}
},
addBackgroundIFrame : function() {
/// <summary>
/// Add an empty IFRAME behind the popup (for IE6 only) so that SELECT, etc., won't
/// show through the popup.
/// </summary>
// Get the child frame
var element = this.get_element();
if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.version < 7)) {
var childFrame = element._hideWindowedElementsIFrame;
// Create the child frame if it wasn't found
if (!childFrame) {
childFrame = document.createElement("iframe");
childFrame.src = "javascript:'<html></html>';";
childFrame.style.position = "absolute";
childFrame.style.display = "none";
childFrame.scrolling = "no";
childFrame.frameBorder = "0";
childFrame.tabIndex = "-1";
childFrame.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)";
element.parentNode.insertBefore(childFrame, element);
element._hideWindowedElementsIFrame = childFrame;
this._moveHandler = Function.createDelegate(this, this._onMove);
Sys.UI.DomEvent.addHandler(element, "move", this._moveHandler);
}
// Position the frame exactly behind the element
$common.setBounds(childFrame, $common.getBounds(element));
childFrame.style.display = element.style.display;
if (element.currentStyle && element.currentStyle.zIndex) {
childFrame.style.zIndex = element.currentStyle.zIndex;
} else if (element.style.zIndex) {
childFrame.style.zIndex = element.style.zIndex;
}
}
},
setupPopup : function() {
/// <summary>
/// Position the popup relative to its parent
/// </summary>
var element = this.get_element();
var bounds = this.getBounds();
$common.setLocation(element, bounds);
// Tweak the position, set the zIndex, and add the background iframe in IE6
this.adjustPopupPosition(bounds);
element.zIndex = 1000;
this.addBackgroundIFrame();
},
_hidePopup : function() {
/// <summary>
/// Internal hide implementation
/// </summary>
var element = this.get_element();
$common.setVisible(element, false);
if (element.originalWidth) {
element.style.width = element.originalWidth + "px";
element.originalWidth = null;
}
},
_hideCleanup : function() {
/// <summary>
/// Perform cleanup after hiding the element
/// </summary>
var element = this.get_element();
// Remove the tracking handler
if (this._moveHandler) {
Sys.UI.DomEvent.removeHandler(element, "move", this._moveHandler);
this._moveHandler = null;
}
// Hide the child frame
if (Sys.Browser.agent === Sys.Browser.InternetExplorer) {
var childFrame = element._hideWindowedElementsIFrame;
if (childFrame) {
childFrame.style.display = "none";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -