Мой вариант, как я и предлагал, в декларативном стиле с fallback'ом на нативную валидацию, скрипт обходит все инпуты:
<!DOCTYPE html>
<meta charset="utf-8" />
<form onsubmit="return false">
<input id="input" value="ффффваыа" pattern="[а-яА-ЯёЁ]+" required="" title="Разрешены только русские буквы" />
<button type="submit">Отправить</button>
<script>
(function(){
var inputs = document.getElementsByTagName('input');
for (var i = 0, input; input = inputs[i]; i++) {
if (input.type == 'text') {
input.oninput = oninput;
// input['oninput' in input ? 'oninput' : 'onpropertychange'] = oninput; // for IE8
}
}
function oninput() {
var valid = true;
if ('required' in this.attributes) {
valid = valid && this.value != '';
}
if ('pattern' in this.attributes) {
var pattern = new RegExp('^' + this.getAttribute('pattern') + '$', 'gi');
valid = valid && pattern.test(this.value);
}
if (!valid) {
alert(this.title);
}
}
})();
</script>
</form>