Я занимаюсь разработкой веб-приложения с использованием jQuery.
У меня есть функциональность, которая добавляет новую строку из 3 полей ввода. После создания этих элементов DOM я хочу сфокусировать одно из полей ввода. Я делаю это с помощью вызова функции jQuery focus () для необходимого поля ввода.
Проблема в том, что вызов focus () отлично работает в IE6 и FF3.5, но не работает в IE8.
Я пытался сделать простой рабочий пример этой проблемы, чтобы показать ее здесь, но с урезанной версией кода focus () работает нормально. Поэтому я предположил, что DOM еще не готов, когда я вызываю focus () в IE8. Для этого я попытался вызвать setTimeout ('myFocus ()', 400). У меня был успех, и в некоторых случаях фокус действительно работал, но все же не всегда. Случайно это не фокусирует мое поле ввода.
Вопрос: кто-нибудь сталкивался с подобными проблемами и кто-нибудь знает, как это обойти? Использование setTimeout выглядит как очень уродливый обходной путь.
Tnx заранее
Отредактировано: 26.08.2009
Успешно воспроизвести на простом примере. Вот код HTML + JS, который воспроизводит эту ошибку в IE8.
<html>
<head>
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
function performChanged() {
formChanged = true;
}
function handleChange() {
var parentDiv = $('#container');
newValue = $(html).html();
parentDiv.html(newValue);
$(".sel1",parentDiv).bind('change',handleChange);
//alert('Uncomment this and after alert focus will be on input');
$("input.cv_values",parentDiv).focus();
}
$(document).ready(function() {
$('.trackChange').bind('change', handleChange);
});
var html = '<div class=\"div1\">\n<select class=\"sel1\" id=\"sel1\" name=\"sel1\"><option value=\"\"><\/option>\n<option value=\"11\">Select me to see problem<\/option>\n<\/select>\n\n\n<input class=\"cv_values\" id=\"sel3\" name=\"sel3\" size=\"30\" type=\"text\" value=\"\" /><br/>Focus should in input field. With alert it is but without alert focus is not there</div>';
</script>
</head>
<body>
<select class="trackChange" onchange='performChanged();'>
<option value=""></option>
<option value="1" >Select me to generate new inputs</option>
</select>
<div id="container"></div>
</body>
Воспроизвести:
1) выберите значение из первого выпадающего списка. Вы увидите, что ввод в первый раз работает
2) выберите значение из второго раскрывающегося списка. Вы увидите, что ошибка воспроизведена.
Затем в коде вы можете закомментировать строку, в которой отображается JS alert (). Странно то, что если есть это alert (), то после него фокус работает нормально.
Надеюсь, это поможет понять, где моя проблема.
P.S. Мне нужно, чтобы мое приложение работало таким образом - оно восстанавливает эти входные данные после выбора значения из выпадающего списка. Это упрощенный пример моего приложения;).