0

我有一个页面本身可以正常工作的问题,但是当它嵌入到公司网页的 iFrame 中(我无法控制)时,它会在 IE9(但不是 IE8)中阻塞。

该页面使用 jQuery 进行 AJAX 调用,并使用 KnockoutJS 绑定内容以进行显示。该页面将 GET 请求中的参数传递给我的服务器,并使用 AJAX 进行响应,并且似乎在从服务器获取数据时阻塞。但是,当执行此代码时,数据正确且格式正确:

$.ajax({
    url: this.serviceURL + parameters,
    dataType: 'json',
    success: callback,
    timeout: 3000,
    error: function (jqXHR, status, errorThrown) {
        if (status == "timeout") {
            error("The connection to the server timed out.\nEither the server is down or the network is slow.\nPlease try again later.");
        }
        else {
            error("An error occurred while trying to communicate with the server.\n " + errorThrown);
        }
    }
});

在 IE9 中,我总是使用“SyntaxError: Invalid character”的 errorThrown 来点击“An error occurred...”分支,但它什么也没告诉我。

有人对如何调试此问题有任何建议吗?我使用 Fiddler 查看服务器发送和返回的内容,并且一切看起来都很好。

更新:在上面睡了一会儿之后,我今天开始焕然一新。我确定的是,由于某种原因,当我的页面是 iFramed 时,而不是获取 JSON 响应:

"{"Foo":true,"Bar":true}"

我实际上得到(从强制错误处理程序中的错误,以便我可以检查 jqXHR.responseText 的状态)是:

" {"Foo":true,"Bar":true}"

如果使用控制台尝试输入 JSON.parse,则会出现错误。所以问题是,这个领先的空间到底是从哪里来的?如果我在 Firefox 中运行它,我会看到来自服务器的正确响应(没有空格),如果我在 iFrame 之外运行它,我看不到前导空格。所以我认为它不会出现在服务器端。在父页面和我的页面上运行的 JS 混乱中的某个地方,它插入了一个前导空格。

更新 2:仔细检查发现 jqXHR.responseText.charCodeAt(0) 是 65279,所以它实际上不是一个空格(尽管它显示为一个)它是字节顺序标记。但是为什么它现在(而不是之前)在那里,为什么它会引起问题?

4

1 回答 1

1

我无法弄清楚这个问题的原因,所以我通过在我的 ajax 调用中添加一个自定义转换器来解决这个问题。所以我现在有这个:

        $.ajax({
            url: this.serviceURL + parameters,
            dataType: 'json',
            success: callback,
            timeout: 3000,
            converters: { "text json": HackyJSONConverter },
            error: function (jqXHR, status, errorThrown) {
                if (status == "timeout") {
                    //alert("Timed out");
                    error("The connection to the server timed out.\nEither the server is down or the network is slow.\nPlease try again later.");
                }
                else {
                    error("An error occurred while trying to communicate with the server.\n " + errorThrown);
                }
            }
        });

我的 hacky 转换器看起来像这样:

    function HackyJSONConverter(data) {
        if (data[0] = 65279) {
            // leading BOM - happens only with an iFrame in OT for some unknown reason
            data = data.substring(1);
        }
        return JSON.parse(data);
    }

这非常愚蠢,如果有人有更好的方法,我会很高兴!

于 2012-08-08T20:28:49.923 回答