【发布时间】:2012-06-27 22:49:24
【问题描述】:
目前,我们只支持 IE8。
我有一个 ajax 调用,它从服务器获取数据,用响应替换容器 div 中的 HTML,然后尝试将焦点放在响应中包含的元素上。
依赖[IE魔法]?有时此代码有效,有时则无效。我需要找到可以 100% 工作的东西。 console.log 语句 100% 的时间记录正确的 ID,即使焦点失败。
$.ajax({
type: 'POST',
url: that.Url,
contentType: 'application/json; charset=utf-8',
dataType: 'html',
data: dataToSend,
success: function (response) {
$(container).html(response);
that.initialize();
var element = document.getElementById(elementId);
setTimeout(function () {
setTimeout(function () {
setTimeout(function () {
setTimeout(function () {
setTimeout(function () {
setTimeout(function () {
console.log($(element).attr('id'));
element.focus();
}, 10);
}, 10);
}, 10);
}, 10);
}, 10);
}, 10);
}
嵌套的 setTimeouts 用于查看在较早的超时期间是否有其他东西被放入堆栈。我尝试将单个 setTimeout 设置为 1000,但仍然看到随机故障。我尝试用$(container)[0].innerHTML = response; 替换$(container).html(response);,但仍然无法始终如一地工作。我尝试用$(container).find('#' + elementId) 替换document.getElementById(element)。我还尝试将var element = document.getElementById(elementId); 移动到 setTimeout 中,但仍然看到随机失败。使用 Firefox,需要 0 个 setTimeouts 并且代码运行完美,但不幸的是,这不是我们的选择。将console.log 更改为alert 确实可以解决问题,但这只是因为它会将焦点延迟到单击“确定”之后,但额外的鼠标单击对于可用性来说很糟糕。
that.initialize() 为新元素添加类、添加事件、修改新元素的宽度/高度等……所有这些都 100% 有效。
【问题讨论】:
-
initialize是否引入了诸如在事后操纵 DOM 的超时之类的东西?注入的 HTML 是否包含导致副作用的脚本? -
我发现这是一个非常常见的问题,大多数解决方案都使用超时。另一个网站声称连续两次调用
.focus()总是有效的。我没有旧的 IE 来测试,但试一试第二个选项。 -
感谢雅各布!到目前为止,连续两次对焦效果最好。我将不得不对其进行更多测试,但我还没有看到失败。
-
酷,我会发布作为答案。
标签: javascript jquery ajax internet-explorer-8 dom-manipulation