2

目前,我们只支持 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.logalert确实可以解决问题,但这只是因为它会将焦点延迟到单击“确定”之后,但是额外的鼠标单击对于可用性来说很糟糕。

that.initialize()将类添加到新元素、添加事件、修改新元素的宽度/高度等……所有这些都 100% 有效。

4

2 回答 2

4

这似乎是旧 IE 中的一个真正错误。据报道,一个有效的技巧是.focus()连续调用两次。

于 2012-06-27T14:49:24.010 回答
1

不应该$(element).focus()代替element.focus()吗?focus是一个 jQuery 方法,必须在 jQuery 对象上调用。

于 2012-06-26T23:12:00.923 回答