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()
ネイティブ リセット (フォームのメソッドの呼び出し) の前に、次の 2 つのメソッドのいずれかを呼び出す必要があります。
<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
これは、他の誰かにも役立つはずです。