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

我这样做的原因是因为我正在编写一个非常旧的网络应用程序并且我无法覆盖 window.$ 所以我正在向我的应用程序发送最新的 jQuery 版本。
但是,我已经完成了一些控制台日志记录,并且在 ajax 调用被命中时加载了正确版本的 jQuery IS。 app.$().jquery输出"1.8.2"

编辑
好的,我想我知道部分问题。我在 2 个不同的 ASP.Net UserControls 中执行类似的代码(想想封装的网页)。他们都以这种方式加载 jQuery 1.8.2,因为两者都不能确定另一个存在。似乎 Firefox 和 Chrome 可以处理这个问题,但 IE 不知何故导致我的“onreadystatechange”事件触发两次(并且不知何故其中一个在没有正确版本的 jquery 的情况下发生)。
我可以做些什么来修改该 jquery 加载代码以确保它只发生一次?我这样称呼它:

(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 好像readyState"uninitialized","loading""complete". 这些之间的转换似乎onreadystatechange在 IE 中触发。onload最终也被确定了,因此您要多次初始化所有内容。我不确定这如何导致奇怪的返回值$.ajax,但显然删除它可以修复它。

于 2012-11-12T18:50:01.393 回答