重置HTML 5表单Firefox后,输入上仍会出现红色边框

我有一个HTML 5表单!太好了,我很兴奋!我决定使用xmlHttpRequest提交表单,而我使用的是jQuery,所以$.post(…).它很棒,很棒.我输入了一些无效数据并提交了表单,并且那些表单控件的有效性状态无效-符合预期.到现在为止还挺好.

现在,我将有效值输入到表单的输入控件中,然后再次提交表单,这次成功了,除了1件事之外,在调用表单的reset()方法后,红色框阴影样式仍然保留.但是,如果输入在与输入交互之后处于无效状态,但是在提交表单之前被更正为有效状态,则在调用表单的reset()方法时,样式将被删除.

那么问题是如何覆盖此行为?

解决方法:

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

这也应该帮助其他人.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。