📄 floating-window.js
字号:
/************************************************************************************************************
@fileoverview
Floating window
Copyright (C) 2006 Alf Magne Kalleland(post@dhtmlgoodies.com)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
www.dhtmlgoodies.com
Alf Magne Kalleland
Update log:
January 18th, 2006: Added feature that makes the window cover selectboxes(ref. problem with windowed and window less elements).
January 29th, 2006: Fixed problem showing the windows in Opera
Feb, 8th 2006: Added support for creating new windows dynamically
March, 11th, 2006: Added support for getting content from external files by use of Ajax
************************************************************************************************************/
var readSizeFromCookie = false; // Determines if size and position of windows should be set/retreved by use of cookie
var windowMinSize = [80,30]; // Mininum width and height of windows.
var moveCounter = -1;
var startEventPos = new Array();
var startPosWindow = new Array();
var startWindowSize = new Array();
var initResizeCounter = -1;
var activeWindow = false;
var activeWindowContent = false;
var windowSizeArray = new Array();
var windowPositionArray = new Array();
var currentZIndex = 10000;
var windowStateArray = new Array(); // Minimized or maximized
var activeWindowIframe = false;
var divCounter = 0;
var zIndexSet = false;
var MSIEWIN = (navigator.userAgent.indexOf('MSIE')>=0 && navigator.userAgent.indexOf('Win')>=0 && navigator.userAgent.toLowerCase().indexOf('opera')<0)?true:false;
var opera = navigator.userAgent.toLowerCase().indexOf('opera')>=0?true:false;
/*
These cookie functions are downloaded from
http://www.mach5.com/support/analyzer/manual/html/General/CookiesJavaScript.htm
*/
function Get_Cookie(name) {
var start = document.cookie.indexOf(name+"=");
var len = start+name.length+1;
if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
if (start == -1) return null;
var end = document.cookie.indexOf(";",len);
if (end == -1) end = document.cookie.length;
return unescape(document.cookie.substring(len,end));
}
// This function has been slightly modified
function Set_Cookie(name,value,expires,path,domain,secure) {
expires = expires * 60*60*24*1000;
var today = new Date();
var expires_date = new Date( today.getTime() + (expires) );
var cookieString = name + "=" +escape(value) +
( (expires) ? ";expires=" + expires_date.toGMTString() : "") +
( (path) ? ";path=" + path : "") +
( (domain) ? ";domain=" + domain : "") +
( (secure) ? ";secure" : "");
document.cookie = cookieString;
}
function cancelEvent()
{
return (moveCounter==-1 && initResizeCounter==-1)?true:false;
}
function initMove(e)
{
if(document.all)e = event;
moveCounter = 0;
switchElement(false,this);
startEventPos = [e.clientX,e.clientY];
startPosWindow = [activeWindow.offsetLeft,activeWindow.offsetTop];
startMove();
if(!MSIEWIN)return false;
}
function startMove()
{
if(moveCounter>=0 && moveCounter<=10){
moveCounter++;
setTimeout('startMove()',5);
}
}
function stopMove(e)
{
if(document.all)e = event;
moveCounter=-1;
initResizeCounter=-1;
if(!activeWindow || !activeWindowContent)return;
var state = '0';
if(windowStateArray[activeWindow.id.replace(/[^0-9]/g,'')])state = '1';
Set_Cookie(activeWindow.id + '_attr',activeWindow.style.left.replace('px','') + ',' + activeWindow.style.top.replace('px','') + ',' + activeWindow.style.width.replace('px','') + ',' + activeWindowContent.style.height.replace('px','') + ',' + activeWindow.style.zIndex + ',' + state,50);
}
function moveWindow(e)
{
if(document.all)e = event;
if(moveCounter>=10){
activeWindow.style.left = startPosWindow[0] + e.clientX - startEventPos[0] + 'px';
activeWindow.style.top = startPosWindow[1] + e.clientY - startEventPos[1] + 'px';
}
if(initResizeCounter>=10){
var newWidth = Math.max(windowMinSize[0],startWindowSize[0] + e.clientX - startEventPos[0]);
var newHeight = Math.max(windowMinSize[1],startWindowSize[1] + e.clientY - startEventPos[1]);
activeWindow.style.width = newWidth + 'px';
activeWindowContent.style.height = newHeight + 'px';
if(MSIEWIN && activeWindowIframe){
activeWindowIframe.style.width = (newWidth) + 'px';
activeWindowIframe.style.height = (newHeight+20) + 'px';
}
}
if(!document.all)return false;
}
function initResizeWindow(e)
{
if(document.all)e = event;
initResizeCounter = 0;
switchElement(false,document.getElementById('dhtml_goodies_id' + this.id.replace(/[^\d]/g,'')));
startWindowSize = [activeWindowContent.offsetWidth,activeWindowContent.offsetHeight];
startEventPos = [e.clientX,e.clientY];
if(MSIEWIN)activeWindowIframe = activeWindow.getElementsByTagName('IFRAME')[0];
startResizeWindow();
return false;
}
function startResizeWindow()
{
if(initResizeCounter>=0 && initResizeCounter<=10){
initResizeCounter++;
setTimeout('startResizeWindow()',5);
}
}
function switchElement(e,inputElement)
{
if(!inputElement)inputElement = this;
var numericId = inputElement.id.replace(/[^0-9]/g,'');
var state = '0';
if(windowStateArray[numericId])state = '1';
if(activeWindow && activeWindowContent){
Set_Cookie(activeWindow.id + '_attr',activeWindow.style.left.replace('px','') + ',' + activeWindow.style.top.replace('px','') + ',' + activeWindow.style.width.replace('px','') + ',' + activeWindowContent.style.height.replace('px','') + ',' + activeWindow.style.zIndex + ',' + state,50);
}
currentZIndex = currentZIndex/1 + 1;
activeWindow = document.getElementById('dhtml_goodies_id' + numericId);
activeWindow.style.zIndex = currentZIndex;
activeWindowContent = document.getElementById('windowContent' + numericId);
Set_Cookie(activeWindow.id + '_attr',activeWindow.style.left.replace('px','') + ',' + activeWindow.style.top.replace('px','') + ',' + activeWindow.style.width.replace('px','') + ',' + activeWindowContent.style.height.replace('px','') + ',' + activeWindow.style.zIndex + ',' + state,50);
}
function hideWindow()
{
switchElement(false,document.getElementById('dhtml_goodies_id' + this.id.replace(/[^\d]/g,'')));
activeWindow.parentNode.style.display='none';
}
function initWindows(e,divObj)
{
var divs = document.getElementsByTagName('DIV');
for(var no=0;no<divs.length;no++){
if(divs[no].className=='dhtmlgoodies_window'){
if(MSIEWIN){
var iframe = document.createElement('IFRAME');
iframe.style.border='0px';
iframe.frameborder=0;
iframe.style.position = 'absolute';
iframe.style.backgroundColor = '#FFFFFF';
iframe.style.top = '0px';
iframe.style.left = '0px';
iframe.style.zIndex = 100;
var subDiv = divs[no].getElementsByTagName('DIV')[0];
divs[no].insertBefore(iframe,subDiv);
}
divCounter = divCounter + 1;
if(divCounter==1)activeWindow = divs[no];
divs[no].id = 'dhtml_goodies_id' + divCounter;
divs[no].onmousedown = switchElement;
if(readSizeFromCookie)var cookiePos = Get_Cookie(divs[no].id + '_attr') + ''; else cookiePos = '';
if(divObj)cookiePos='';
var cookieValues = new Array();
if(cookiePos.indexOf(',')>0){
cookieValues = cookiePos.split(',');
if(!windowPositionArray[divCounter])windowPositionArray[divCounter] = new Array();
windowPositionArray[divCounter][0] = Math.max(0,cookieValues[0]);
windowPositionArray[divCounter][1] = Math.max(0,cookieValues[1]);
}
if(cookieValues.length==5 && !zIndexSet){
divs[no].style.zIndex = cookieValues[4];
if(cookieValues[4]/1 > currentZIndex)currentZIndex = cookieValues[4]/1;
}
if(windowPositionArray[divCounter]){
divs[no].style.left = windowPositionArray[divCounter][0] + 'px';
divs[no].style.top = windowPositionArray[divCounter][1] + 'px';
}
var subImages = divs[no].getElementsByTagName('IMG');
for(var no2=0;no2<subImages.length;no2++){
if(subImages[no2].className=='closeButton'){
subImages[no2].id = 'closeImage' + divCounter;
subImages[no2].onclick = hideWindow;
}
if(subImages[no2].className=='minimizeButton'){
subImages[no2].id = 'minimizeImage' + divCounter;
subImages[no2].onclick = minimizeWindow;
if(cookieValues.length==6 && cookieValues[5]=='0'){
setTimeout('minimizeWindow(false,document.getElementById("minimizeImage' + divCounter + '"))',10);
}
if(cookieValues.length==6 && cookieValues[5]=='1'){
windowStateArray[divCounter] = 1;
}
}
}
}
if(divs[no].className=='dhtmlgoodies_windowMiddle' || divs[no].className=='dhtmlgoodies_window_bottom'){
divs[no].style.zIndex = 1000;
}
if(divs[no].className=='dhtmlgoodies_window_top'){
divs[no].onmousedown = initMove;
divs[no].id = 'top_bar'+divCounter;
divs[no].style.zIndex = 1000;
}
if(divs[no].className=='dhtmlgoodies_windowContent'){
divs[no].id = 'windowContent'+divCounter;
divs[no].style.zIndex = 1000;
if(cookieValues && cookieValues.length>3){
if(!windowSizeArray[divCounter])windowSizeArray[divCounter] = new Array();
windowSizeArray[divCounter][0] = cookieValues[2];
windowSizeArray[divCounter][1] = cookieValues[3];
}
if(cookieValues && cookieValues.length==5){
activeWindowContent = document.getElementById('windowContent' + divCounter);
}
if(windowSizeArray[divCounter]){
divs[no].style.height = windowSizeArray[divCounter][1] + '%';
divs[no].parentNode.parentNode.style.width = windowSizeArray[divCounter][0] + 'px';
if(MSIEWIN){
iframe.style.width = (windowSizeArray[divCounter][0]) + 'px';
iframe.style.height = (windowSizeArray[divCounter][1]+20) + '%';
}
}
}
}
if(!divObj){
document.documentElement.onmouseup = stopMove;
document.documentElement.onmousemove = moveWindow;
document.documentElement.ondragstart = cancelEvent;
document.documentElement.onselectstart = cancelEvent;
}
return divCounter;
}
window.onload = initWindows;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -