2015-12-04 2 views
0

У меня есть несколько элементов переключения на моей странице. Я пытаюсь закрыть их при нажатии на элемент div. сценарий у меня теперь работает veyr хорошо с несколькими элементами, но она также закрывает DIV при нажатии внутри DIVКак скрыть несколько jQuery toggle(), когда я выхожу за пределы меню?

<ul>  

<li class="menuContainer"> 
    <a class="top" href="#">Menu</a> 
    <div class="sub"> 
    <a class="top" href="google.com">item in dropdown menu with valid url when clicked here div.sub should stay close</a> 
</div> 
</li> 
<li class="menuContainer"> 
    <a class="top" href="#">Menu</a> 
    <div class="sub"> 
    <a class="top" href="#">item in dropdown menu when clicked here div.sub should stay open</a> 
    </div> 
</li> 

$(document).ready(function(){ 

$('li.menuContainer').each(function() { 
var $dropdown = $(this); 

$("a.top", $dropdown).click(function(e) { 
    e.preventDefault(); 
    $div = $("div.sub", $dropdown); 
    $div.toggle(); 
    $("li.menuContainer div.sub").not($div).hide(); 
    $("#effect").hide(); 
    return false; 
}); 
$("li.menuContainer div.sub").on("click", function (event) { 
    event.stopPropagation(); 
}); 

}); 



$(document).on("click", function(){ 
    $("li.menuContainer div.sub").hide(); 

}); 

}); 

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

+0

Можете ли вы опубликовать скрипку или ссылку, где находится ваша страница? – JGallardo

ответ

0

Я думаю, вы ищете e.stopPropagation();. Используйте его в случае с дочерними элементами.

Это остановит событие от распространения до родительского div.

+0

Я пробовал это и не работал :( – Aleksandra

+0

Вам нужно прикрепить событие click к тому элементу, где вы не хотите его закрывать. – Arg0n

+0

отлично, спасибо – Aleksandra

0

использовать этот код

$("li.menuContainer > a.top").click(function(e) { 
    e.preventDefault(); 
    $div = $(this).next("div.sub"); 
    $("li.menuContainer div.sub").not($div).slideUp(); 
    $div.slideDown(); 
}); 

вместо

$('li.menuContainer').each(function() { 
var $dropdown = $(this); 

$("a.top", $dropdown).click(function(e) { 
    e.preventDefault(); 
    $div = $("div.sub", $dropdown); 
    $div.toggle(); 
    $("li.menuContainer div.sub").not($div).hide(); 

    return false; 
}); 

}); 

и о

$('html').click(function(){ 
    $("li.menuContainer div.sub").hide(); 
}); 

вы можете использовать

$(window).on('click',function(e){ 
    if (!$("li.menuContainer").is(e.target) // if the target of the click isn't the container... 
     && $("li.menuContainer").has(e.target).length === 0) // ... nor a descendant of the container 
    { 
    $("li.menuContainer div.sub").slideUp(); 
    } 
}); 

Working Demo

Update:

$("div.sub > a.top").on('click',function(e) { 
    e.preventDefault(); // prevent page from reloading 
    e.stopPropagation(); // prevent parent click 
    alert('Here We Are :)'); 
    }); 

Working Demo

+0

это не работает, он закрывает контейнер только тогда, когда я нажимал на Menu Aleksandra

+0

e.stopPropagation(); works magic :) – Aleksandra

+0

@Aleksandra прежде всего, вы должны проверить ответ Arg0n как правильный ответ. 2-й я считаю, что вам понадобится мой код :) .. Приветствия: –

0

В коде проблема внутри следующей функции, теперь исправлено:

 
$('html').click(function(event){ 
    var ele = event.target.tagName + '.' + event.target.className; 
    if (ele != 'DIV.sub') { 
     $("li.menuContainer div.sub").hide(); 
    } 
}); 

Как вы можете видеть сейчас, когда вы нажимаете на любой элемент html проверяется, чтобы предотвратить нежелательное действие.

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