1

在一个有几个文本项和一个按钮的表单中,有可能知道在单击按钮之前焦点在哪个项目中?

我想通过单击按钮打开另一个表单,并且该表单具有取决于前一个表单焦点的“上下文”。

有什么想法吗?

编辑

我试图在控制器中保留最后一个焦点元素,绑定blur所有字段的事件,但似乎这个事件在 IE(总是他)中不同步,Chrome 和 FF 似乎没问题。

Ext.define('MyApp.controller.MyController', {
    extend: 'Ext.app.Controller',
    id: 'MyController',
    views: [
        'MyView'
    ],
    init : function(application){
        var me = this;

        me.lastFocus = null;

        me.control({
            '.field' : {
                blur: me.fieldBlur,
                scope: me
            }
        });
    },

    fieldBlur: function(field, event, opts) {
        this.lastFocus = field;
        //console.log('lastFocus: ' + field);
    }

});
4

3 回答 3

1

我自己从未尝试过,但Ext.FocusManager.focusedCmp看起来很有希望。请注意,您需要先激活它,然后才能通过调用Ext.FocusManager.enable()来使用它

编辑

我认为现在它会更稳定。很遗憾听到它似乎对您没有帮助,但我不明白为什么focusedCmp应该undefined准时单击按钮,它应该是按钮。随之而来的是我的错误,您需要访问previousFocusedCmp.

但它应该起作用,因为它没有魔法......

一个小例子JSFiddle

Ext.FocusManager.enable();
Ext.create('Ext.form.Panel', {
    title: 'Simple Form',
    bodyPadding: 5,
    width: 350,

    // The form will submit an AJAX request to this URL when submitted
    url: 'save-form.php',

    // Fields will be arranged vertically, stretched to full width
    layout: 'anchor',
    defaults: {
        anchor: '100%'
    },

    // The fields
    defaultType: 'textfield',
    items: [{
        fieldLabel: 'First Name',
        name: 'first',
        allowBlank: false
    },{
        fieldLabel: 'Last Name',
        name: 'last',
        allowBlank: false
    }],

    // Reset and Submit buttons
    buttons: [{
        text: 'Reset',
        handler: function() {
            console.log('Most likely the button you clicked: ', Ext.FocusManager.focusedCmp, 'The Component that was focused before:  ',Ext.FocusManager.previousFocusedCmp );
            this.up('form').getForm().reset();
        }
    }, {
        text: 'Submit',
        formBind: true, //only enabled once the form is valid
        disabled: true,
        handler: function() {
            var form = this.up('form').getForm();
            if (form.isValid()) {
                form.submit({
                    success: function(form, action) {
                       Ext.Msg.alert('Success', action.result.msg);
                    },
                    failure: function(form, action) {
                        Ext.Msg.alert('Failed', action.result.msg);
                    }
                });
            }
        }
    }],
    renderTo: Ext.getBody()
});

FocusManger是如何做到的一句话(我们省了keynav):

好吧,一旦他启用,他就会查询整个 DOM 以获取所有可聚焦的组件,并告诉每个组件通知他焦点和模糊的变化。

于 2013-07-04T11:04:51.807 回答
0

blur如果您延迟访问我的lastFocus属性,则在表单字段中使用事件的建议在按钮中有效。

onButtonClick : function(button, e, eOpts) {
  var me = this;
  setTimeout(function(){
      alert(me.lastFocus.getItemId());
  }, 250);
}
于 2013-07-04T14:08:28.020 回答
0

从用户的角度来看,这听起来有点阴暗,但无论你去哪里:

在每个表单上使用jQuery mouseover并将一些全局变量设置为自身或相应的字符串,当调用按钮时,该变量包含最后一个活动字段。

就像是

var last_active = 0;
function set_last_active(e, ui){
    last_active = $(this);
}
$('.tracked_form').mouseover(set_last_active);

应该做的伎俩,也看看你是否可以使用事件冒泡

于 2013-07-03T21:09:06.850 回答