我有一个我制作的 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 上有一个关于它和这个可重现的测试用例的未解决问题。