Как я могу обнаружить щелчок за пределами элемента?

Так как pandas 0.22 update доступны варианты сравнения:

  • gt (больше)
  • lt (меньше)
  • eq (равно)
  • ne (не равно)
  • ge (больше или равно)

и многое другое. Эти функции возвращают логический массив. Посмотрим, как мы можем их использовать:

# sample data
df = pd.DataFrame({'col1': [0, 1, 2,3,4,5], 'col2': [10, 11, 12,13,14,15]})

# get values from col1 greater than or equals to 1
df.loc[df['col1'].ge(1),'col1']

1    1
2    2
3    3
4    4
5    5

# where co11 values is better 0 and 2
df.loc[df['col1'].between(0,2)]

 col1 col2
0   0   10
1   1   11
2   2   12

# where col1 > 1
df.loc[df['col1'].gt(1)]

 col1 col2
2   2   12
3   3   13
4   4   14
5   5   15

2308
задан 5 revs, 2 users 50% 30 October 2016 в 16:05
поделиться

10 ответов

ПРИМЕЧАНИЕ: Используя stopEventPropagation() что-то, чего нужно избежать, поскольку это повреждает нормальный поток события в DOM. См. эта статья для получения дополнительной информации. Рассмотрите использование этот метод вместо этого

Присоединение событие щелчка к телу документа, которое закрывает окно. Присоедините отдельное событие щелчка к контейнеру, который останавливает распространение к телу документа.

$(window).click(function() {
//Hide the menus if visible
});

$('#menucontainer').click(function(event){
    event.stopPropagation();
});
1736
ответ дан 10 revs, 7 users 52% 30 October 2016 в 16:05
поделиться

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

$('#menucontainer').click(function(event) {
  $('html').one('click',function() {
    // Hide the menus
  });

  event.stopPropagation();
});
[еще 114] информация о jQuery one() функция

123
ответ дан 4 revs, 4 users 93% 30 October 2016 в 16:05
поделиться
  • 1
    еще одной вещью, что Вы спросили, было ПОЛЕ, дополнение является некоторым пространством текста в самом edittext. как то, если Вы скажете padding_left в тексте редактирования, он запустит некоторое пространство перед писанием текста в нем.. если мой ответ помог просьбам принять его. – AAnkit 17 January 2012 в 09:28

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

Или проверка положение щелчка, и видит, содержится ли это в области меню.

19
ответ дан Chris MacDonald 30 October 2016 в 16:05
поделиться
  • 1
    спасибо.. это зависит, если исходному массиву действительно заказывают тот путь... если что-то как (" one" " one" " two" " one" " three") возможно как исходный массив это won' t работа. – Bastian 17 November 2010 в 22:53

The other solutions here didn't work for me so I had to use:

if(!$(event.target).is('#foo'))
{
    // hide menu
}
139
ответ дан 22 November 2019 в 19:55
поделиться

Если вы пишете сценарий для IE и FF 3. * и просто хотите узнать, произошел ли щелчок в определенной области окна, вы также можете использовать что-то вроде:

this.outsideElementClick = function(objEvent, objElement){   
var objCurrentElement = objEvent.target || objEvent.srcElement;
var blnInsideX = false;
var blnInsideY = false;

if (objCurrentElement.getBoundingClientRect().left >= objElement.getBoundingClientRect().left && objCurrentElement.getBoundingClientRect().right <= objElement.getBoundingClientRect().right)
    blnInsideX = true;

if (objCurrentElement.getBoundingClientRect().top >= objElement.getBoundingClientRect().top && objCurrentElement.getBoundingClientRect().bottom <= objElement.getBoundingClientRect().bottom)
    blnInsideY = true;

if (blnInsideX && blnInsideY)
    return false;
else
    return true;}
8
ответ дан 22 November 2019 в 19:55
поделиться
$("#menuscontainer").click(function() {
    $(this).focus();
});
$("#menuscontainer").blur(function(){
    $(this).hide();
});

У меня работает отлично.

38
ответ дан 22 November 2019 в 19:55
поделиться

Теперь для этого есть плагин: внешние события (запись в блоге)

Когда к элементу привязан обработчик clickoutside (WLOG), происходит следующее:

  • элемент добавляется в массив, который содержит все элементы с обработчиками clickoutside
  • обработчик (namespaced) click привязывается к документу (если его еще нет)
  • при любом click в документе, срабатывает событие clickoutside для тех элементов в этом массиве, которые не равны или не являются родителями цели click-events
  • дополнительно, событие. target для события clickoutside устанавливается на элемент, на котором кликнул пользователь (так что вы даже знаете, на что кликнул пользователь, а не только то, что он кликнул снаружи)

Таким образом, никакие события не останавливаются от распространения, и дополнительные обработчики click могут быть использованы "над" элементом с обработчиком outside.

37
ответ дан 22 November 2019 в 19:55
поделиться

Вы можете прослушать событие click на document и затем убедиться, что #menucontainer не является предком или целью щелкнутого элемента, используя .closest().

Если это не так, то щелкнутый элемент находится за пределами #menucontainer и его можно безопасно скрыть.

$(document).click(function(event) { 
  $target = $(event.target);
  if(!$target.closest('#menucontainer').length && 
  $('#menucontainer').is(":visible")) {
    $('#menucontainer').hide();
  }        
});

Edit - 2017-06-23

Вы также можете произвести очистку после слушателя событий, если вы планируете закрыть меню и хотите перестать слушать события. Эта функция очистит только вновь созданный слушатель, сохранив все остальные слушатели кликов на документе. С синтаксисом ES2015:

export function hideOnClickOutside(selector) {
  const outsideClickListener = (event) => {
    $target = $(event.target);
    if (!$target.closest(selector).length && $(selector).is(':visible')) {
        $(selector).hide();
        removeClickListener();
    }
  }

  const removeClickListener = () => {
    document.removeEventListener('click', outsideClickListener)
  }

  document.addEventListener('click', outsideClickListener)
}

Редактировать - 2018-03-11

Для тех, кто не хочет использовать jQuery. Вот приведенный выше код в обычном vanillaJS (ECMAScript6).

function hideOnClickOutside(element) {
    const outsideClickListener = event => {
        if (!element.contains(event.target) && isVisible(element)) { // or use: event.target.closest(selector) === null
          element.style.display = 'none'
          removeClickListener()
        }
    }

    const removeClickListener = () => {
        document.removeEventListener('click', outsideClickListener)
    }

    document.addEventListener('click', outsideClickListener)
}

const isVisible = elem => !!elem && !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ) // source (2018-03-11): https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js 

ПРИМЕЧАНИЕ: Это основано на комментарии Алекса о том, чтобы просто использовать !element.contains(event.target) вместо части jQuery.

Но element.closest() теперь также доступен во всех основных браузерах (версия W3C немного отличается от jQuery). Полифиллы можно найти здесь: Element.closest()

1324
ответ дан 22 November 2019 в 19:55
поделиться

Для меня это отлично сработало во времени:

$('body').click(function() {
    // Hide the menus if visible.
});
2
ответ дан 22 November 2019 в 19:55
поделиться

Функция:

$(function() {
    $.fn.click_inout = function(clickin_handler, clickout_handler) {
        var item = this;
        var is_me = false;
        item.click(function(event) {
            clickin_handler(event);
            is_me = true;
        });
        $(document).click(function(event) {
            if (is_me) {
                is_me = false;
            } else {
                clickout_handler(event);
            }
        });
        return this;
    }
});

Использование:

this.input = $('<input>')
    .click_inout(
        function(event) { me.ShowTree(event); },
        function() { me.Hide(); }
    )
    .appendTo(this.node);

А функции очень простые:

ShowTree: function(event) {
    this.data_span.show();
}
Hide: function() {
    this.data_span.hide();
}
4
ответ дан 22 November 2019 в 19:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: