如何修复选项卡单击第一个输入屏幕滚动到顶部。仅在 Chrome 中

Posted

技术标签:

【中文标题】如何修复选项卡单击第一个输入屏幕滚动到顶部。仅在 Chrome 中【英文标题】:How to fix when tab clicked on first input screen scroll to top. Only in Chrome 【发布时间】:2015-04-06 12:33:53 【问题描述】:

如何在website 上解决此问题?内底形式。我在第二个输入(电话)上使用input mask。 当我禁用此插件选项卡时工作正常。

这是我的代码输入掩码:

$(".tel").inputmask("+7 999 999 9999",
    placeholder: " ",
    clearMaskOnLostFocus: true,
    showMaskOnHover: false,
    "oncomplete": function()
        $(this).removeClass('error-input');
        $(this).addClass('valid-input')
    ,
    "onincomplete": function()
        $(this).siblings('.valid-tel-hint').hide();
        $(this).removeClass('valid-input');
    ,
    "oncleared": function()
        $(this).siblings('.valid-tel-hint').hide();
        $(this).removeClass('valid-input');
        $(this).removeClass('error-input');
    
);

【问题讨论】:

【参考方案1】:

这是 chrome 中的一个 bug,这里有一个讨论:Chrome Tab Scroll Bug

这是一个对已经包含数据的文本字段进行制表符的错误。在带有一些静态文本的字段上创建输入掩码(例如上面的 +7)将在按选项卡时将文本放入字段中,从而导致错误。即使没有输入掩码,您也可以通过将文本放在普通字段中并在它们之间来回切换来重现。

我已经制定了一个可行的小型、hacky 解决方案。折衷方案是,当您选择该字段时,文本会非常快速地“闪烁”。有点烦人,但比将用户滚动到屏幕外要好得多!

**请注意,我是 javascript 新手,所以我确信有更好的方法来完成此操作。

// create a closure around the field to keep the value scoped
var ChromeScrollFixForInputMaskTextField = function(text_field, default_value, mask_options)

    // set the starting value
    var input_value = text_field.val() !== '' ? text_field.val() : default_value;

    text_field.inputmask(mask_options);

    // When tabbing in, clear the value, and add it back after 10 milliseconds.
    // You can experiment with that time, just has to be long enough for Chrome
    //  to have acted trying to scroll to a filled text field.
    text_field.on('focus', function () 
        text_field.val('');
        setTimeout(function () 
            text_field.val(input_value);
        , 10);
    );

    // Save the value when tabbing out so you can 'cheat' later
    text_field.on('blur', function () 
        input_value = text_field.val();
    );

;

// To use, simply grab a text field, and create the closure
my_text_field = $('#my_text_field');
mask_options =  mask: "9[999][.][99]", 'placeholder': '', greedy: false 
new ChromeScrollFixForInputMaskTextField(my_text_field, '1.0', mask_options)

您可以通过在此函数内部检查是否存在掩码并仅在存在时设置它,来对普通文本字段执行此操作。

【讨论】:

以上是关于如何修复选项卡单击第一个输入屏幕滚动到顶部。仅在 Chrome 中的主要内容,如果未能解决你的问题,请参考以下文章

如何在本机反应中转到顶部选项卡导航中的另一个屏幕

jQuery Mobile 在页面转换之前防止滚动到顶部?

如何修复 Gatsby JS Link 组件保留滚动位置而不重置到顶部

单击锚点时如何防止滚动到顶部(href =“ID”)

ion-textarea autoGrow 在输入时滚动到顶部

Sencha Touch:嵌套列表滚动到顶部,我该如何禁用它?