JQuery фокус без прокрутки
Как я могу сфокусироваться на элементе HTML (например, "a" ) и не изменять текущие настройки прокрутки.
Например, если я использую:
$('#link').focus();
и эта ссылка не видна на экране (например, ниже видимой области), браузер прокручивается вниз, чтобы показать элемент. Как настроить фокус без движения полосы прокрутки? Мне нужно оставить полосу прокрутки в исходном месте.
Я пробовал это, но он производит мерцание экрана, и это взломать, а не изящное решение:
var st=$(document).scrollTop();
$('#link').focus();
$(document).scrollTop(st);
Может кто-нибудь мне помочь, пожалуйста?
Ответы
Ответ 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);
}