3

我已经疯了,试图弄清楚如何使这项工作。代码大致如下:

function onDropDownChanged() {
  $("#updatePanel").load(
    "myUrl",
    { id: $("#myDropDown option:selected").val() },
    onPanelLoaded
  );
}
function onPanelLoaded() {
  $("#theTextInput").focus();
}
$(document).ready(function() {
  $("#myDropDown").change(onDropDownChanged);
}

第一次触发更改处理程序时,它执行 ajax 更新,并且文本框获得焦点。

但是,在随后的更改中,它会继续进行 ajax 更新,但文本框永远不会再次聚焦。

我发现如果在ajax 调用之前onDropDownChanged添加,文本框将始终获得焦点。$("#updatePanel").empty()问题是整个表格消失了一秒钟,导致丑陋的闪光。鉴于 ajax 应该让这样的事情变得很好,这不是我想要使用的解决方法。

4

2 回答 2

6

看起来它应该可以工作,但我想知道调用回调时 DOM 是否没有更新。您可能想看看引入延迟是否有帮助。

function onPanelLoaded() {
     setTimeout( function() { $("#theTextInput").focus(); }, 500 );
}

如果这不起作用,包括页面上的 HTML 以及通过 load() 返回的内容会很有帮助。

于 2009-04-20T02:29:37.470 回答
4

我在 IE6 和 IE7 上遇到了类似的问题,但setTimeout()不是一个可靠的解决方案。有时它有效,有时它没有。它在某些机器上根本不起作用,而且 500ms 值无论如何都是完全任意的。当然,该focus()功能在 Firefox 和 Chrome 中完全按预期工作,没有任何超时。

我的解决方案是为 IE调用focus() 两次:

function onPanelLoaded() {
    var panel = $('#theTextInput');
    panel.focus();
    panel.focus();
}

现在,这就是我最初想要的。

于 2010-01-30T01:14:36.173 回答