ajax加载后IE焦点事件随机失败

时间:2012-06-26 23:06:14

标签: javascript jquery ajax internet-explorer-8 dom-manipulation

目前,我们只支持IE8。

我有一个从服务器获取数据的ajax调用,用响应替换容器div中的HTML,然后尝试将焦点放在响应中包含的元素上。

取决于[IE Magic]?有时这段代码有效,有时却没有。我需要找到一些可以在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%的时间内起作用。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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