1

我有一个我制作的 jQuery 插件,它可以很好地格式化具有某些属性的元素上的日期。总的来说,它可以工作,但我在使用 Modernizr 时遇到了一些问题,但仅限于 IE 中,并且只能在表单回发之后。

这是插件的一个片段,它使用了奇妙的MomentJS 库。基本上第一次调用插件时,它会下载所需的文件,然后运行代码来解析日期。如果之后随时调用它并且库已经下载,它可以继续运行日期解析代码。

function parseDates() {
    var $items = this;

    if (typeof moment !== "undefined") {
        //If we are calling this at a time after page load, just run the function
        setupDisplayDate();

    } else {
        //If the files have not been included yet, download them & call the function
        //Load in a date library!
        Modernizr.load({
            load: SCRIPTS_PATH + "moment.min.js",
            callback: setupDisplayDate
        });
    }

    function setupDisplayDate() {
        console.log("setupDisplayDate called! Moment is " + typeof moment);
        $items.each(function () {
            var $thisItem = $(this);

            var formatter = $thisItem.data("date-format") || "MMMM Do, YYYY";
            var ticks = parseInt($thisItem.data("date-ticks"), 10);
            var formattedDate = moment(ticks).format(formatter);
            $thisItem.text(formattedDate);
        });
    }
}

当我仅在页面回发后在 IE9 中执行此操作时,我在setupDisplayDate函数中收到一个错误,指出该时刻未定义。我究竟做错了什么?

我确实发现如果我超时 500 毫秒它会起作用,但我不应该这样做。我认为该Modernizr.load功能的全部意义在于下载代码,然后使其可用。似乎下载它并在它可以使用之前触发我的回调。


编辑

这是[关于 IE9 如何无法正确动态添加脚本的博客文章:http: //www.guypo.com/technical/ies-premature-execution-problem/

有什么办法吗?


另一个编辑

似乎问题实际上是关于对load函数的多次调用,然后是各种回调无序触发。GitHub 上有一个关于它和这个可重现的测试用例的未解决问题。

4

0 回答 0