在重置HTML 5表单后,Firefox中输入框仍然显示红色边框。

3
我有一个HTML 5表单,很棒,我很兴奋!我决定使用xmlHttpRequest提交表单,好吧,我正在使用jQuery,所以用$.post(...)。 它起作用了,太棒了。我输入一些无效数据并提交表单,这些表单控件的有效性状态是无效的,正如预期的那样。到目前为止,一切都好。
现在,我再次输入表单控件中的有效值并提交表单,这次成功了,除了一件事,在调用表单的reset()方法后,红色的box-shadow样式仍然保留着。但是,如果输入框之前处于无效状态,但在提交表单之前被更正为有效状态,则在调用表单的reset()方法时会删除该样式。
那么问题是如何覆盖此行为?
1个回答

4
Mozilla Firefox会对任何无效的表单控件应用伪类:-moz-ui-invalid。如果表单从未提交过或在表单的submit()方法被调用时,所有表单输入控件都是有效的,则调用表单的reset()方法将导致伪类从输入控件中删除。
但是,如果表单提交时任何一个输入控件无效,则即使表单已被重置,该伪类仍将始终应用于无效的输入控件。
有关完整的文档和可下载的JavaScript文件,请访问:http://www.syn-to.com/moz-ui-invalid.php
var form; 

(function()
{
    "use strict";

    //name must be a valid form name eg. <form name="myFormName" ...
    form = function(name)
    {
        var a =
        {
            "registerReset": function()
            {
                //if the boxShadow property exists, bind the reset event handler
                //to the named form

                if(typeof document.forms[name].style.boxShadow !== 'undefined')
                {
                    document.forms[name].addEventListener('reset', a.resetEventHandler);
                }
            },

            "reset": function()
            {
                a.registerReset();
                document.forms[name].reset();
            },

            "resetEventHandler": function()
            {
                //override the default style and apply no boxShadow and register
                //an invalid event handler to each of the form's input controls
                function applyFix(inputControls)
                {
                    for(var i=0;i<inputControls.length;i++)
                    {

                        inputControls[i].style.boxShadow = 'none';
                        inputControls[i].addEventListener('invalid', a.invalidEventHandler);
                        inputControls[i].addEventListener('keydown', a.keydownEventHandler);
                    }
                }

                var inputControls = this.getElementsByTagName('input');
                applyFix(inputControls);

                var inputControls = this.getElementsByTagName('textarea');
                applyFix(inputControls);

                var inputControls = this.getElementsByTagName('select');
                applyFix(inputControls);

            },

            "invalidEventHandler": function()
            {

                this.style.boxShadow = '';
                this.removeEventListener('invalid', a.invalidEventHandler);
                this.removeEventListener('keydown', a.keydownEventHandler);
            },

            //the following functions emulates the restore of :-moz-ui-invalid
            //when the user interacts with a form input control
            "keydownEventHandler": function()
            {
                this.addEventListener('blur', a.blurEventHandler);
            },

            "blurEventHandler": function()
            {
                this.checkValidity();
                this.removeEventListener('blur', a.blurEventHandler);
            }
        };

        return a;
    }

})();

使用方法:

在本地重置之前(调用表单的reset()方法),必须调用以下两种方法之一:

<form name="formName" ...>...</form>

form('formName').registerReset();  //registers the event handlers once
form('formName').reset(); //registers the event handlers at the time reset is called 
                          //and then calls the form's native reset method, may be used 
                          //in place of the native reset

在我看来,无论是否使用ajax,无论用户之前是否尝试提交了具有无效输入控件的表单,重置操作都应该删除该样式!我已经提交了一个错误报告,但目前还没有被认为是一个错误:https://bugzilla.mozilla.org/show_bug.cgi?id=903200
这也应该帮助其他人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接