2012-12-14 161 views
0

所以我有這樣的代碼:http://jsfiddle.net/7rGSb/1/功能不起作用

var volumeDiv = document.getElementById("volumeNumber"); 
var volumeOld = 8; 
var volumeNew = 37; 
var timeNew = (1000/(volumeNew - volumeOld)); 
changeVolume(); 

function changeVolume() { 
    volumeDiv.innerHTML = volumeOld; 
    volumeOld++; 
    if (volumeOld <= volumeNew) setTimeout(changeVolume, timeNew); 
};​ 

它在1秒內從8要37串。它工作正常。

然而,當我試圖把它變成一個click事件處理(http://jsfiddle.net/wH2qF/1/),它停止工作:

$(function() { 
    $("#Volume").click(function() { 

     setTimeout(triggerVolumeChange, 4000); 

     function triggerVolumeChange() { 

      var volumeDiv = document.getElementById("volumeNumber"); 
      var volumeOld = 8; 
      var volumeNew = 37; 
      var timeNew = (1000/(volumeNew - volumeOld)); 
      changeVolume(); 

      function changeVolume() { 
       volumeDiv.innerHTML = volumeOld; 
       volumeOld++; 
       if (volumeOld <= volumeNew) setTimeout(changeVolume, timeNew); 
      }; 

     }; 

    }); 
});​ 

任何想法,爲什麼?

是因爲我在另一個函數裏面調用changeVolume();?如果是這樣,我怎樣才能使這個功能工作,而不必打電話?

+0

爲什麼你有嵌套函數嗎? –

+0

@ Sushanth--我的猜測是範圍界定或意外。函數始終是嵌套的,儘管有時不如此明顯。 –

+0

我對JS非常陌生,所以我爲代碼的結構方式而道歉......也許這就是爲什麼它不工作......關於如何解決它的任何想法?我基本上需要這個字符串在用戶點擊按鈕後的8到4秒內完成(這是爲了我正在設計的應用程序的模擬環境) – ttothec

回答

4

您選擇了MooTools,但看起來您正在使用jQuery的.ready()和DOM選擇語法。

從左側菜單中選擇一個jQuery選項。或者擺脫外部$(function() {...});並更新選擇/處理程序代碼。

+1

擊敗我45秒! – Malvolio

+0

對不起。我在工作中被放在這個項目上,並且由於時間緊迫,我拼命地試圖解決這些問題......所以我的大部分「編碼」都來自於粘貼來自tuts和其他文檔站點的零碎文件我在網上看到...關於給你這個小提琴的答案:http://jsfiddle.net/wH2qF/1/你能指出我需要進行必要的更改,以便在點擊時正確使用此功能嗎?不勝感激! – ttothec

+0

@ttothec:在jsFiddle頁面的左側,有一個菜單,當前選擇了「MooTools 1.4.5」。點擊該菜單,然後選擇「jQuery 1.8.2」。 *(當然,點擊頂部的'Run')* –

1

爲什麼你有嵌套函數當在這種情況下不需要..

移動函數聲明向外界

$(function() { 
    $("#Volume").click(function() { 
     setTimeout(triggerVolumeChange, 4000); 
    }); 
}); 

var volumeDiv = document.getElementById("volumeNumber"); 
var volumeOld = 8; 
var volumeNew = 37; 
var timeNew ; 

function triggerVolumeChange() { 
    timeNew = (1000/(volumeNew - volumeOld)); 
    changeVolume(); 
}; 

function changeVolume() { 
    volumeDiv.innerHTML = volumeOld; 
    volumeOld++; 
    if (volumeOld <= volumeNew) 
     setTimeout(changeVolume, timeNew); 
};​ 

同時確保框架設置爲jQuery的..

Check Fiddle