目前,我们只支持 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).html(response);
为$(container)[0].innerHTML = response;
,但仍然无法始终如一地工作。我试过document.getElementById(element)
用$(container).find('#' + elementId)
. 我也尝试过var element = document.getElementById(elementId);
进入 setTimeout 并且仍然看到随机失败。使用 Firefox,需要 0 个 setTimeouts 并且代码运行完美,但不幸的是,这不是我们的选择。更改console.log
为alert
确实可以解决问题,但这只是因为它会将焦点延迟到单击“确定”之后,但是额外的鼠标单击对于可用性来说很糟糕。
that.initialize()
将类添加到新元素、添加事件、修改新元素的宽度/高度等……所有这些都 100% 有效。