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]未定義?它在事件範圍變化期間沒有被檢測到。
在此方法執行之前加載'timeline.js'。示例'
該問題是由於用作事件處理程序的未命名函數使用其父作用域的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
來源
2014-02-07 07:25:24 LeFauve
謝謝你的幫助。我一直有關閉的問題,我認爲它對我來說更加清晰 –