Предотвращение потери фокуса элемента (требуется кроссбраузерное решение)

#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 , поэтому вы должны проверить, что оно не выйдет из строя и / или не будет работать с нежелательным элементом, проверьте ответ еще раз, я думаю, он должен это исправить!