ページをロードするときにfocus()
を適用したい検索入力テキストがあります。問題はfocus
関数がこのフィールドに自動的にスクロールすることです。このスクロールを無効にする解決策はありますか?
<input id="search_terms" type="text" />
<script>
document.getelementbyId('search-terms').focus();
</script>
完全なソリューションは次のとおりです。
var cursorFocus = function(elem) {
var x = window.scrollX, y = window.scrollY;
elem.focus();
window.scrollTo(x, y);
}
cursorFocus(document.getElementById('search-terms'));
新しい WHATWG標準 があります。これにより、オブジェクトをfocus()
に渡すことができます。これは、ブラウザーが要素をスクロールして表示できないようにすることを指定します。
const element = document.getElementById('search-terms')
element.focus({
preventScroll: true
});
Chrome 64 および Edge Insider Previewビルド17046 以降にサポートされており、 Firefox 68 でサポートされるはずです-サポートマトリックスは次で利用可能です- web-platform-tests here 。
JQueryを使用している場合、これも実行できます。
$.fn.focusWithoutScrolling = function(){
var x = window.scrollX, y = window.scrollY;
this.focus();
window.scrollTo(x, y);
};
その後
$('#search_terms').focusWithoutScrolling();
より多くのブラウザをサポートする少し変更されたバージョン(IE9を含む)
var cursorFocus = function(elem) {
var x, y;
// More sources for scroll x, y offset.
if (typeof(window.pageXOffset) !== 'undefined') {
x = window.pageXOffset;
y = window.pageYOffset;
} else if (typeof(window.scrollX) !== 'undefined') {
x = window.scrollX;
y = window.scrollY;
} else if (document.documentElement && typeof(document.documentElement.scrollLeft) !== 'undefined') {
x = document.documentElement.scrollLeft;
y = document.documentElement.scrollTop;
} else {
x = document.body.scrollLeft;
y = document.body.scrollTop;
}
elem.focus();
if (typeof x !== 'undefined') {
// In some cases IE9 does not seem to catch instant scrollTo request.
setTimeout(function() { window.scrollTo(x, y); }, 100);
}
}
ここでの答えは、階層全体のスクロールを考慮せず、メインのスクロールバーのみを扱います。この答えはすべてを処理します:
var focusWithoutScrolling = function (el) {
var scrollHierarchy = [];
var parent = el.parentNode;
while (parent) {
scrollHierarchy.Push([parent, parent.scrollLeft, parent.scrollTop]);
parent = parent.parentNode;
}
el.focus();
scrollHierarchy.forEach(function (item) {
var el = item[0];
// Check first to avoid triggering unnecessary `scroll` events
if (el.scrollLeft != item[1])
el.scrollLeft = item[1];
if (el.scrollTop != item[2])
el.scrollTop = item[2];
});
};