Учитывая демонстрационную разметку:
Как может один, с помощью jQuery, определять это div
потерял фокус?
Я могу использовать focusout()
но это не совсем, в чем я нуждаюсь. С focusout это будет инициировано как вкладки от входа до входного, поскольку это на самом деле обнаруживает (через распространение событий), что вход теряет фокус.
Иначе к слову требование: Я должен знать, когда фокус переместился ЗА ПРЕДЕЛАМИ отделения.
Я задал подобный вопрос прежде:
фокусировка jQuery () и предотвращение пузырения
Но это было связано с раскрывающимся UI, и можно обойти это путем вставки пустого DIV позади него и помещения события щелчка/фокуса на это как триггер, но это, не будет работать на эту ситуацию.
Следующая мысль, которую я имел, состояла в том, чтобы протестировать на фокусировку при вызове focusout:
$(".myobject").focusout(function(element) {
if(!($(this).focusin())){
console.log('doYourThing ' + $(this));
}
});
Увы, это не работает (я предполагаю вследствие того, что это оценивает фокусировку во время focusout события и, как таковое, это еще не обнаружило фокусировку.
Какие-либо умные решения этой проблемы? Я, возможно, пропускаю собственное событие jQuery, которое делает точно, что я ищу?
ОБНОВЛЕНИЕ:
На самом деле, упрощенный вопрос:
Мне нужен эквивалент $('div').blur()
но это на самом деле работало бы над отделением (так как размытость не может быть инициирована от отделения),
Что ж, то, что может сработать, - это привязать обработчик «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;
}
};
});
Взяв ответ Пойнти и продвинувшись немного дальше.
(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>");
});
Еще один плагин, на который стоит обратить внимание, это плагин Outside Events Бена Альмана. Он позволяет обнаружить, когда любое из следующих событий срабатывает на что-либо за пределами определенного элемента и его дочерних элементов: clickoutside, dblclickoutside, focusoutside, bluroutside, mousemoveoutside, mousedownoutside, mouseupoutside, mouseoveroutside, mouseoutoutside, keydownoutside, keypressoutside, keyupoutside, changeoutside, selectoutside, submitoutside
.