调试IFrame内容

时间:2012-08-06 18:19:29

标签: javascript jquery ajax iframe internet-explorer-9

我遇到的问题是页面本身运行正常,但当它嵌入公司网页的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命中“发生错误...”分支,它没有告诉我任何内容。

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

更新:睡了一会儿后,我今天开始新鲜了。我确定的是,出于某种原因,当我的页面是iFramed时,而不是获得JSON响应:

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

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

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

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

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

1 个答案:

答案 0 :(得分: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);
    }

这真是太愚蠢了,如果有人有更好的方法,我会很高兴的!