特定の属性を持つ要素の日付をうまくフォーマットする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には、この再現可能なテスト ケースに関する未解決の問題があります。