簡體   English   中英

下拉子菜單無法識別點擊

[英]Dropdown submenu not recognizing click

我有這個菜單,如果頁面寬度不能容納其所有項目,則將其余項目添加到更多選項中。

問題是,當我從more選項中單擊一個子菜單時,無法打開鏈接。 這是一個在單擊時記錄鏈接的示例。

 $(".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> 

您需要進行事件委派,因為您的li正在動態添加

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

上面的代碼將直接向li添加事件偵聽器,這將在您動態地在DOM中重新布置li時引起問題。

您必須使用事件委托。

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

此代碼將事件偵聽器添加到top-menu ,但該事件委托給它的所有死者li與選擇li[data-link]

閱讀有關事件委托的信息

通過事件委托,我們可以將單個事件偵聽器附加到父元素,該元素將為與選擇器匹配的所有后代觸發,無論這些后代現在存在還是將來添加。

查看我的這個答案,以獲取有關事件委托的解釋。

SNIPPET

 $(".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> 

問題是$(".top_menu li").click(...)函數僅適用於當時存在的li元素,您的代碼稍后將刪除並將它們重新附加到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> 

您的事件觸發器不正確。 您可以將其更改為以下內容,或向其他ul添加類。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM