禁用 Go 按钮提交表单(Sencha Touch 2、Cordova、Android)

Posted

技术标签:

【中文标题】禁用 Go 按钮提交表单(Sencha Touch 2、Cordova、Android)【英文标题】:Disable the Go button from submitting the form (Sencha Touch 2, Cordova, Android) 【发布时间】:2013-01-15 10:58:42 【问题描述】:

我有一个表单,并且有一个 button 提交它。我希望只有在点击“注册”按钮时才能执行提交。但是当用户在任何textfield 中输入一些文本并按下“Go”(又名“Enter”)按钮时。表单提交了,我对此无能为力。

android v2.3.6 上的 Samsung Galaxy S (GT i9000) 上发现此行为。但 Android 4 的 HTC 表现得如我所愿。

submitOnAction:false 没有帮助。 beforesubmit 也是。代码清单中的任何解决方案都不起作用。

我只是不希望表单以任何其他方式提交,除了按“注册”按钮!

文件/view/userRegistration/FormPanel.js

Ext.define('My.view.userRegistration.FormPanel', 
    extend: 'My.view.components.FormPanel',
    xtype : 'userRegistrationForm',

    config: 
        standardSubmit : false,
        submitOnAction : false,

        listeners: 
            beforesubmit: function(form, values, options, eOpts)
                console.log('before submit fired');
                return false; // returning false doesn't help
            ,
            '> field': 
                keyup: function(fld, e)
                    //13 = user tapped 'return' button on keyboard
                    //10 = user tapped 'hide keyboard' on keyboard
                    if (e.browserEvent.keyCode == 13 || e.browserEvent.keyCode == 10) 
                        e.stopEvent();
                        fld.element.dom.blur();
                    
                
            
        ,

        items : [
            
                xtype: 'textfield',
                name : 'firstName',
                required: true,
                listeners: 
                    action: function(field, e, eOpts) 
                    e.stopEvent();
                    return false;
                    ,
                    keyup: function(field, e) 
                        if (e.browserEvent.keyCode == 13 || e.browserEvent.keyCode == 10) 
                            // GO pressed on "firstName"
                            e.stopEvent();
                            field.element.dom.blur();
                            return false;
                        
                    
                
            ,
            
                xtype: 'button',
                text : 'Register',
                listeners: 
                    tap: function(button) 
                        var form = button.parent;
                        if (form.isValid()) 
                            form.onSubmit();
                        
                    
                
            
        ]
    
);

文件/view/components/FormPanel.js

Ext.define('My.view.components.FormPanel', 
    extend : 'Ext.form.Panel',

    onSubmit: function() 
        var fieldValues = this.getValues();
        // Sending fieldValues via AJAX
    ,
    isValid: function(args) 
        // Validating values
    
);

【问题讨论】:

您可以断开注册按钮与表单字段的连接。监听按钮上的点击,然后手动提交表单(我不确定您使用的提交方法)。 【参考方案1】:

问题出在onSubmit() 方法中。 sencha-touch-all-debug.js中的@private

Ext.define('Ext.form.Panel', 

    // @private
    onSubmit: function(e) 
        var me = this;
        if (e && !me.getStandardSubmit()) 
            e.stopEvent();
         else 
            this.submit();
        
    


所以在子类中重写onSubmit() 是绝对不正确的。更正确的方法。

文件/view/components/FormPanel.js

Ext.define('My.view.components.FormPanel', 
    extend : 'Ext.form.Panel',

    config: 
        standardSubmit: false,

        listeners: 
            beforesubmit: function(form, values, options, eOpts) 
                // Do something with data. Send it via AJAX, for example
                return false; // returning false to prevent real form.submit();
            
        
    

表单中的按钮应该只调用form.submit();

文件/view/userRegistration/FormPanel.js

        
            xtype: 'button',
            text : 'Register',
            handler: function() 
                var form = button.parent;
                if (form.isValid()) 
                    form.submit();
                
            
        

【讨论】:

【参考方案2】:

您实际上并不需要为此重写 FormPanel。在控制器中,您可以阻止来自现场的动作执行并冒泡。

Ext.define('TestApp.controller.Login', 
    extend: 'Ext.app.Controller',
    config: 
        control: 
            'field': 
                action: 'onFieldAction'
            
        
    ,
    onFieldAction: function(field, e) 
        // Stop event here 
        e.stopEvent();
        e.stopPropagation();
    
);

我在执行此操作时遇到了一个问题。我不小心覆盖了我的 FormPanel 的默认初始化函数。如果你这样做,一切都将不起作用

Ext.define('TestApp.view.Login', 
    extend: 'Ext.form.Panel',
    xtype: 'loginform',
    config: 
        ...
    
    initialize: function(config) 
         this.callParent(arguments); // Nothing will work without this line
         ...
    
);

【讨论】:

【参考方案3】:

以防万一有人需要禁用键盘上的 Enter 键或软键盘中的 Go 按钮,我找到了以下解决方案:

Ext.define('App.view.Login', 
    extend: 'Ext.form.Panel',
    xtype: 'login',

    config: 
        ....
    ,

    getElementConfig: function() 
        var config = this.callParent();
        config.children.pop();

        return config;
    
);

【讨论】:

【参考方案4】:
document.addEventListener("keypress", onGoKeyDown, false);
function onGoKeyDown(e) 
    console.log(e);
    if(e.srcElement.localName == 'input') 
        if (e.keyCode === 13 || e.keyCode === 10) 
            e.preventDefault();
        
    

【讨论】:

【参考方案5】:

我不知道是否有人仍在寻找解决方案,但我想出了一个非常简单的技巧 - 捕获输入并阻止表单提交,即使用户点击“Go”或任何其他按钮/键你想要的那个。为此,只需在每个输入字段中放置一个侦听器并侦听“模糊”事件。这将在离开现场时捕获任何动作(模糊)。在 blur 侦听器事件中,在下一个字段上执行 focus()(例如在表单中切换,即,如果您在字段 1 中,则将焦点发送到 2,依此类推),直到您到达所需的提交或注册按钮。在那里,您可以进行处理、提交等。这对我有用!

【讨论】:

【参考方案6】:

现在,如果我们想在提交时通过单击提交按钮或输入操作来调用 Ajax 方法,

submitOnAction : 在 FormPanel 配置中为真

在初始化方法中添加 this.callParent(arguments),以防我们覆盖 FormPanel 的初始化方法

重写FormPanel的submit方法以添加Ajax Call

监听提交按钮的点击事件以添加 Ajax 调用

【讨论】:

以上是关于禁用 Go 按钮提交表单(Sencha Touch 2、Cordova、Android)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Sencha Touch 2 获取表单面板和禁用选择字段

sencha touch:如何构建可编辑的 FormPanel

在 Sencha Touch 2 中提交表单

如何在 Sencha Touch 2 中使用 JsonP 提交表单?

Sencha Touch:嵌套列表滚动到顶部,我该如何禁用它?

Sencha Touch:工具栏可按住多个按钮并在超过一定数量时溢出