📄 modalpopupbehavior.js
字号:
while (tempRelativeOrAbsoluteParent && (tempRelativeOrAbsoluteParent != document.documentElement)) {
if((tempRelativeOrAbsoluteParent.style.position != 'relative') && (tempRelativeOrAbsoluteParent.style.position != 'absolute')) {
tempRelativeOrAbsoluteParent = tempRelativeOrAbsoluteParent.parentNode;
} else {
this._relativeOrAbsoluteParentElement = tempRelativeOrAbsoluteParent;
break;
}
}
}
// Disable TAB
this.disableTab();
this._layout();
// On pages that don't need scrollbars, Firefox and Safari act like
// one or both are present the first time the layout code runs which
// obviously leads to display issues - run the layout code a second
// time to work around this problem
this._layout();
this.raiseShown(Sys.EventArgs.Empty);
},
disableTab : function() {
/// <summary>
/// Change the tab indices so we only tab through the modal popup
/// (and hide SELECT tags in IE6)
/// </summary>
var i = 0;
var tagElements;
var tagElementsInPopUp = new Array();
Array.clear(this._saveTabIndexes);
//Save all popup's tag in tagElementsInPopUp
for (var j = 0; j < this._tagWithTabIndex.length; j++) {
tagElements = this._foregroundElement.getElementsByTagName(this._tagWithTabIndex[j]);
for (var k = 0 ; k < tagElements.length; k++) {
tagElementsInPopUp[i] = tagElements[k];
i++;
}
}
i = 0;
for (var j = 0; j < this._tagWithTabIndex.length; j++) {
tagElements = document.getElementsByTagName(this._tagWithTabIndex[j]);
for (var k = 0 ; k < tagElements.length; k++) {
if (Array.indexOf(tagElementsInPopUp, tagElements[k]) == -1) {
this._saveTabIndexes[i] = {tag: tagElements[k], index: tagElements[k].tabIndex};
tagElements[k].tabIndex="-1";
i++;
}
}
}
//IE6 Bug with SELECT element always showing up on top
i = 0;
if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.version < 7)) {
//Save SELECT in PopUp
var tagSelectInPopUp = new Array();
for (var j = 0; j < this._tagWithTabIndex.length; j++) {
tagElements = this._foregroundElement.getElementsByTagName('SELECT');
for (var k = 0 ; k < tagElements.length; k++) {
tagSelectInPopUp[i] = tagElements[k];
i++;
}
}
i = 0;
Array.clear(this._saveDesableSelect);
tagElements = document.getElementsByTagName('SELECT');
for (var k = 0 ; k < tagElements.length; k++) {
if (Array.indexOf(tagSelectInPopUp, tagElements[k]) == -1) {
this._saveDesableSelect[i] = {tag: tagElements[k], visib: $common.getCurrentStyle(tagElements[k], 'visibility')} ;
tagElements[k].style.visibility = 'hidden';
i++;
}
}
}
},
restoreTab : function() {
/// <summary>
/// Restore the tab indices so we tab through the page like normal
/// (and restore SELECT tags in IE6)
/// </summary>
for (var i = 0; i < this._saveTabIndexes.length; i++) {
this._saveTabIndexes[i].tag.tabIndex = this._saveTabIndexes[i].index;
}
Array.clear(this._saveTabIndexes);
//IE6 Bug with SELECT element always showing up on top
if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.version < 7)) {
for (var k = 0 ; k < this._saveDesableSelect.length; k++) {
this._saveDesableSelect[k].tag.style.visibility = this._saveDesableSelect[k].visib;
}
Array.clear(this._saveDesableSelect);
}
},
hide : function() {
/// <summary>
/// Hide the modal dialog
/// </summary>
/// <returns type="Boolean" mayBeNull="false">
/// Whether or not the dialog was hidden
/// </returns>
var eventArgs = new Sys.CancelEventArgs();
this.raiseHiding(eventArgs);
if (eventArgs.get_cancel()) {
return false;
}
this._hideImplementation();
this.raiseHidden(Sys.EventArgs.Empty);
return true;
},
_hideImplementation : function() {
/// <summary>
/// Internal implementation to hide the modal dialog
/// </summary>
this._backgroundElement.style.display = 'none';
this._foregroundElement.style.display = 'none';
this.restoreTab();
this._detachPopup();
},
_layout : function() {
/// <summary>
/// Position the modal dialog
/// </summary>
var scrollLeft = (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
var scrollTop = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
var clientBounds = $common.getClientBounds();
var clientWidth = clientBounds.width;
var clientHeight = clientBounds.height;
// Setup the location of the background element
this._layoutBackgroundElement();
var xCoord = 0;
var yCoord = 0;
if(this._xCoordinate < 0) {
var foregroundelementwidth = this._foregroundElement.offsetWidth? this._foregroundElement.offsetWidth: this._foregroundElement.scrollWidth;
xCoord = ((clientWidth-foregroundelementwidth)/2);
// workaround for drag behavior which calls setlocation which in turn
// changes the position of the panel to be absolute and requiring us
// to add the scrollLeft so that it is positioned correctly.
if (this._foregroundElement.style.position == 'absolute') {
xCoord += scrollLeft;
}
this._foregroundElement.style.left = xCoord + 'px';
} else {
if(this._isIE6) {
this._foregroundElement.style.left = (this._xCoordinate + scrollLeft) + 'px';
xCoord = this._xCoordinate + scrollLeft;
}
else {
this._foregroundElement.style.left = this._xCoordinate + 'px';
xCoord = this._xCoordinate;
}
}
if(this._yCoordinate < 0) {
var foregroundelementheight = this._foregroundElement.offsetHeight? this._foregroundElement.offsetHeight: this._foregroundElement.scrollHeight;
yCoord = ((clientHeight-foregroundelementheight)/2);
// workaround for drag behavior which calls setlocation which in turn
// changes the position of the panel to be absolute and requiring us
// to add the scrollLeft so that it is positioned correctly.
if (this._foregroundElement.style.position == 'absolute') {
yCoord += scrollTop;
}
this._foregroundElement.style.top = yCoord + 'px';
} else {
if(this._isIE6) {
this._foregroundElement.style.top = (this._yCoordinate + scrollTop) + 'px';
yCoord = this._yCoordinate + scrollTop;
}
else {
this._foregroundElement.style.top = this._yCoordinate + 'px';
yCoord = this._yCoordinate;
}
}
// make sure get location agrees with the location of the foreground element
this._layoutForegroundElement(xCoord, yCoord);
if (this._dropShadowBehavior) {
this._dropShadowBehavior.setShadow();
window.setTimeout(Function.createDelegate(this, this._fixupDropShadowBehavior), 0);
}
// layout background element again to make sure it covers the whole background
// in case things moved around when laying out the foreground element
this._layoutBackgroundElement();
},
_layoutForegroundElement : function(xCoord, yCoord) {
/// <summary>
/// Set the correct location of the foreground element to ensure that it is absolutely
/// positioned with respect to the browser. This is just a workaround for IE 6 since
/// elements nested in relative parents cause modal popup positioning issues and 'fixed'
/// is not supported by IE 6. Hence we manually compute the right location of the popup.
/// </summary>
/// <param name="xCoord" type="Number" integer="true" maybenull="false">
/// <param name="yCoord" type="Number" integer="true" maybenull="false">
/// </params>
if (this._isIE6 && this._relativeOrAbsoluteParentElement) {
var foregroundLocation = $common.getLocation(this._foregroundElement);
var relativeParentLocation = $common.getLocation(this._relativeOrAbsoluteParentElement);
var getLocationXCoord = foregroundLocation.x;
if (getLocationXCoord != xCoord) {
// offset it by that amount
this._foregroundElement.style.left = (xCoord - relativeParentLocation.x) + 'px';
}
var getLocationYCoord = foregroundLocation.y;
if (getLocationYCoord != yCoord) {
// offset it by that amount
this._foregroundElement.style.top = (yCoord - relativeParentLocation.y) + 'px';
}
}
},
_layoutBackgroundElement : function() {
/// <summary>
/// Set the correct location of the background element to ensure that it is absolutely
/// positioned with respect to the browser.
/// </summary>
// Background element needs to cover the visible client area completely hence its
// top and left coordinates need to be 0, and if relatively positioned its getlocation
// value needs to be 0.
if(this._isIE6) {
var backgroundLocation = $common.getLocation(this._backgroundElement);
var backgroundXCoord = backgroundLocation.x;
if (backgroundXCoord != 0) {
// offset it by that amount. This is assuming only one level of nesting. If
// multiple parents with absolute/relative positioning are setup this may not
// cover the whole background.
this._backgroundElement.style.left = (-backgroundXCoord) + 'px';
}
var backgroundYCoord = backgroundLocation.y;
if (backgroundYCoord != 0) {
// offset it by that amount. This is assuming only one level of nesting. If
// multiple parents with absolute/relative positioning are setup this may not
// cover the whole background.
this._backgroundElement.style.top = (-backgroundYCoord) + 'px';
}
}
var clientBounds = $common.getClientBounds();
var clientWidth = clientBounds.width;
var clientHeight = clientBounds.height;
this._backgroundElement.style.width = Math.max(Math.max(document.documentElement.scrollWidth, document.body.scrollWidth), clientWidth)+'px';
this._backgroundElement.style.height = Math.max(Math.max(document.documentElement.scrollHeight, document.body.scrollHeight), clientHeight)+'px';
},
_fixupDropShadowBehavior : function() {
/// <summary>
/// Some browsers don't update the location values immediately, so
/// the location of the drop shadow would always be a step behind
/// without this method
/// </summary>
if (this._dropShadowBehavior) {
this._dropShadowBehavior.setShadow();
}
},
_partialUpdateEndRequest : function(sender, endRequestEventArgs) {
/// <summary>
/// Show the popup if requested during a partial postback
/// </summary>
/// <param name="sender" type="Object">
/// Sender
/// </param>
/// <param name="endRequestEventArgs" type="Sys.WebForms.EndRequestEventArgs">
/// Event arguments
/// </param>
/// <returns />
AjaxControlToolkit.ModalPopupBehavior.callBaseMethod(this, '_partialUpdateEndRequest', [sender, endRequestEventArgs]);
if (this.get_element()) {
// Look up result by element's ID
var action = endRequestEventArgs.get_dataItems()[this.get_element().id];
if ("show" == action) {
this.show();
} else if ("hide" == action) {
this.hide();
}
}
// Async postback may have added content; re-layout to accomodate it
this._layout();
},
_onPopulated : function(sender, eventArgs) {
/// <summary>
/// Re-layout the popup after we've dynamically populated
/// </summary>
/// <param name="sender" type="Object">
/// Sender
/// </param>
/// <param name="eventArgs" type="Sys.EventArgs">
/// Event arguments
/// </param>
/// <returns />
AjaxControlToolkit.ModalPopupBehavior.callBaseMethod(this, '_onPopulated', [sender, eventArgs]);
// Dynamic populate may have added content; re-layout to accomodate it
this._layout();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -