ExtJS 4 - 组合框模糊事件被触发两次

时间:2011-10-13 09:07:57

标签: events extjs combobox extjs4 blur

我有一个带有模糊事件的简单组合框。模糊事件当前有一个要求测试目的的警报。

问题是这个模糊事件会被触发两次,如下所示:

  1. 如果光标位于此组合框中,并且用户按下'tab'键,则组合框失去焦点 - >模糊事件被解雇。

  2. 一旦组合框失去焦点,如果用户在屏幕上的任意位置点击鼠标,则模糊事件会再次被触发。

  3. 无论如何,这个模糊事件只能被触发一次吗?

    以下是我正在使用的完整代码:

    <html>
        <head>
            <title>Test Page</title>
             <link rel="stylesheet" type="text/css" href="ext-4.0.2a/resources/css/ext-all.css">
             <script type="text/javascript" src="ext-4.0.2a/bootstrap.js"></script>
    
             <script type='text/javascript'>
    
                Ext.onReady(function(){
    
                    Ext.define("Post", {
                        extend: 'Ext.data.Model',
                        fields: [
                            {name: 'id', mapping: 'post_id'},
                            {name: 'title', mapping: 'topic_title'},
                            {name: 'topicId', mapping: 'topic_id'},
                            {name: 'author', mapping: 'author'},
                            {name: 'lastPost', mapping: 'post_time', type: 'date', dateFormat: 'timestamp'},
                            {name: 'excerpt', mapping: 'post_text'}
                        ]
                    });
    
                    ds = Ext.create('Ext.data.Store', {
                        pageSize: 10,
                        proxy: {
                            type: 'jsonp',
                            url : 'http://www.sencha.com/forum/topics-remote.php',
                            reader: {
                                type: 'json',
                                root: 'topics',
                                totalProperty: 'totalCount'
                            }
                        },
                        model: 'Post'
                    });
    
                    panel = Ext.create('Ext.panel.Panel', {
                        renderTo: Ext.getBody(),
                        title: 'Search the Ext Forums',
                        width: 600,
                        bodyPadding: 10,
                        layout: 'anchor',
                        items: [{
                            xtype: 'combo',
                            store: ds,
                            displayField: 'title',
                            fieldLabel:'Blur Test',
                            listeners:{
                                blur:function(){
                                    alert('1');
                                }
                            }
                        }, {
                            xtype: 'component',
                            style: 'margin-top:10px',
                            html: 'Live search requires a minimum of 4 characters.'
                        }]
                    });
                });
             </script>
        </head>
        <body>
    
        </body>
    </html>
    

    提前感谢您的帮助。

    PS:我正在使用ExtJS版本4.0.2a并在Firefox,IE9和IE8中检查了这种行为。所有这些都是两次射击事件。但是在Chrome中检查后,该事件只会被触发一次。

1 个答案:

答案 0 :(得分:0)

一个(非常可怕)选项是创建一个变量来跟踪模糊计数:

var AlreadyBlurred = false; //Obviously you want to put this somewhere NOT global

接下来,您可以在listeners对象中执行此操作:

listeners: {
    blur: function (){
        if(!AlreadyBlurred)
        {
            // Do your code here
        }
        AlreadyBlurred = !AlreadyBlurred;
    }
}

同样,这是一个非常可怕的想法,因为它可能会掩盖代码或Ext本身的问题。升级到4.0.7似乎没有帮助(jsfiddle的最新版本显示仍然会发生这种情况)。出于好奇,为什么要开始模糊事件呢?您可以在变更时进行,也可以选择所需的结果吗?