4

最新のChromeとFirefoxで動作するコードがあります。
しかし、IE9は私を嫌っています(そして私は同じように感じます)。

私が得ている特定のエラーは次のとおりです。
Object doesn't support property or method 'done'

問題のコード:

app.$.ajax({
                url: app.baseUrl + "Geos",
                contentType: "application/json",
                dataType: "json"
            }).done(function (data) {
                app.controls.ddlGeos.html('');

                for (var i = 0; i < data.d.length; i++) {
                    var geo = data.d[i];
                    var option = $(document.createElement("option"));

                    option.attr('value', geo.code);
                    option.html(geo.name);

                    app.controls.ddlGeos.append(option);
                };
            }).fail(function (xhr, status) {
                console.log("Error retrieving Geo list", xhr, status);
            }).always(function (data, status, xhr) {
                app.controls.ddlGeos.parent().find('#geo_ajax_image').remove();
                app.setSelectedValues(app.controls.ddlGeos, app.controls.hdnGeo.val());
            });

これを少し異常なものにしているのは、次のようにjQuery 1.8.2)の最新バージョンを手動でロードしていることです。

// The following code allows us to run jQuery 1.8.2 independantly of the main jQuery
    if (!jq) {
        var script = document.createElement("script");
        script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js';
        script.onload = script.onreadystatechange = function () {
            window.jq18 = jQuery.noConflict(true);
            app.init(window.jq18);
        };
        document.body.appendChild(script);
    } else {
        app.init(jq);
    }

これを行う理由は、非常に古いWebアプリに対して作成していて、window。$を上書きできないため、アプリに最新のjQueryバージョンを送信しているためです。
しかし、私はいくつかのコンソールロギングを行い、ajax呼び出しがヒットするまでに正しいバージョンのjQueryがロードされています。 app.$().jquery出力"1.8.2"

編集
わかりました、私は問題の一部を知っていると思います。私は2つの異なるASP.NetUserControlsで同様のコードを実行しています(カプセル化されたWebページを考えてください)。どちらも他方が存在することを確認できないため、両方ともこの方法でjQuery1.8.2をロードしています。FirefoxとChromeはこれを問題なく処理しているようですが、IEが原因で「onreadystatechange」イベントが2回発生しています(適切なバージョンのjqueryがないと、そのうちの1つが発生しています)。
そのjqueryロードコードを変更して、1回だけ発生するようにするためにできることはありますか?私はそれをこのように呼んでいます:

(function (jq) {
    // All my "app" code here
    app = {
        init : function($) {
            app.$ = $ || window.$;
            // Other code
        }
    };

    if (!jq) {
        var script = document.createElement("script");
        script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js';
        script.onload = script.onreadystatechange = function () {
            window.jq18 = jQuery.noConflict(true);
            app.init(window.jq18);
        };
        document.body.appendChild(script);
    } else {
        app.init(jq);
    }
})(window.jq18);
4

1 に答える 1

1

IE9には、、などのreadyStatesがあるようです。これらの間の遷移はIEで発生するようです。最終的にファイドされるので、すべてを数回初期化しています。それがどのようにの奇妙な戻り値を引き起こすのかはわかりませんが、明らかにそれを削除すると修正されます。"uninitialized""loading""complete"onreadystatechangeonload$.ajax

于 2012-11-12T18:50:01.393 に答える