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 + -
显示快捷键?