Обнаружить щелчок вне элемента? - PullRequest
12 голосов
/ 21 июля 2009

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

$('#menu div').live('click', function() {
    // Close other open menu items, if any.
    // Toggle the clicked menu item.

    $('body').one('click', function(event) {
        // Hide the menu item.
        event.stopPropagation();
    });
});

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

«Правильное» поведение работает следующим образом:

  • Щелчок по пункту меню открывает его.
  • Щелчок по тому же пункту меню (или его дочерним элементам) закрывает его.
  • При нажатии другого пункта меню закрывается первый, открывается второй.
  • Нажатие (открыть) пунктов меню закрывает их.

Я попробовал следующее вместо вышеуказанного $('body').one(), чтобы игнорировать щелчки по пунктам меню с небольшим успехом:

// Captures click on menu items in spite of the not.
$('*').not('#menu *').one('click', function() { // Hide menu }
$('*:not(#menu)').one('click', function() { // Hide menu }

Как всегда, спасибо за любую помощь!

Ответы [ 2 ]

29 голосов
/ 21 июля 2009

Просто переместите обработчик щелчка тела наружу и сделайте что-то вроде этого:

$('body').bind('click', function(e) {
    if($(e.target).closest('#menu').length == 0) {
        // click happened outside of menu, hide any visible menu items
    }
});

В комментариях было неверно указано, что e.target не работает в IE; это не так, поскольку объект Event в jQuery исправляет эти несоответствия, где это необходимо (IE, Safari).

15 голосов
/ 22 июля 2009

Я написал это давным-давно, до славных дней jQuery ...

function clickedOutsideElement(elemId) {
  var theElem = getEventTarget(window.event);
  while(theElem != null) {
    if(theElem.id == elemId)
      return false;
    theElem = theElem.offsetParent;
  }
  return true;
}

function getEventTarget(evt) {
  var targ = (evt.target) ? evt.target : evt.srcElement;
  if(targ != null) {
    if(targ.nodeType == 3)
      targ = targ.parentNode;
  }
  return targ;
}

document.onclick = function() {
  if(clickedOutsideElement('divTest'))
    alert('Outside the element!');
  else
    alert('Inside the element!');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...