0

それ自体で正常に機能するページに問題がありますが、企業のWebページ(私が制御していない)の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:Invalidcharacter」の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つとして表示されますが)、バイト順マークです。しかし、なぜ今(以前ではなく)そこにあり、なぜそれが問題を引き起こしているのですか?

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);
                }
            }
        });

そして、私のハッキーコンバーターは次のようになります。

    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 に答える