2014-02-07 24 views
0

這可能是一個常見的錯誤,但我找不到另一種方法來做到這一點。我創建顯示使用timeline.js用下面的代碼Javascript:不能調用未定義的方法

function createTimeline(){ 
     for(var length = data.section.length,i = 0; i < length; i++){ 
      var divWrapper = document.createElement("div"); 
      if(i != data.section.length - 1) 
       divWrapper.setAttribute('class','timelineWrapper'); 
      $('body').append(divWrapper); 
      layer[i] = new links.Timeline(divWrapper); 
      links.events.addListener(layer[i], 'rangechange', 
       function(){ 
        var that = this; 
        var range = layer[i].getVisibleChartRange(); 
        for (var j = 0; j < layer.length; j++){ 
         if(j != i){ 
          layer[j].setVisibleChartRange(range.start, range.end); 
         } 
        } 
       } 
      ); 
      layer[i].draw(data.section[i].project, options); 
     } 
    } 

它給人的錯誤Cannot call method 'getVisibleChartRange' of undefined多個項目的時間表。 這裏有什麼問題?爲什麼layer [i]未定義?它在事件範圍變化期間沒有被檢測到。

+0

在此方法執行之前加載'timeline.js'。示例'

1

該問題是由於用作事件處理程序的未命名函數使用其父作用域的i變量而引起的。 在你的循環結束時,在這個範圍內的i == data.section.length。

這也是所有事件處理程序的i值。因此,layer [i]是未定義的,並且導致錯誤消息。

解決此問題最簡單的方法是創建一個函數構造函數,以i爲參數並返回一個新函數(您的處理函數)。 在這個返回的處理程序的直接父級作用域中,i值將是您傳遞給functionBuilder函數的參數。

今天晚些時候我會後一些代碼示例,只要我有一臺PC,(沒辦法,我可以鍵入與平板電腦:O))

編輯:我已經太慢了。 .. MC10貼或多或少什麼,我想後:O)

如果你不明白爲什麼這個工程,或者是關閉,範圍或約束手段,這裏是一個古老而完整的解釋: http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html

+0

謝謝你的幫助。我一直有關閉的問題,我認爲它對我來說更加清晰 –

相關問題