#javascript #jquery
#javascript #jquery
Вопрос:
Я использую следующее решение, чтобы предотвратить потерю фокуса #content
текстовой области, когда пользователь нажал на .box
элемент:
// Detect latest element clicked
$(document).mousedown(function(e) {
lastElClicked = $(e.target);
});
// Prevent loss of focus for textarea when clicking on tools
$("#content").on("blur", function(event) {
if (lastElClicked.attr('class') == 'box'){
event.preventDefault();
this.focus();
return false;
}
});
В нескольких словах, при наведении курсора мыши сохраните целевой элемент, на который был нажат. При размытии #content
текстовой области проверьте, был ли этот последний элемент щелкнут .box
. Если это было тогда, предотвратите дефолт, переориентируйте #content
текстовую область и верните false .
Мое решение отлично работает в Chrome, но я все еще теряю фокус в Safari и Firefox. Как я могу заставить эту работу работать в кроссбраузерном режиме?
Редактировать:
Проблема с предлагаемыми решениями заключается в том, что элемент фактически теряет фокус и после этого переориентируется. В Chrome с приведенным выше кодом я никогда не теряю fucus, что означает, что выделенный текст остается выделенным.
Комментарии:
1. попробуйте
$("#content").focus()
вместоthis.focus();
2.
lastElClicked.attr('class') == 'box'
должно бытьlastElClicked.hasClass('class')
иthis.focus
должно быть$(this).focus
Ответ №1:
ОТРЕДАКТИРОВАНО:
попробуйте это:
// Detect latest element clicked
$(document).mousedown(function(e) {
window.lastElClicked = $(e.target);
});
// Prevent loss of focus for textarea when clicking on tools
$("#content").on("blur", function(event) {
if (window.lastElClicked.attr('class') == 'box'){
event.preventDefault();
var that=this;
setTimeout(function(){
$(that).trigger('focus');
},200);
window.lastElClicked="";
return false;
}
});
Также это хорошая статья об этой ошибке, которая, по-видимому, относится к Safari: http://bugs.jquery.com/ticket/7768
В качестве альтернативы вы могли бы попробовать это:
$('.box').click(function(event){
event.preventDefault();
$('input').each(function(){
$(this).trigger('blur');
});
setTimeout(function(){
$('#content').trigger('focus');
},200);
});
наконец, я должен упомянуть, что он по-прежнему теряет фокус на выделенном тексте, что кажется мне невыполнимой задачей для достижения в этом случае!
Комментарии:
1. Это работает в Firefox, но я теряю фокус любого выделенного текста, чего мне действительно нужно избегать в этом случае. В Safari это не работает, все еще теряет фокус.
2. Я обнаружил, что в Safari
blur
событие запускается доmousedown
, поэтому вы должны проверить, что оно не выйдет из строя и / или не будет работать с нежелательным элементом, проверьте ответ еще раз, я думаю, он должен это исправить!