2017-05-24 80 views
1

我有這個菜單,如果頁面寬度不能容納所有的項目,那些剩餘的項目將被添加到更多的選項。Dropdown子菜單無法識別點擊

事情是,我無法打開鏈接,當我點擊從更多選項的子菜單。這是一個記錄點擊鏈接的例子。

$(".top_menu li").click(function() { 
 

 
    console.log($(this).data('link')); 
 

 
    // Checks if there is a link 
 
    if (typeof $(this).data('link') !== 'undefined') { 
 
    //document.location.href = $(this).data('link'); 
 
    } 
 
}); 
 
$(".top_menu ul").each(function() { 
 
    alignMenu(this); 
 
    var robj = this; 
 
    $(window).resize(function() { 
 
    $(robj).append($($($(robj).children("li.hideshow")).children("ul")).html()); 
 
    $(robj).children("li.hideshow").remove(); 
 
    alignMenu(robj); 
 
    }); 
 

 
    function alignMenu(obj) { 
 
    var w = 0; 
 
    var mw = $(obj).width() - 150; 
 
    var i = -1; 
 
    var menuhtml = ''; 
 
    jQuery.each($(obj).children(), function() { 
 
     i++; 
 
     w += $(this).outerWidth(true); 
 
     if (mw < w) { 
 
     menuhtml += $('<div>').append($(this).clone()).html(); 
 
     $(this).remove(); 
 
     } 
 
    }); 
 
    $(obj).append('<li class="hideshow">MORE&nbsp;&nbsp;<i class="material-icons">keyboard_arrow_down</i><ul>' + menuhtml + '</ul></li>'); 
 
    $(obj).children("li.hideshow ul").css("top", $(obj).children("li.hideshow").outerHeight(true) + "px"); 
 

 
    // Opens the menu 
 
    $(obj).children(".hideshow").click(function() { 
 
     $(this).find("ul").animate({ 
 
     height: 'toggle' 
 
     }, 'fast'); 
 
    }); 
 
    } 
 
});
.top_menu { 
 
    width: 100%; 
 
} 
 

 
ul.horizontal-menu, 
 
.horizontal-menu ul { 
 
    list-style-type: none; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
.horizontal-menu { 
 
    float: left; 
 
    width: 100%; 
 
    background: #616161; 
 
} 
 

 
.horizontal-menu li { 
 
    float: left; 
 
    display: block; 
 
    padding: 25px; 
 
    color: #FFFFFF; 
 
    text-decoration: none; 
 
    -webkit-transition: border-color .218s; 
 
    -moz-transition: border .218s; 
 
    -o-transition: border-color .218s; 
 
    transition: border-color .218s; 
 
    background: #616161; 
 
    cursor: pointer; 
 
} 
 

 
.horizontal-menu li .material-icons { 
 
    margin: -10px; 
 
} 
 

 
.hideshow ul li { 
 
    width: 250px; 
 
    text-align: center; 
 
} 
 

 
.horizontal-menu li:hover { 
 
    border-bottom: 3px solid rgb(246, 83, 20); 
 
    padding-bottom: 22px; 
 
    background: #484848; 
 
} 
 

 
.horizontal-menu li.hideshow ul { 
 
    position: absolute; 
 
    display: none; 
 
    left: -203px; 
 
    width: 300px; 
 
} 
 

 
.horizontal-menu li.hideshow { 
 
    position: relative; 
 
} 
 

 
.hideshow ul { 
 
    padding-bottom: 7px; 
 
    background: #616161; 
 
    border-radius: 0px 0px 4px 4px; 
 
    margin-top: 25px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!-- Material Icons (Google) --> 
 
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> 
 
<div class="top_menu"> 
 
    <ul class="horizontal-menu"> 
 
    <li>&nbsp;<i class="material-icons">search</i>&nbsp;</li> 
 
    <li data-link="http://www.google.com">MENU 1</li> 
 
    <li data-link="http://www.google.com">MENU 2</li> 
 
    <li data-link="http://www.google.com">MENU 3</li> 
 
    <li data-link="http://www.google.com">MENU 4</li> 
 
    <li data-link="http://www.google.com">MENU 5</li> 
 
    <li data-link="http://www.google.com">MENU 6</li> 
 
    <li data-link="http://www.google.com">MENU 7</li> 
 
    <li data-link="http://www.google.com">MENU 8</li> 
 
    <li data-link="http://www.google.com">MENU 9</li> 
 
    <li data-link="http://www.google.com">MENU 10</li> 
 
    <li data-link="http://www.google.com">MENU 11</li> 
 
    <li data-link="http://www.google.com">MENU 12</li> 
 
    <li data-link="http://www.google.com">MENU 13</li> 
 
    <li data-link="http://www.google.com">MENU 14</li> 
 
    </ul> 
 
</div>

回答

3

你需要做事件委派爲貴麗的越來越動態

$(".top_menu li").click(function() {... 

加入上面的代碼將事件偵聽器添加到li直接,這將導致問題,因爲你是在DOM重新安排li動態。

您必須使用事件委派。

$(".top_menu").on('click','li[data-link]',function() {... 

此代碼將事件偵聽器添加到top-menu,但委託的情況下將其所有死者li與選擇li[data-link]

閱讀Event Delegation

事件代表團允許我們附加一個單一的事件監聽器,到一個 父元素,該元素將觸發匹配 選擇器的所有後代,無論這些後代是現在存在還是被添加到 未來。

看看我這個answer對事件委派 解釋。

代碼片段

$(".top_menu").on('click','li[data-link]',function() { 
 

 
    console.log($(this).data('link')); 
 

 
    // Checks if there is a link 
 
    if (typeof $(this).data('link') !== 'undefined') { 
 
    //document.location.href = $(this).data('link'); 
 
    } 
 
}); 
 
$(".top_menu ul").each(function() { 
 
    alignMenu(this); 
 
    var robj = this; 
 
    $(window).resize(function() { 
 
    $(robj).append($($($(robj).children("li.hideshow")).children("ul")).html()); 
 
    $(robj).children("li.hideshow").remove(); 
 
    alignMenu(robj); 
 
    }); 
 

 
    function alignMenu(obj) { 
 
    var w = 0; 
 
    var mw = $(obj).width() - 150; 
 
    var i = -1; 
 
    var menuhtml = ''; 
 
    jQuery.each($(obj).children(), function() { 
 
     i++; 
 
     w += $(this).outerWidth(true); 
 
     if (mw < w) { 
 
     menuhtml += $('<div>').append($(this).clone()).html(); 
 
     $(this).remove(); 
 
     } 
 
    }); 
 
    $(obj).append('<li class="hideshow">MORE&nbsp;&nbsp;<i class="material-icons">keyboard_arrow_down</i><ul>' + menuhtml + '</ul></li>'); 
 
    $(obj).children("li.hideshow ul").css("top", $(obj).children("li.hideshow").outerHeight(true) + "px"); 
 

 
    // Opens the menu 
 
    $(obj).children(".hideshow").click(function() { 
 
     $(this).find("ul").animate({ 
 
     height: 'toggle' 
 
     }, 'fast'); 
 
    }); 
 
    } 
 
});
.top_menu { 
 
    width: 100%; 
 
} 
 

 
ul.horizontal-menu, 
 
.horizontal-menu ul { 
 
    list-style-type: none; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
.horizontal-menu { 
 
    float: left; 
 
    width: 100%; 
 
    background: #616161; 
 
} 
 

 
.horizontal-menu li { 
 
    float: left; 
 
    display: block; 
 
    padding: 25px; 
 
    color: #FFFFFF; 
 
    text-decoration: none; 
 
    -webkit-transition: border-color .218s; 
 
    -moz-transition: border .218s; 
 
    -o-transition: border-color .218s; 
 
    transition: border-color .218s; 
 
    background: #616161; 
 
    cursor: pointer; 
 
} 
 

 
.horizontal-menu li .material-icons { 
 
    margin: -10px; 
 
} 
 

 
.hideshow ul li { 
 
    width: 250px; 
 
    text-align: center; 
 
} 
 

 
.horizontal-menu li:hover { 
 
    border-bottom: 3px solid rgb(246, 83, 20); 
 
    padding-bottom: 22px; 
 
    background: #484848; 
 
} 
 

 
.horizontal-menu li.hideshow ul { 
 
    position: absolute; 
 
    display: none; 
 
    left: -203px; 
 
    width: 300px; 
 
} 
 

 
.horizontal-menu li.hideshow { 
 
    position: relative; 
 
} 
 

 
.hideshow ul { 
 
    padding-bottom: 7px; 
 
    background: #616161; 
 
    border-radius: 0px 0px 4px 4px; 
 
    margin-top: 25px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!-- Material Icons (Google) --> 
 
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> 
 
<div class="top_menu"> 
 
    <ul class="horizontal-menu"> 
 
    <li>&nbsp;<i class="material-icons">search</i>&nbsp;</li> 
 
    <li data-link="http://www.google.com">MENU 1</li> 
 
    <li data-link="http://www.google.com">MENU 2</li> 
 
    <li data-link="http://www.google.com">MENU 3</li> 
 
    <li data-link="http://www.google.com">MENU 4</li> 
 
    <li data-link="http://www.google.com">MENU 5</li> 
 
    <li data-link="http://www.google.com">MENU 6</li> 
 
    <li data-link="http://www.google.com">MENU 7</li> 
 
    <li data-link="http://www.google.com">MENU 8</li> 
 
    <li data-link="http://www.google.com">MENU 9</li> 
 
    <li data-link="http://www.google.com">MENU 10</li> 
 
    <li data-link="http://www.google.com">MENU 11</li> 
 
    <li data-link="http://www.google.com">MENU 12</li> 
 
    <li data-link="http://www.google.com">MENU 13</li> 
 
    <li data-link="http://www.google.com">MENU 14</li> 
 
    </ul> 
 
</div>

-1

你的事件觸發是不正確的。您可以將其更改爲下方或將類添加到其他ul。

$("li").click(function() { 
+0

這實際上是行不通的,因爲這點擊功能仍然只適用於這段代碼運行時存在的元素。所有這些都是使其適用於菜單外的元素。 – RLHawk

0

的問題是$(".top_menu li").click(...)功能僅適用於存在當時的李元素,你的代碼被刪除,並將它們重新連接到DOM稍後的。爲了附加到任何具有當時或以後存在的鏈接的li元素,可以使用.on('click', selector, ...)。爲避免包含li.hideshow元素,您可以使用li[data-link]作爲選擇器。

$(".top_menu").on('click', 'li[data-link]', function() { 
 

 
    console.log($(this).data('link')); 
 

 
    // Checks if there is a link 
 
    if (typeof $(this).data('link') !== 'undefined') { 
 
    //document.location.href = $(this).data('link'); 
 
    } 
 
}); 
 
$(".top_menu ul").each(function() { 
 
    alignMenu(this); 
 
    var robj = this; 
 
    $(window).resize(function() { 
 
    $(robj).append($($($(robj).children("li.hideshow")).children("ul")).html()); 
 
    $(robj).children("li.hideshow").remove(); 
 
    alignMenu(robj); 
 
    }); 
 

 
    function alignMenu(obj) { 
 
    var w = 0; 
 
    var mw = $(obj).width() - 150; 
 
    var i = -1; 
 
    var menuhtml = ''; 
 
    jQuery.each($(obj).children(), function() { 
 
     i++; 
 
     w += $(this).outerWidth(true); 
 
     if (mw < w) { 
 
     menuhtml += $('<div>').append($(this).clone()).html(); 
 
     $(this).remove(); 
 
     } 
 
    }); 
 
    $(obj).append('<li class="hideshow">MORE&nbsp;&nbsp;<i class="material-icons">keyboard_arrow_down</i><ul>' + menuhtml + '</ul></li>'); 
 
    $(obj).children("li.hideshow ul").css("top", $(obj).children("li.hideshow").outerHeight(true) + "px"); 
 

 
    // Opens the menu 
 
    $(obj).children(".hideshow").click(function() { 
 
     $(this).find("ul").animate({ 
 
     height: 'toggle' 
 
     }, 'fast'); 
 
    }); 
 
    } 
 
});
.top_menu { 
 
    width: 100%; 
 
} 
 

 
ul.horizontal-menu, 
 
.horizontal-menu ul { 
 
    list-style-type: none; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
.horizontal-menu { 
 
    float: left; 
 
    width: 100%; 
 
    background: #616161; 
 
} 
 

 
.horizontal-menu li { 
 
    float: left; 
 
    display: block; 
 
    padding: 25px; 
 
    color: #FFFFFF; 
 
    text-decoration: none; 
 
    -webkit-transition: border-color .218s; 
 
    -moz-transition: border .218s; 
 
    -o-transition: border-color .218s; 
 
    transition: border-color .218s; 
 
    background: #616161; 
 
    cursor: pointer; 
 
} 
 

 
.horizontal-menu li .material-icons { 
 
    margin: -10px; 
 
} 
 

 
.hideshow ul li { 
 
    width: 250px; 
 
    text-align: center; 
 
} 
 

 
.horizontal-menu li:hover { 
 
    border-bottom: 3px solid rgb(246, 83, 20); 
 
    padding-bottom: 22px; 
 
    background: #484848; 
 
} 
 

 
.horizontal-menu li.hideshow ul { 
 
    position: absolute; 
 
    display: none; 
 
    left: -203px; 
 
    width: 300px; 
 
} 
 

 
.horizontal-menu li.hideshow { 
 
    position: relative; 
 
} 
 

 
.hideshow ul { 
 
    padding-bottom: 7px; 
 
    background: #616161; 
 
    border-radius: 0px 0px 4px 4px; 
 
    margin-top: 25px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!-- Material Icons (Google) --> 
 
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> 
 
<div class="top_menu"> 
 
    <ul class="horizontal-menu"> 
 
    <li>&nbsp;<i class="material-icons">search</i>&nbsp;</li> 
 
    <li data-link="http://www.google.com">MENU 1</li> 
 
    <li data-link="http://www.google.com">MENU 2</li> 
 
    <li data-link="http://www.google.com">MENU 3</li> 
 
    <li data-link="http://www.google.com">MENU 4</li> 
 
    <li data-link="http://www.google.com">MENU 5</li> 
 
    <li data-link="http://www.google.com">MENU 6</li> 
 
    <li data-link="http://www.google.com">MENU 7</li> 
 
    <li data-link="http://www.google.com">MENU 8</li> 
 
    <li data-link="http://www.google.com">MENU 9</li> 
 
    <li data-link="http://www.google.com">MENU 10</li> 
 
    <li data-link="http://www.google.com">MENU 11</li> 
 
    <li data-link="http://www.google.com">MENU 12</li> 
 
    <li data-link="http://www.google.com">MENU 13</li> 
 
    <li data-link="http://www.google.com">MENU 14</li> 
 
    </ul> 
 
</div>