альтернатива потребности jQuery focusout ()

Учитывая демонстрационную разметку:

Как может один, с помощью jQuery, определять это div потерял фокус?

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

Иначе к слову требование: Я должен знать, когда фокус переместился ЗА ПРЕДЕЛАМИ отделения.

Я задал подобный вопрос прежде:

фокусировка jQuery () и предотвращение пузырения

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

Следующая мысль, которую я имел, состояла в том, чтобы протестировать на фокусировку при вызове focusout:

    $(".myobject").focusout(function(element) {
    if(!($(this).focusin())){
        console.log('doYourThing ' + $(this));
    }
});

Увы, это не работает (я предполагаю вследствие того, что это оценивает фокусировку во время focusout события и, как таковое, это еще не обнаружило фокусировку.

Какие-либо умные решения этой проблемы? Я, возможно, пропускаю собственное событие jQuery, которое делает точно, что я ищу?

ОБНОВЛЕНИЕ:

На самом деле, упрощенный вопрос:

Мне нужен эквивалент $('div').blur() но это на самом деле работало бы над отделением (так как размытость не может быть инициирована от отделения),

12
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

Что ж, то, что может сработать, - это привязать обработчик «focus» ко всему, и вы знаете, когда вы не находитесь в

, когда получаете событие «focus» в другом месте.

$('body').live('focus', (function() {
  var inDiv = false;
  return function(e) {
    if ($(this).closest('#theDiv').length)
      inDiv = true;
    else {
      if (inDiv)
        alert("just lost focus!");
      inDiv = false;
    }
  };
 });
4
ответ дан 2 December 2019 в 05:26
поделиться

Взяв ответ Пойнти и продвинувшись немного дальше.

создание (простого) плагина событий focuslost

(function($) {
    // will store the last focus chain
    var currentFocusChain = $();
    // stores a reference to any DOM objects we want to watch focus for
    var focusWatch = [];

    function checkFocus() {
        var newFocusChain = $(":focus").parents().andSelf();
        // elements in the old focus chain that aren't in the new focus chain...
        var lostFocus = currentFocusChain.not(newFocusChain.get());
        lostFocus.each(function() {
            if ($.inArray(this, focusWatch) != -1) {
                $(this).trigger('focuslost');
            }
        });
        currentFocusChain = newFocusChain;
    }
    // bind to the focus/blur event on all elements:
    $("*").live('focus blur', function(e) { 
        // wait until the next free loop to process focus change
        // when 'blur' is fired, focus will be unset
        setTimeout(checkFocus, 0);
    });

    $.fn.focuslost = function(fn) {
        return this.each(function() {
            // tell the live handler we are watching this event
            if ($.inArray(this, focusWatch) == -1) focusWatch.push(this);
            $(this).bind('focuslost', fn);
        });
    };
})(jQuery);

Пример использования

$("div").focuslost(function() {
  $(this).append("<div>Lost Focus!</div>");
});

jsfiddle demo

19
ответ дан 2 December 2019 в 05:26
поделиться

Еще один плагин, на который стоит обратить внимание, это плагин Outside Events Бена Альмана. Он позволяет обнаружить, когда любое из следующих событий срабатывает на что-либо за пределами определенного элемента и его дочерних элементов: clickoutside, dblclickoutside, focusoutside, bluroutside, mousemoveoutside, mousedownoutside, mouseupoutside, mouseoveroutside, mouseoutoutside, keydownoutside, keypressoutside, keyupoutside, changeoutside, selectoutside, submitoutside.

5
ответ дан 2 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

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