Подтвердить что ты не робот

JQuery фокус без прокрутки

Как я могу сфокусироваться на элементе HTML (например, "a" ) и не изменять текущие настройки прокрутки.

Например, если я использую:

$('#link').focus();

и эта ссылка не видна на экране (например, ниже видимой области), браузер прокручивается вниз, чтобы показать элемент. Как настроить фокус без движения полосы прокрутки? Мне нужно оставить полосу прокрутки в исходном месте.

Я пробовал это, но он производит мерцание экрана, и это взломать, а не изящное решение:

var st=$(document).scrollTop();
$('#link').focus();
$(document).scrollTop(st);

Может кто-нибудь мне помочь, пожалуйста?

4b9b3361

Ответ 1

Попробуйте следующее:

$.fn.focusWithoutScrolling = function(){
  var x = window.scrollX, y = window.scrollY;
  this.focus();
  window.scrollTo(x, y);
  return this; //chainability

};

а затем

$('#link').focusWithoutScrolling();

Edit:

Сообщалось, что это не работает в IE10. Вероятным решением было бы использовать:

var x = $(document).scrollLeft(), y = $(document).scrollTop();

но я его не тестировал.

Ответ 2

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

Попытайтесь работать с браузером, а не против него, и обычно у вас будут более счастливые пользователи.

Ответ 3

$('#link').css('position', 'fixed').focus().css('position', 'static') работает в Firefox.

( Изменить: вы не должны использовать этот хак)

Ответ 4

Попробуйте это решение jQuery:

$('#link').select();

Ответ 5

У меня та же проблема, но на словах: я думаю, что более элегантным решением было бы сосредоточить внимание, когда элемент находится в окне просмотра.

Вот что я копирую/вставляю (Kudos в ADB из этого потока Jquery проверяет, является ли элемент видимым в окне просмотра)

$.fn.inView = function(){
    if(!this.length) return false;
    var rect = this.get(0).getBoundingClientRect();

    return (
        rect.top >= 0 &&
        rect.left >= 0 &&
        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
        rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);

};



window.$(window).on('scroll',function(){ 

    if( $('#elementcontainingfocus').inView() ) {
       $(function() {
                $("#elementcontainingfocus input").focus();
                    $("input[type=text]:focus").css({  
                    "box-shadow": "0 0 5px rgba(81, 203, 238, 1)",
                    "border": "1px solid rgba(81, 203, 238, 1)"
                    });
                });
    }

});

Ответ 6

Это сработало для меня

var focusWithoutScrolling = function(element) {
    var fixed = { "position": "fixed" };
    var posStatic = { "position": "static" };
    $(":root").css(fixed);
    $("body").css(fixed);
    $("html").css(fixed);
    $(element).focus();
    $(":root").css(posStatic);
    $("body").css(posStatic);
    $("html").css(posStatic);
}