Javascript 响应迅速的多级菜单
大家好,我有下面的菜单,我已经做了很长时间了。有些部分基于我在互联网上找到的教程,有些则是从头开始编写的 到目前为止,我只在chrome上进行了测试,我不确定是否有其他浏览器,但当我将浏览器调整到<480px时,菜单按钮将显示,如果我想点击文档,子菜单将不会打开,我无法找到解决方案 HTML JavaScriptJavascript 响应迅速的多级菜单,javascript,html,css,Javascript,Html,Css,大家好,我有下面的菜单,我已经做了很长时间了。有些部分基于我在互联网上找到的教程,有些则是从头开始编写的 到目前为止,我只在chrome上进行了测试,我不确定是否有其他浏览器,但当我将浏览器调整到-1; } 函数changeClass(r,className1,className2){ var regex=new RegExp((?:^\\s+)“+className1+”(?:\\s+|$)”; if(正则表达式测试(r.className)){ r、 className=r.classNa
(function(root) {
var elements = {};
function s(id) {
if (!elements[id]) {
elements[id] = document.getElementById(id);
}
return elements[id];
}
function bindUIActions() {
menuElements();
s('dropdown').onclick = function(e) {
goDropDown();
e.stopPropagation();
};
s('menu').onclick = function(e) {
goResponsive();
e.stopPropagation();
};
//hideMenu();
}
function menuElements() {
var menuElements = s('menu');
menuElements.insertAdjacentHTML('afterBegin','<button type="button" id="menutoggle" class="navtoogle button" aria-hidden="true"><i aria-hidden="true" class="icon-coffee"> </i> Menu</button>');
}
function hideMenu() {
document.onclick = function(e) {
var mobileButton = s('menutoggle');
var buttonStyle = mobileButton.currentStyle
? mobileButton.currentStyle.display
: getComputedStyle(mobileButton, null).display;
if (buttonStyle === 'block'
&& e.target !== mobileButton
&& new RegExp(' ' + 'active' + ' ').test(' ' + mobileButton.className + ' ')) {
changeClass(mobileButton, 'navtoogle active', 'navtoogle');
}
}
}
function hasClass(element, cls) {
return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}
function changeClass(r, className1 , className2) {
var regex = new RegExp("(?:^|\\s+)" + className1 + "(?:\\s+|$)");
if (regex.test(r.className)) {
r.className = r.className.replace(regex, ' '+ className2 + ' ');
} else {
r.className = r.className.replace(new RegExp("(?:^|\\s+)" + className2 + "(?:\\s+|$)"),' '+ className1 +' ');
}
return r.className;
}
function goResponsive() {
// Toggle the class on click to show / hide the menu
changeClass(s('menutoggle'), 'navtoogle active', 'navtoogle');
}
function goDropDown() {
changeClass(s('dropdown'), 'inactive-dropdown', 'active-dropdown');
}
root.NavigationWidget = {
init: function() {
bindUIActions();
}
};
})(this);
NavigationWidget.init();
(函数(根){
var元素={};
函数s(id){
如果(!元素[id]){
elements[id]=document.getElementById(id);
}
返回元素[id];
}
函数bindUIActions(){
菜单元素();
s('dropdown')。onclick=函数(e){
goDropDown();
e、 停止传播();
};
s(“菜单”)。onclick=函数(e){
goResponsive();
e、 停止传播();
};
//hideMenu();
}
函数菜单元素(){
var menuElements=s(“菜单”);
menuElements.insertAdjacentHTML('afterBegin','Menu');
}
函数hideMenu(){
document.onclick=函数(e){
var mobileButton=s('menutoggle');
var buttonStyle=mobileButton.currentStyle
?mobileButton.currentStyle.display
:getComputedStyle(手机按钮,空)。显示;
如果(按钮样式==='block'
&&e.目标!==手机按钮
&&新的RegExp(“”+”活动“+”).test(“”+mobileButton.className+“”)){
changeClass(手机按钮、“导航工具激活”、“导航工具激活”);
}
}
}
函数类(元素,cls){
返回(“”+element.className+“”).indexOf(“”+cls+“”)>-1;
}
函数changeClass(r,className1,className2){
var regex=new RegExp((?:^\\s+)“+className1+”(?:\\s+|$)”;
if(正则表达式测试(r.className)){
r、 className=r.className.replace(regex,“+className2+”);
}否则{
r、 className=r.className.replace(新的RegExp((?:^\\s+)“+className2+”(?:\\s+|$)”),+className1+“”);
}
返回r.className;
}
函数goResponse(){
//在单击时切换类以显示/隐藏菜单
changeClass(s('menutoggle')、'navtoogle active'、'navtoogle');
}
函数goDropDown(){
changeClass(“下拉列表”)、“非活动下拉列表”、“活动下拉列表”);
}
root.NavigationWidget={
init:function(){
bindUIActions();
}
};
})(本条);
NavigationWidget.init();
尝试在<480px部分将此添加到css中:
.navtoogle.active + ul {
display: block;
}
你应该发布代码,这样我们才能帮助你。我觉得活生生的例子不是更好吗?活生生的例子可能不会永远在这里,供将来参考。因此,在你的问题中添加相关代码将确保上下文始终保持不变。我为你创建了一个提琴,但这似乎不起作用。请调整此处所需的内容:我按照Marco的要求添加了代码,是的,你是对的,代码可能不总是存在:-)愚蠢的我应得的-在这个问题上。我没有支付任何费用,因为我正在笔记本电脑上安装windows——我已经更新了JSFIDLE。js部分我不知道为什么它在那里不起作用。
(function(root) {
var elements = {};
function s(id) {
if (!elements[id]) {
elements[id] = document.getElementById(id);
}
return elements[id];
}
function bindUIActions() {
menuElements();
s('dropdown').onclick = function(e) {
goDropDown();
e.stopPropagation();
};
s('menu').onclick = function(e) {
goResponsive();
e.stopPropagation();
};
//hideMenu();
}
function menuElements() {
var menuElements = s('menu');
menuElements.insertAdjacentHTML('afterBegin','<button type="button" id="menutoggle" class="navtoogle button" aria-hidden="true"><i aria-hidden="true" class="icon-coffee"> </i> Menu</button>');
}
function hideMenu() {
document.onclick = function(e) {
var mobileButton = s('menutoggle');
var buttonStyle = mobileButton.currentStyle
? mobileButton.currentStyle.display
: getComputedStyle(mobileButton, null).display;
if (buttonStyle === 'block'
&& e.target !== mobileButton
&& new RegExp(' ' + 'active' + ' ').test(' ' + mobileButton.className + ' ')) {
changeClass(mobileButton, 'navtoogle active', 'navtoogle');
}
}
}
function hasClass(element, cls) {
return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}
function changeClass(r, className1 , className2) {
var regex = new RegExp("(?:^|\\s+)" + className1 + "(?:\\s+|$)");
if (regex.test(r.className)) {
r.className = r.className.replace(regex, ' '+ className2 + ' ');
} else {
r.className = r.className.replace(new RegExp("(?:^|\\s+)" + className2 + "(?:\\s+|$)"),' '+ className1 +' ');
}
return r.className;
}
function goResponsive() {
// Toggle the class on click to show / hide the menu
changeClass(s('menutoggle'), 'navtoogle active', 'navtoogle');
}
function goDropDown() {
changeClass(s('dropdown'), 'inactive-dropdown', 'active-dropdown');
}
root.NavigationWidget = {
init: function() {
bindUIActions();
}
};
})(this);
NavigationWidget.init();
.navtoogle.active + ul {
display: block;
}