Javascript ExtJs手动触发点击事件,按钮参数不同于鼠标点击

Javascript ExtJs手动触发点击事件,按钮参数不同于鼠标点击,javascript,extjs,Javascript,Extjs,因此,我有一个登录控制器,您可以用鼠标单击登录或按Enter键,如下所示: Ext.define('My.controller.Login', { extend: 'Ext.app.Controller', init: function(application) { this.control({ "#idLogin button": {click: this.onButton}, "#idLogin form &g

因此,我有一个登录控制器,您可以用鼠标单击登录或按Enter键,如下所示:

Ext.define('My.controller.Login', {
    extend: 'Ext.app.Controller',

    init: function(application) {
        this.control({
            "#idLogin button": {click: this.onButton},
            "#idLogin form > *": {specialkey: this.onKey}
        });
    },

    onButton: function(button, e, eOpts) {
        var win = button.up('window'); // the login window
        //do more stuff...
    },

    onKey: function (field, el) {
        if (el.getKey() == Ext.EventObject.ENTER) //ENTER key performs Login
            Ext.getCmp('#idLogin button').fireEvent('click');
    }
});
我意识到,当我用鼠标单击登录按钮时,
onButton
函数正常工作,
button.up()
返回登录
窗口

但是,如果我按Enter键并启动
onKey
函数来执行
firevent('click')
,在这种情况下,
onButton
会启动,但参数
按钮
与鼠标单击时接收到的
按钮
参数不同!这次,
button.up()
函数未定义


问题是,为什么
firevent('click')
给我一个不同的按钮参数

您必须像这样使用
fireEvent
功能:

var myBtn = Ext.getCmp('#idLogin button');

myBtn.fireEvent('click', myBtn);

试试看。

因为按钮单击事件是框架触发的合成事件。它传递按钮实例和事件对象
fireEvent
的意思是“用这些参数通知任何订阅者此事件已发生”,而不是“在基础按钮上触发单击事件”

因此,您需要使用:

button.firevent('click',按钮)

然而,这并没有真正意义,您只是添加了一个额外的间接层

为什么不把它抽象出来:

Ext.define('My.controller.Login', {
    extend: 'Ext.app.Controller',

    init: function(application) {
        this.control({
            "#idLogin button": {click: this.onButton},
            "#idLogin form > *": {specialkey: this.onKey}
        });
    },

    onButton: function(button, e, eOpts) {
        this.doWindowFoo();
    },

    onKey: function (field, el) {
        if (el.getKey() == Ext.EventObject.ENTER) //ENTER key performs Login
            this.doWindowFoo();
    },

    doWindowFoo: function() {
        // Assumes the window has an id idLogin, there are several other ways to get a reference
        var win = Ext.getCmp('idLogin');
    }
});
使用:

更一般的方法是:

document.querySelector("what-ever-el-selector").click();
在extjs 4.2.6上测试


干杯

这将调用按钮中的处理程序函数,在我的情况下,它起作用了,因为我用附加功能和参数值更改覆盖了该按钮处理程序…(extjs 4.1.1)


谢谢:D现场,非常快@!为什么没有
按钮。单击()
?非常感谢您的详细回答!Indianer以60秒的短距离击败了它。答案是“错”,你不应该在按钮上触发事件。这不是正确的方法。EvanT,从他那里收回“接受”是不好的XD,但我同意你已经在最佳实践中更深入地重构了功能。你已经把层弄平了。我希望我能给你10多个干杯~我并不真正关心公认的答案,只是指出您不应该在自己的代码中使用这种方法。如何使用本机js?“fireHandler”是一个私有函数,不应该依赖于:
document.querySelector("what-ever-el-selector").click();
Ext.getCmp('#idLogin button').handler();