IE下点击scrollbar会导致焦点移动到body

现象

IE这货果然与众不同,当光标焦点在input时,点击同页面内其他区域的scrollbar,会导致焦点移动到body,从而触发绑定在input上的blur事件,如果input中的值与之前不同,甚至还会触发change事件... Chrome曾经也有类似的问题,但在最新版中已经修正了,而Firefox则完全没有这样的问题。

影响

这个问题看起来微不足道,实际上影响还是非常大的,主要表现在下面2个方面

  • 多数的suggest控件会出错
    suggest往往是通过input(输入部分)和div(下拉框部分)组成。有时,下拉框内容过多,用户需要移动滚动条才能看全选项,但因为点击滚动条会让input失去焦点,导致控件误认为用户结束输入,从而关闭suggest的下拉部分,导致用户实际上无法正确的进行滚动条操作。

  • form
    这个更容易理解了,一般来说form的验证都是绑定在blur或者change事件上,如果form太长,需要移动滚动条才能看全的情况下,一旦鼠标点击滚动条就会错误的触发form验证操作,将无用的错误信息显示给用户。

解决方案

我们来看看jQueryUI的Autocomplete是怎么解决这个问题的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// input's blur event
blur: function( event ) {
    if ( this.cancelBlur ) {
        delete this.cancelBlur;
        return;
    }

    clearTimeout( this.searching );
    this.close( event );
    this._change( event );
}

// dropdown's mousedown event
mousedown: function( event ) {
    // prevent moving focus out of the text field
    event.preventDefault();

    // IE doesn't prevent moving focus even with event.preventDefault()
    // so we set a flag to know when we should ignore the blur event
    this.cancelBlur = true;
    this._delay(function() {
        delete this.cancelBlur;
    });

    // clicking on the scrollbar causes focus to shift to the body
    // but we can't detect a mouseup or a click immediately afterward
    // so we have to track the next mousedown and close the menu if
    // the user clicks somewhere outside of the autocomplete
    var menuElement = this.menu.element[ 0 ];
    if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
        this._delay(function() {
            var that = this;
            this.document.one( "mousedown", function( event ) {
                if ( event.target !== that.element[ 0 ] &&
                        event.target !== menuElement &&
                        !$.contains( menuElement, event.target ) ) {
                    that.close();
                }
            });
        });
    }
}

这下就很清楚了,要处理这个问题,要点有两个:

  • 通过自定义的flag判断是否需要跳过(直接return)input的blur事件
  • 全局(document)监视下一次mousedown事件,如果不是特定区域才执行blur相关操作

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
element-ui是一款基于Vue.js的开源UI框架,它提供了丰富的组件,其中包括了Table组件。在Table组件中,通常有大量的数据需要展示,而当数据过多时,就出现滚动条来方便用户查看。 然而,在Internet Explorer(IE)浏览器中,由于其特殊的浏览器内核,对某些CSS属性和布局方式的支持存在问题,导致滚动条兼容性有一定的挑战。 为了兼容IE浏览器,我们可以通过以下方法解决element-ui table的滚动条兼容性问题: 1. 使用v-html指令:在IE浏览器中,可以将table组件中的内容包裹在一个容器元素内,给该容器元素设置固定的高度,并且使用v-html指令将table组件的内容渲染到此容器中。这样可以保证在IE浏览器中正常显示滚动条。 2. 使用el-scrollbar组件:element-ui中提供了el-scrollbar组件,它是一个滚动条组件,可以在Table组件中嵌套使用。通过给Table组件设置固定高度,并将Table组件放置在el-scrollbar组件内部,可以实现在IE浏览器中的滚动条兼容性。 综上所述,对于element-ui的Table组件的滚动条在IE浏览器中的兼容性问题,我们可以通过使用v-html指令将内容渲染到固定高度的容器中,或者使用el-scrollbar组件来解决。同时,也建议在使用element-ui框架时,优先考虑兼容性,尽量使用兼容性较好的浏览器进行开发和测试,以确保最终的应用程序能在各种浏览器中正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值