window.onclick за исключением случаев, когда элемент равен someElement - PullRequest
3 голосов
/ 29 декабря 2011

Мне интересно, есть ли способ исключить определенные элементы в функции. Например:

window.onclick = doThis() except if the element clicked is a 'ul' element.

Нечто подобное. Я знаю, что это, вероятно, должно быть написано так:

function doThis() {
  if (this item clicked is NOT 'ul') { 
     function xyz();
}}

window.onclick = doThis();

Я просто не уверен, есть ли "исключение" в javascript. Может кто-нибудь, пожалуйста, помогите. спасибо.

Хорошо, вот мой полный код, потому что он все еще не работает:

<script type="text/javascript">
function ddMenu() {
var timeout    = 500;
var closetimer = 0;
var ddmenuitem = 0;

function ddMenu_open(e)
{
   //ddMenu_canceltimer();
   ddMenu_close();
   var submenu = $(this).find('ul');
    if(submenu){
        ddmenuitem = submenu.css('visibility', 'visible');
        //return false;
        //preventDefault();

    }
   //return true;
}

function ddMenu_close()
{  if(ddmenuitem) ddmenuitem.css('visibility', 'hidden'); }

function ddMenu_timer()
{ closetimer = window.setTimeout(ddMenu_close, timeout); }

function ddMenu_canceltimer()
{  if(closetimer)
   {  window.clearTimeout(closetimer);
      closetimer = null;}}

$(document).ready(function()
{  $('#ddMenu > li').bind('click', ddMenu_open);
   $('#ddMenu li ul').bind('click', ddMenu_timer);
   //$('#ddMenu > li').bind('mouseout',  ddMenu_timer);
   //$('#ddMenu > li').bind('mouseover', ddMenu_canceltimer);

});

document.onclick = function(ev){
    if(ev.target.nodeName !== 'ul')  {
        ddMenu_close();
    }
};


}
</script>

Я добавил код target.nodeName! ==, который был предложен ниже, но он все еще не работает. Когда я нажимаю на ul, он все равно закрывает мое меню. спасибо.

Ответы [ 2 ]

6 голосов
/ 29 декабря 2011
window.onclick = function(ev){
    if( ev.target.nodeName !== 'UL' ){
        xyz();
    }
};

Здесь мы делаем объект события параметром.Таким образом, мы можем получить цель события click.Мы делаем именно это здесь - мы проверяем, является ли цель элементом ul.Если нет, запустите функцию.

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

2 голосов
/ 29 декабря 2011

События всплывают в DOM-дереве, поэтому просто установите «блокировщик», который предотвращает образование пузырей у всех <ul> s: http://jsfiddle.net/6sqWh/.

$(window).on("click", doThis);

$("ul").click(false); // prevent bubbling to window from <ul>s

Визуально это будет выглядеть так:

execute the function
 ^                    (passed through)
window  <- click

--   blocks
ul

в отличие от:

execute the function
                      (not executed)
window
                      (won't arrive here)
--  blocks
ul  <- click

Обратите внимание, что без блокировщика это будет выглядеть следующим образом:

execute the function
 ^
window
 ^
ul  <- click
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...