Как очистить, удалить или сбросить состояние проверки формы HTML5 после setCustomValidity("...");
?
Установка пустой строки, setCustomValidity("");
, в Firefox и Chrome закрывает сообщение об ошибке проверки формы. Я не хочу закрывать сообщение об ошибке проверки формы. Я хочу сбросить состояние проверки, чтобы можно было проверить следующий ответ, а также сохранить отображаемое сообщение об ошибке проверки. Если состояние проверки не сброшено, то даже следующий правильный ответ будет некорректно отображать сообщение об ошибке проверки.
Значит, как-то «очистить» означает «закрыть»?
Если аргумент является пустой строкой, очищает пользовательскую ошибку.
http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#the-constraint-validation-api
Вот пример проверочного теста:
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<meta charset="utf-8"/>
<title>Validation test case</title>
</head>
<body>
<form id="testForm">
<input type="text" id="answer" pattern="[A-Za-z]+" autofocus required/>
<input type="submit" value="OK"/>
</form>
<script>
/*jslint browser: true, vars: true, white: true, maxerr: 50, indent: 4 */
(function ()
{
"use strict";
var form = null;
var answer = null;
var isCorrectAnswer = function (value)
{
return (value === "a");
};
var closeValidation = function (element)
{
// Close the form validation error message if displayed.
element.blur();
element.focus();
};
var validateForm = function (event)
{
event.preventDefault();
event.stopPropagation();
var isValidForm = event.target.checkValidity();
if (isValidForm)
{
if (isCorrectAnswer(answer.value))
{
form.reset();
closeValidation(answer);
console.log("Correct answer.");
alert("Correct answer.");
}
else
{
console.log("Incorrect answer.");
answer.setCustomValidity("Incorrect answer.");
answer.checkValidity();
//answer.setCustomValidity("");
}
}
};
window.addEventListener("DOMContentLoaded", function ()
{
form = document.getElementById("testForm");
answer = document.getElementById("answer");
form.addEventListener("submit", validateForm, false);
}, false);
}());
</script>
</body>
</html>
Введите неправильный ответ, любые буквы, кроме «а», и нажмите Enter.
Введите правильный ответ «а» и нажмите Enter.
Без изменений в тестовом примере поведение в Opera, Firefox и Chrome одинаково (за исключением ошибок Chrome). Сообщение об ошибке проверки сохраняется независимо от того, является ли ответ правильным или неправильным.
Теперь, после того, как answer.setCustomValidity("");
не закомментировано, Opera очищает пользовательскую ошибку проверки, но не закрывает сообщение об ошибке проверки, чего я и ожидаю. С другой стороны, Firefox и Chrome очищают пользовательскую ошибку проверки и закрывают сообщение об ошибке проверки (ошибка?).
BUG: Chrome не "checkValidity ()" при первом вызове.
В Chrome answer.checkValidity();
не показывает сообщение проверки после первой отправки. Последующие представления показывают сообщение об ошибке проверки.
http://code.google.com/p/chromium/issues/detail?id=95970
BUG: В Chrome сообщение об ошибке валидации блокируется, но не закрывается при изменении входа.
http://code.google.com/p/chromium/issues/detail?id=95973
Opera 11.51 Build 1087
Firefox 6.0.2
Google Chrome 13.0.782.220 м