1

現在、 Timeframe.jsという JS スクリプトをPrototype javascriptフレームワークで使用して、カレンダー ウィジェットを作成しています。私のローカル コピーでは問題なく動作しますが、ステージング環境では次の JavaScript エラーが発生します。

TypeError: this.element.down(...) は未定義です

this.element.down('div#' + this.element.id + '_container').insert(calendar);

エラーは、timeframe.js ライブラリ ファイルの 97 行目を参照しています。これは、次のメソッドの一部です。

// Scaffolding
createCalendar: function() {
  var calendar = new Element('table', {
    id: this.element.id + '_calendar_' + this.calendars.length, border: 0, cellspacing: 0, cellpadding: 5
  });
  calendar.insert(new Element('caption'));
  var head = new Element('thead');
  var row = new Element('tr');
  this.weekdayNames.length.times(function(column) {
    var weekday = this.weekdayNames[(column + this.weekOffset) % 7];
    var cell = new Element('th', { scope: 'col', abbr: weekday }).update(weekday.substring(0,3));
    row.insert(cell);
  }.bind(this));
  head.insert(row);
  calendar.insert(head);
  var body = new Element('tbody');
  (6).times(function(rowNumber) {
    var row = new Element('tr');
    this.weekdayNames.length.times(function(column) {
      var cell = new Element('td');
      row.insert(cell);
    });
    body.insert(row);
  }.bind(this));
  calendar.insert(body);
  this.element.down('div#' + this.element.id + '_container').insert(calendar);
  this.calendars.push(calendar);
  this.months = this.calendars.length;
  return this;
}, 

また、this.element.id の内容が有効であることも確認しました。値は、マークアップ内に存在する要素である「div#calendars_container」になるため、DOM から欠落していません。

この問題の原因を特定できませんでした。Prototype と Timeframe の最新バージョンを使用していることを確認しましたが、それでもエラーが発生します。私はこの方法でこれらのスクリプトをしばらく使用してきましたが、これまでにこれに遭遇したことはありません。誰かが私を正しい軌道に乗せることができますか?

4

1 に答える 1

0

これを解決するには、もう少しコンテキストを共有する必要があると思います。コードがローカルでは正常に実行されるが、(おそらくオフサイトの) ステージング環境では実行されない場合、実行が問題の行に到達するまでにすべてのコードがロードされていないことが原因である可能性があります。

あなたのスニペットはイベント ハンドラー内にあるようです。この行に到達する前にすべてのコードがロードされたとしても、Prototype が関数でthis.elementオブジェクトをまだ拡張していないタイミングの問題が存在する可能性があります。down()

おそらく、ステージング環境間の遅延が大きいため、ローカルで日常的に実行する方法とは逆に、ネットワークにバインドされた機能が次々と実行されます。

この行にブレークポイントを置いて、何が起こるか見てみましょう。

于 2013-02-08T17:49:49.360 に答える