2009-04-20 40 views
3

我疯了,试图找出如何使这项工作。代码看起来大致如下:无法在DOM中加载输入字段加载Ajax调用

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

第一次更改处理被触发,它的AJAX更新,文本框的重点。

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

我发现如果在onDropDownChanged之前,我在ajax调用之前加了$("#updatePanel").empty(),文本框总是会聚焦。与此相关的问题是整个表单消失一秒钟,导致一个丑陋的闪光。鉴于阿贾克斯应该使这样的事情很好,这不是我想使用的解决方法。

+1

您可以发布您正在处理的HTML位,以及由ajax调用加载的HTML吗? – 2009-04-20 01:06:16

回答

6

它似乎应该工作,但我不知道在回调被调用时DOM没有被更新。你可能想看看引入延迟是否有帮助。

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

如果这不起作用,那么在页面上包含HTML和通过load()返回的内容将会很有帮助。

+0

这也是我的猜测......虽然它不是文档中的内容。看到HTML肯定会帮助解决它。 – 2009-04-20 03:33:05

+0

即使延迟为0,设置延迟也应该起作用。有时候所需要的只是“推迟”调用,以便通过“innerHTML”插入的内容可用于DOM。 – savetheclocktower 2009-04-20 08:05:25

4

我有一个与IE6和IE7类似的问题,但setTimeout()不是一个可靠的解决方案。有时它起作用,有时它不起作用。它根本不适用于某些机器,无论如何500毫秒的数值完全是任意的。当然,focus()函数完全按照预期工作,在Firefox和Chrome中都没有任何超时。

我的解决办法是要求focus()两次为IE:

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

现在做了什么,我打算在首位。

+0

这真的对我有用..谢谢bro – 2010-07-14 06:47:33

+0

男人,你让我的一天:D – 2011-11-07 13:28:53