onKeyUp="fieldChange('textf1')"
не передает объект event
в аргументах. Вместо этого:
onkeyup="fieldChange('textf1', event)"
Это работает как в IE (потому что event
относится к глобальной переменной window.event
), так и в других браузерах (потому что event
относится к одному локальному аргументу функции, которую вы создаете с помощью обработчика событий on...
атрибут).
Теперь вы можете удалить код if (window.event)
из функции fieldChange
, потому что событие всегда будет передаваться. В тех местах, где вам нужно событие, лучше сначала прослушать аргумент, прежде чем вернуться к IE версия. Типично как:
function somethingHandler(event) {
event= event || window.event;
...
}
Еще одна вещь, которую вы можете сделать для очистки разметки, это использовать this
в обработчике событий:
onkeyup="fieldChange(this, event)"
теперь fieldChange
не нужно искать нужный элемент на id
, поскольку у вас уже есть ссылка на него.
Еще лучше - потерять атрибут обработчика событий и сделать его более ненавязчивым. Вы также можете использовать свойство maxLength
вместо того, чтобы встраивать логику длины о том, когда именно происходит перефокусировка. eg.:
<input type="text" name="textf1" maxlength="2" class="movetonext" />
<input type="text" name="textf2" maxlength="2" class="movetonext" />
<input type="text" name="textf3" maxlength="4" class="movetonext" />
<script type="text/javascript">
var elements= document.getElementById('myform').elements;
for (var i= elements.length; i-->0;)
if (elements[i].className==='movetonext')
elements[i].onkeyup= checkMoveToNext;
function checkMoveToNext() {
if (this.value.length>=this.maxLength) {
var elements= this.form.elements;
var ix= List_indexOf(elements, this);
ix= (ix+1)%elements.length;
elements[ix].focus();
}
}
function List_indexOf(list, item) {
for (var i= 0, n= list.length; i<n; i++)
if (list[i]===item)
return i;
return -1;
}
</script>