我正在使用 jQuery 开发 webapp。我有添加 3 个输入字段的新行的功能。创建这些 DOM 元素后,我想关注输入字段之一。我正在通过在必要的输入字段上调用 jQuery focus() 函数来做到这一点。
问题是调用 focus() 在 IE6 和 FF3.5 中工作正常,但在 IE8 中不起作用。
我试图制作这个问题的简单工作示例以在此处显示它,但是代码的剥离版本 focus() 工作正常。所以我的猜测是当我在 IE8 中调用 focus() 时,DOM 还没有准备好。为此,我尝试调用 setTimeout('myFocus()',400)。我取得了成功,在某些情况下,重点确实有效,但仍不总是如此。随机它不会聚焦我的输入字段。
问题是:有没有人遇到过类似的问题,有没有人知道如何解决它?使用 setTimeout 感觉像是非常丑陋的解决方法。
提前交易
编辑 : 26.08.2009
成功重现简单的例子。这是在 IE8 上重现此错误的 HTML+JS 代码。
<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() 之后它的焦点工作正常。
希望这有助于了解我的问题所在。
PS 我需要我的应用程序以这种方式工作 - 它在从下拉列表中选择值后重新生成这些输入。这是我的应用程序的简化示例;)。