dommenu.js

来自「IPcop软路由防火墙 FREE 开源源代码」· JavaScript 代码 · 共 1,168 行 · 第 1/3 页

JS
1,168
字号
    return false;}// }}}// {{{ domMenu_detectCollisions()function domMenu_detectCollisions(in_menuObj, in_recover){    // no need to do anything for opera    if (domMenu_isOpera) {        return;    }    if (typeof(domMenu_selectElements) == 'undefined') {        domMenu_selectElements = document.getElementsByTagName('select');    }        // if we don't have a menu, then unhide selects    if (in_recover) {        for (var cnt = 0; cnt < domMenu_selectElements.length; cnt++) {            if (domMenu_isGecko && domMenu_selectElements[cnt].size <= 1 && !domMenu_selectElements[cnt].multiple) {                continue;            }            var thisSelect = domMenu_selectElements[cnt];            thisSelect.hideList.removeItem(in_menuObj.id);            if (!thisSelect.hideList.length) {                domMenu_selectElements[cnt].style.visibility = 'visible';            }        }        return;    }    // okay, in_menu exists, let's hunt and destroy    var menuOffsets = domMenu_getOffsets(in_menuObj);    for (var cnt = 0; cnt < domMenu_selectElements.length; cnt++) {        var thisSelect = domMenu_selectElements[cnt];        // mozilla doesn't have a problem with regular selects        if (domMenu_isGecko && thisSelect.size <= 1 && !thisSelect.multiple) {            continue;        }        // {!} make sure this hash is congruent with domTT hash {!}        if (!thisSelect.hideList) {            thisSelect.hideList = new domMenu_Hash();        }        var selectOffsets = domMenu_getOffsets(thisSelect);         // for mozilla we only have to worry about the scrollbar itself        if (domMenu_isGecko) {            selectOffsets.setItem('left', selectOffsets.items['left'] + thisSelect.offsetWidth - domMenu_scrollbarWidth);            selectOffsets.setItem('leftCenter', selectOffsets.items['left'] + domMenu_scrollbarWidth/2);            selectOffsets.setItem('radius', Math.max(thisSelect.offsetHeight, domMenu_scrollbarWidth/2));        }        var center2centerDistance = Math.sqrt(Math.pow(selectOffsets.items['leftCenter'] - menuOffsets.items['leftCenter'], 2) + Math.pow(selectOffsets.items['topCenter'] - menuOffsets.items['topCenter'], 2));        var radiusSum = selectOffsets.items['radius'] + menuOffsets.items['radius'];        // the encompassing circles are overlapping, get in for a closer look        if (center2centerDistance < radiusSum) {            // tip is left of select            if ((menuOffsets.items['leftCenter'] <= selectOffsets.items['leftCenter'] && menuOffsets.items['right'] < selectOffsets.items['left']) ||            // tip is right of select                (menuOffsets.items['leftCenter'] > selectOffsets.items['leftCenter'] && menuOffsets.items['left'] > selectOffsets.items['right']) ||            // tip is above select                (menuOffsets.items['topCenter'] <= selectOffsets.items['topCenter'] && menuOffsets.items['bottom'] < selectOffsets.items['top']) ||            // tip is below select                (menuOffsets.items['topCenter'] > selectOffsets.items['topCenter'] && menuOffsets.items['top'] > selectOffsets.items['bottom'])) {                thisSelect.hideList.removeItem(in_menuObj.id);                if (!thisSelect.hideList.length) {                    thisSelect.style.visibility = 'visible';                }            }            else {                thisSelect.hideList.setItem(in_menuObj.id, true);                thisSelect.style.visibility = 'hidden';            }        }    }}// }}}// {{{ domMenu_getOffsets()function domMenu_getOffsets(in_object){    var originalObject = in_object;    var originalWidth = in_object.offsetWidth;    var originalHeight = in_object.offsetHeight;    var offsetLeft = 0;    var offsetTop = 0;    while (in_object) {        offsetLeft += in_object.offsetLeft;        offsetTop += in_object.offsetTop;        in_object = in_object.offsetParent;    }        return new domMenu_Hash(        'left',       offsetLeft,        'top',        offsetTop,        'right',      offsetLeft + originalWidth,        'bottom',     offsetTop + originalHeight,        'leftCenter', offsetLeft + originalWidth/2,        'topCenter',  offsetTop + originalHeight/2,        'radius',     Math.max(originalWidth, originalHeight)     );}// }}}// {{{ domMenu_callTimeout()function domMenu_callTimeout(in_function, in_timeout, in_args, in_basename, in_type){    if (in_timeout == 0) {        var tmp_function = new Function('argv', in_function);        tmp_function(in_args);    }    else if (in_timeout > 0) {        // after we complete the timeout call, we want to remove the reference, so always add that        var tmp_function = new Function('argv', in_function + ' domMenu_timeouts[' + domMenu_quote(in_type) + '].removeItem(' + domMenu_quote(in_basename) + ');');        var tmp_args = new Array();        for (var i = 0; i < in_args.length; i++) {            tmp_args[i] = in_args[i];        }        if (!domMenu_isKonq && !domMenu_isIE50) {            domMenu_timeouts[in_type].setItem(in_basename, setTimeout(function() { tmp_function(tmp_args); }, in_timeout));        }        else {            var tmp_data = new Array();            tmp_data['function'] = tmp_function;            tmp_data['args'] = tmp_args;            domMenu_timeoutStates[in_type].setItem(in_basename, tmp_data);            var tmp_type = domMenu_quote(in_type);            var tmp_basename = domMenu_quote(in_basename);            domMenu_timeouts[in_type].setItem(in_basename, setTimeout('domMenu_timeoutStates[' + tmp_type + '].items[' + tmp_basename + '][' + domMenu_quote('function') + '](domMenu_timeoutStates[' + tmp_type + '].items[' + tmp_basename + '][' + domMenu_quote('args') + ']); domMenu_timeoutStates[' + tmp_type + '].removeItem(' + tmp_basename + ');', in_timeout));        }    }}// }}}// {{{ domMenu_cancelTimeout()function domMenu_cancelTimeout(in_basename, in_type){    // take advantage of browsers which use the anonymous function    if (!domMenu_isKonq && !domMenu_isIE50) {        clearTimeout(domMenu_timeouts[in_type].removeItem(in_basename));    }    else {        // if konqueror, we only want to clearTimeout if it is still running        if (domMenu_timeoutStates[in_type].hasItem(in_basename)) {            clearTimeout(domMenu_timeouts[in_type].removeItem(in_basename));            domMenu_timeoutStates[in_type].removeItem(in_basename);        }    }}// }}}// {{{ domMenu_correctEdgeBleed()function domMenu_correctEdgeBleed(in_width, in_height, in_x, in_y, in_padding, in_axis){    if (domMenu_isIE && !domMenu_isIE5) {        var pageHeight = document.documentElement.clientHeight;    }    else if (!domMenu_isKonq) {        var pageHeight = document.body.clientHeight;    }    else {        var pageHeight = window.innerHeight;    }    var pageYOffset = domMenu_isIE ? document.body.scrollTop : window.pageYOffset;    var pageXOffset = domMenu_isIE ? document.body.scrollLeft : window.pageXOffset;        if (in_axis == 'horizontal') {        var bleedRight = (in_x - pageXOffset) + in_width - (document.body.clientWidth - in_padding);        var bleedLeft = (in_x - pageXOffset) - in_padding;        // we are bleeding off the right, move menu to stay on page        if (bleedRight > 0) {            in_x -= bleedRight;        }        // we are bleeding to the left, move menu over to stay on page        // we don't want an 'else if' here, because if it doesn't fit we will bleed off the right        if (bleedLeft < 0) {            in_x += bleedLeft;        }    }    else {        var bleedTop = (in_y - pageYOffset) - in_padding;        var bleedBottom = (in_y - pageYOffset) + in_height - (pageHeight - in_padding);                // if we are bleeding off the bottom, move menu to stay on page        if (bleedBottom > 0) {            in_y -= bleedBottom;        }        // if we are bleeding off the top, move menu down        // we don't want an 'else if' here, because if we just can't fit it, bleed off the bottom        if (bleedTop < 0) {            in_y += bleedTop;        }    }        return new Array(in_x, in_y);}// }}}// {{{ domMenu_toggleSubMenu()function domMenu_toggleSubMenu(in_parentElement, in_style){    var subMenu = in_parentElement.data.items['subMenu'];    if (subMenu && subMenu.style.visibility != in_style) {        var settings = domMenu_settings.items[in_parentElement.data.items['basename']];        var prefix = in_parentElement.data.items['level'] == 1 ? 'menu' : 'subMenu';        var className = settings.items[prefix + 'ElementClass'];		// :BUG: this is a problem if submenus click to open, then it won't		// have the right class when you click to close		if (in_style == 'visible') {            className += ' ' + settings.items[prefix + 'Element' + (in_style == 'visible' ? 'Active' : 'Hover') + 'Class'];		}        in_parentElement.firstChild.className = className;                // position our submenu        if (in_style == 'visible') {            var tmp_offsets = domMenu_getOffsets(in_parentElement);            if (in_parentElement.data.items['level'] == 1) {                tmp_offsets.items['top'] += settings.items['verticalSubMenuOffsetY'];                tmp_offsets.items['bottom'] += settings.items['verticalSubMenuOffsetY'];                tmp_offsets.items['left'] += settings.items['verticalSubMenuOffsetX'];                tmp_offsets.items['right'] += settings.items['verticalSubMenuOffsetX'];            }            // reposition if there was a change in the parent position/size            if (!in_parentElement.data.items['offsets'].compare(tmp_offsets)) {                in_parentElement.data.items['offsets'] = tmp_offsets;                if (settings.items['axis'] == 'horizontal' && in_parentElement.data.items['level'] == 1) {                    var xCoor = tmp_offsets.items['left'];                    if (settings.items['verticalExpand'] == 'north') {                        var yCoor = tmp_offsets.items['top'] - subMenu.offsetHeight - settings.items['verticalSubMenuOffsetY'];                    }                    else {                        var yCoor = tmp_offsets.items['bottom'];                    }                }                else {                    var xCoor = tmp_offsets.items['right'] + settings.items['horizontalSubMenuOffsetX'];                    var yCoor = tmp_offsets.items['top'] + settings.items['horizontalSubMenuOffsetY'];                }                var minWidth = settings.items['subMenuMinWidth'];                var renderedWidth = subMenu.offsetWidth;                if (minWidth == 'inherit') {                    minWidth = in_parentElement.offsetWidth + settings.items['subMenuWidthCorrection'];                }                else if (minWidth == 'auto') {                    minWidth = renderedWidth;                }                if (domMenu_isKonq) {                    // change with width of the first cell                    subMenu.firstChild.firstChild.firstChild.firstChild.style.width = Math.max(minWidth, renderedWidth) + 'px';                }                else {                    // change the width of the table                    subMenu.firstChild.style.width = Math.max(minWidth, renderedWidth) + 'px';                }                                var coordinates = domMenu_correctEdgeBleed(subMenu.offsetWidth, subMenu.offsetHeight, xCoor, yCoor, settings.items['screenPadding'], settings.items['axis']);                subMenu.style.left = coordinates[0] + 'px';                subMenu.style.top = coordinates[1] + 'px';                // ** if we inherit, it is necessary to check the parent element width again **                if (settings.items['axis'] == 'horizontal' && settings.items['subMenuMinWidth'] == 'inherit') {                    subMenu.firstChild.style.width = Math.max(in_parentElement.offsetWidth + settings.items['subMenuWidthCorrection'], renderedWidth) + 'px';                }            }        }        // force konqueror to change the styles        if (domMenu_isKonq) {            in_parentElement.firstChild.style.display = 'none';            in_parentElement.firstChild.style.display = '';        }        subMenu.style.visibility = in_style;        domMenu_detectCollisions(subMenu, (in_style == 'hidden'));    }}// }}}// {{{ domMenu_toggleHighlight()function domMenu_toggleHighlight(in_element, in_status){    // if this is a heading, don't change the style    if (!in_element.data.items['numChildren'] && !in_element.data.items['uri']) {        return;    }    var settings = domMenu_settings.items[in_element.data.items['basename']];    var prefix = in_element.data.items['level'] == 1 ? 'menu' : 'subMenu';    var className = settings.items[prefix + 'ElementClass'];    var highlightElement = in_element.firstChild;    var pseudoClass;    if (in_status) {        if (in_element.data.hasItem('subMenu') && in_element.data.items['subMenu'].style.visibility == 'visible') {            pseudoClass = 'Active';        }        else if (in_element.data.items['numChildren'] || in_element.data.items['uri']) {            pseudoClass = 'Hover';        }    }    if (pseudoClass) {        className += ' ' + settings.items[prefix + 'Element' + pseudoClass + 'Class'];        // if we are changing to hover, change the alt contents (only change if needs it)        if (highlightElement.childNodes.length == 2 && highlightElement.lastChild.style.display == 'none') {            highlightElement.firstChild.style.display = 'none';            highlightElement.lastChild.style.display = '';        }    }    else {        // if we are changing to non-hover, change the alt contents (only change if needs it)        if (highlightElement.childNodes.length == 2 && highlightElement.firstChild.style.display == 'none') {            highlightElement.lastChild.style.display = 'none';            highlightElement.firstChild.style.display = '';        }    }    highlightElement.className = className;    // force konqueror to change the styles    if (domMenu_isKonq) {        highlightElement.style.display = 'none';        highlightElement.style.display = '';    }}// }}}// {{{ domMenu_resolveLink()function domMenu_resolveLink(in_this, in_event){    var eventObj = domMenu_isIE ? event : in_event;    var currentTarget = domMenu_isIE ? in_this : eventObj.currentTarget;    var basename = currentTarget.data.items['basename'];    // close the menu system immediately when we resolve the uri    domMenu_changeActivePath(false, domMenu_activeElement.items[basename], 0);    if (currentTarget.data.items['uri']) {        window.status = 'Resolving Link...';        // open in current window        if (!currentTarget.data.items['target'] || currentTarget.data.items['target'] == '_self') {            window.location = currentTarget.data.items['uri'];        }        // open in new window        else {            window.open(currentTarget.data.items['uri'], currentTarget.data.items['target']);        }    }}// }}}// {{{ domMenu_quote()function domMenu_quote(in_string){    return "'" + in_string.replace(new RegExp("'", 'g'), "\\'") + "'";}// }}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?