2017-01-21 7 views
0

Я работаю над выпадающим каскадом выбора, который является альтернативой стандартным каскадным выпадающим спискам, используемым в ASP.net. Дело в том, что я реализовал половину из них, но не смог сделать это правильно.Одиночный каскадный выпадающий список (в отличие от того, что используется в ASP.net)

Единственное, что мне нужно - это скрыть вторичное меню, когда мышь выйдет из него. Я использовал ("classname:hover").length, но это не работает все время.

См изображение:

enter image description here

Пожалуйста, найти плагин в указанный URL http://jsfiddle.net/nakul2111/deb0q5s8/

<div class='custom'></div> 
<br><br> 
<input type='text' > 
<div class='drop'> 

<ul class='ul-lev-1 ul'> 
    <li class='li-lev-1' data-attr='oo1'>India<span class='arrow'>>></span></li> 
<li class='li-lev-1'>Sri Lanka</li> 
<li class='li-lev-1' data-attr='oo2'>USA<span class='arrow'>>></span></li> 
<li class='li-lev-1'>Australia</li> 
</ul> 

<ul data-attr='oo1' class='ul-lev-2 ul'> 
<li class='li-lev-2'>Goa</li> 
<li class='li-lev-2' data-attr='oo1-1'>Delhi<span class='arrow'>>></span></li> 
<li class='li-lev-2'>J & K</li> 
<li class='li-lev-2' data-attr='oo1-2'>UP<span class='arrow'>>></span></li> 
</ul> 

    <ul data-attr='oo2' class='ul-lev-2 ul'> 
<li class='li-lev-2' data-attr='oo2-1'>California<span class='arrow'>>></span></li> 
<li class='li-lev-2'>Florida</li> 
<li class='li-lev-2' data-attr='oo2-2'>Hawaii<span class='arrow'>>></span></li> 
<li class='li-lev-2' data-attr='oo2-3'>Texas<span class='arrow'>>></span></li> 
</ul> 

<ul data-attr='oo1-1' class='ul-lev-3 ul'> 
<li class='li-lev-3'>VIvek VIhar</li> 
<li class='li-lev-3'>VAsant Kunj</li> 
<li class='li-lev-3'>Dwarka</li> 
<li class='li-lev-3'>Janakpuri</li> 
</ul> 

<ul data-attr='oo1-2' class='ul-lev-3 ul'> 
<li class='li-lev-3'>Ghaziabad</li> 
<li class='li-lev-3'>Kausahambi</li> 
<li class='li-lev-3'>Meerut</li> 
<li class='li-lev-3'>Kanpur</li> 
</ul> 

<ul data-attr='oo2-1' class='ul-lev-3 ul'> 
<li class='li-lev-3'>Los Angeles</li> 
<li class='li-lev-3'>San Diego</li> 
<li class='li-lev-3'>San Jose</li> 
<li class='li-lev-3'>Anaheim</li> 
</ul> 

<ul data-attr='oo2-2' class='ul-lev-3 ul'> 
<li class='li-lev-3'>Oahu</li> 
<li class='li-lev-3'>Honolulu</li> 
<li class='li-lev-3'>Hilo</li> 
<li class='li-lev-3'>Maui</li> 
</ul> 

<ul data-attr='oo2-3' class='ul-lev-3 ul'> 
<li class='li-lev-3'>Houston</li> 
<li class='li-lev-3'>Dallas</li> 
<li class='li-lev-3'>El Paso</li> 
<li class='li-lev-3'>Waco</li> 
</ul> 
</div> 

.custom{width:200px; 
padding:5px; 
height:20px; 
border:1px solid #ccc;} 
ul{list-style: none; padding:0; display:none;} 
ul li{padding:5px;} 
.ul-lev-1, .ul-lev-2, .ul-lev-3{position:absolute} 
.ul { 
    border: 1px solid #ccc; 
    width:200px; 
    background: #fff; 
} 
.ul li { 
    border-bottom:1px solid #ccc; 
} 
.ul li:hover{ 
    background:#ccc; 
} 
.ul li:last-child{border-bottom: none;} 
.arrow { 
    height: 5px; 
    width: 5px; 
    display: inline-block; 
    float: right; 
    margin-right:15px 
} 

$(".custom").click(function(){ 
    $('.ul-lev-1').show(); 
}); 
/*positioning the element start*/ 
var offse = $('.custom').offset() 
$('.ul-lev-1').css({top: offse.top+$('.custom').height(), left: offse.left}) 
/*positioning the element end*/ 
$('.ul li').hover(function(){ 
    if($(this).attr('data-attr')){  
    var dis = $(this); 
    var disTop = dis.offset().top-15; 
    var disLeft = dis.offset().left + dis.width()+10; 

    var attr1 = $('.drop').find('.ul-lev-2'); 
    var attr2 = $('.drop').find('.ul-lev-3'); 

    if($(this).hasClass('li-lev-1')){ 
     attr1.each(function(){ 
     if($(this).hasClass("ul-lev-2") && dis.attr('data-attr') == $(this).attr('data-attr')){ 
     var offe2 = $(this).offset(); 
      $(this).show(); 
     $(this).css({ 
      top:disTop, 
      left:disLeft 
     })  
     } 
    }) 
    } 
    if($(this).hasClass('li-lev-2')){ 
     attr2.each(function(){ 
     if($(this).hasClass("ul-lev-3") && dis.attr('data-attr') == $(this).attr('data-attr')){ 
     var offe3 = $(this).offset(); 
      $(this).show(); 
     $(this).css({ 
      top:disTop, 
      left:disLeft 
     })  
     } 
    }) 
    } 
    } 
}); 

$('.ul li').mouseleave(function() { debugger; 
     if($('body:hover').length){ 
    // $('.ul-lev-3, .ul-lev-2').hide(); 
    } 
    if ($(this).attr('data-attr')) { 
     if ($(this).hasClass("li-lev-1")) { 
      if (!$('.ul-lev-2:hover').length) { 
       $('.ul-lev-2').hide(); 
      } 
     } 
     if ($(this).hasClass("li-lev-2")) { 
      if (!$('.ul-lev-3:hover').length) { 
       $('.ul-lev-3').hide(); 
      }    
     }   
    } 
    else{ 
    if ($(this).hasClass("li-lev-3")) {debugger; 
      if ($('.ul-lev-3:hover').length) { 
      // $('.ul-lev-3').hide(); 
       console.log('hidden'); 
      } 
      else 
      if($('body:hover').length){ 
      $('.ul-lev-3').hide(); 
      $('.ul-lev-2').hide(); 
      } 
     } 
     if ($(this).hasClass("li-lev-2")) { 
      if (!$('.ul-lev-2:hover').length) { 
       $('.ul-lev-2').hide(); 
       // console.log('hidden'); 
      }    
     }} 
}) 
+0

Не ясно, какие конкретные проблемы. Объяснить поведение, ожидаемое и как оно отличается от того, что делает текущий код – charlietfl

+0

Я предлагаю вам попробовать 'if ($ (selection) .is (': hover')) {' синтаксис, но, возможно, вам стоит взглянуть на jQuery 'hover 'функция, это может быть более простой способ для обработки событий мыши. – Kaddath

+0

@charlietfl: Я загрузил pic, надеюсь, что это прояснит. Пожалуйста, проверь это. –

ответ

0

Там будут разные способы, чтобы ответить непосредственно на ваш вопрос, но проблема на самом деле лежит в другом месте, поэтому я подробно расскажу. Предположим, мы хотим изобрести колесо в качестве тестового примера. Код здесь не является идеальным решением для вашего вопроса, потому что его можно улучшить (по некоторым причинам ниже), но он иллюстрирует то, что я хочу рассказать.

  • Это не потому, что селекторы jQuery просты в использовании, что они являются хорошим способом динамического получения информации о DOM. Если вы используете один и тот же переключатель id дважды в функции, DOM будет анализироваться дважды. Код должен рассматриваться как доступ к минимальному доступу к элементам непосредственно из селектора и, скорее, сохранение результата в переменной для повторного использования.

=> В этом случае скрипка может быть улучшена как функция, которая строится из массива, представляющего меню, и сохраняет элементы меню jQuery в зависимости от их уровня, чтобы легко добавлять и удалять классы их.

  • При обработке объектов существует как минимум два подхода: может быть общий обработчик, который контролирует все, и обработчики самого объекта. Я думаю, что когда одна из этих систем пытается сделать то, что должна делать другая, возникает проблема дизайна (в вашем коде вы помещаете обработчик на каждый элемент, и каждый элемент пытается разобрать все меню, чтобы получить свои состояния, как будто был общим обработчиком). Если вы хотите поместить элемент управления на уровень элемента, элемент должен заботиться только о том, что ему доступно, или, в конечном счете, вызвать элементы управления элементом его родителя или детей.

=> Для этого код может быть улучшен путем вложения списков в html-код, например, для соответствия иерархии подменю. Элементы html будут содержать себя и могут быть найдены по иерархии. Нет необходимости хранить идентификатор или класс, чтобы найти подменю, чтобы показать его, и, скорее, посмотреть список детей. Таким образом, элементы, которые имеют обработчики на них, могут напрямую воздействовать на доступные объекты, а не анализировать DOM, чтобы их найти.

код Exemple:, как я сказал, что это не идеальный ответ, он просто показывает, что вы хотите достичь может быть повторно мысли в другой простой вопрос: например, если один элемент списка скрывает все вложенные элементы более глубокий уровень перед показом подменю, нет необходимости проверять все состояния зависания меню на самом деле, просто чтобы определить, какие меню скрывать.

Я упрощена только часть меню, а не CSS

https://jsfiddle.net/2a2142s6/3/

+0

спасибо за ответ. Сделал это! :) –

 Смежные вопросы

  • Нет связанных вопросов^_^