对焦后,输入字段立即模糊

Input field immediately blurs after focus

本文关键字:模糊 字段 输入      更新时间:2023-09-26

根据这个答案,我尝试创建一个页面,如果输入字段得到焦点,则高度会缩小到足够小,以至于页面将无法滚动。如果输入字段失去焦点,则所有内容都将恢复到原始状态。

我尝试了这种技术,没有事件,只是通过控制台进入代码,它就像一个魅力,但是在将这些绑定到事件之后,一切都被毁了。我意识到,在我单击输入字段并执行绑定函数后,输入字段立即失去焦点。它将bind记录到控制台,但不会unwrap(),也不会更改scrollLocked的值,因此在下一次单击时,它会再次wrap() <div>,并且会有多个。

我对这种行为的猜测是,在焦点之后,DOM 尚未创建,但它立即模糊并且执行速度如此之快,以至于它试图unwrap()尚不存在的 DOM 元素。这个理论中唯一的陷阱是,在第二次或无数次点击之后,有很多height-helper,但它仍然没有unwrap()任何一个。

现场演示

.HTML

<input type="text" id="search-text">
<div id="spacer" style="height:1500px;"></div>

JavaScript/jQuery

var scrollLocked = false;
$(document).on('focus', '#search-text', function(){
    if (!scrollLocked){
        scrollLocked = true;
        $('body').wrapInner(
            $('<div id="height-helper"/>').css({
                height: 300,
                overflow: 'hidden'
            })
        );
    }
});
$(document).on('blur', '#search-text', function(){
    console.log('blur');
    $('#height-helper').contents().unwrap();
    scrollLocked = false;
});
为什么

输入字段会立即失去焦点,为什么即使多次单击后模糊的功能也不会unwrap()?有没有办法实现我所描述的?

它失去了焦点,因为你改变了它在 DOM 中的位置。您可以通过重新聚焦它,然后使模糊处理程序仅在帮助程序div 内捕获来解决此问题。

var scrollLocked = false;
$(document).on('focus', '#search-text', function(){
    if (!scrollLocked){
        scrollLocked = true;
        $('body').wrapInner(
            $('<div id="height-helper"/>').css({
                height: 300,
                overflow: 'hidden'
            })
        );
        $(this).focus(); // *** Modified ***
    }
});
$(document).on('blur', '#height-helper #search-text', function(){ // *** Modified ***
    console.log('blur');
    $('#height-helper').contents().unwrap();
    scrollLocked = false;
});

http://jsfiddle.net/Tentonaxe/XGRhZ/1/