Вопрос

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

Это было полезно?

Решение

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

var $box = $('#box');
$(document.body).click(function(){
    if (!$box.has(this).length) { // if the click was not within $box
        $box.hide();
    }
});

А has Функция фильтрует выбор и возвращает элементы только в том случае, если они содержат элемент, переданный как параметр (вы также можете использовать строку селектора, но это не имеет значения здесь). Если щелчок был вне поля, length будет 0 Таким образом, условное пройдет, и коробка будет скрыта.

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

Другие советы

как это:

$("#thediv").show(0, function() {
   var that = $(this);
   $(document).bind("click", function(e) {
       if($(e.target).attr("id") != that.attr("id")) {
          that.hide();
          $(this).unbind("click");
       }
    });
});

скрипка здесь: http://jsfiddle.net/xybme/3/

$('body').click(function() {
    $('#box').fadeOut();
});

$('#box').click(function(e) {
    e.stopPropagation();
});

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

Если вы хотите, чтобы он сразу же спрятался, используйте .hide()

У меня есть трюк Stoppropagation () от Как обнаружить щелчок вне элемента?

Я знаю, что у jQuery есть "Focusout" событие для элементов формы, не уверен, можно ли его использовать для

Я рекомендую использовать эту либера https://github.com/gsantiago/jquery-clickout. Анкет Это круто!

$('button').on('clickout', function (e) {
  console.log('click outside button')
})

Свяжите функцию щелчка с самого документа:

$(document).click(function(){
    alert('doc');
});

Затем свяжите функцию с тем же событием на самом DIV и верните FALSE, чтобы событие не смотрелось на документ.

$('#mydiv').click(function(e){
    alert('mydiv click');
    return false;
}

Вот мое решение

    var ClickOut = {};

    ClickOut.list = [];

    ClickOut.Add = function(jqel, callback) {
        var i = ClickOut.list.push({jqel:jqel, callback:callback});
        return (i-1);
    }

    ClickOut.Remove = function(i) {
        ClickOut.list.splice(i, 1);
    }

    ClickOut.Init = function() {
        $('body').click(function(e) {
            for(var x = 0; x < ClickOut.list.length; x++) {
                if (!ClickOut.list[x].jqel.has(e.target).length) {
                    ClickOut.list[x].callback();
                }
            }
        });
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top