2016-02-11 26 views
1

我知道JavaScript並不是最好的方法去做這件事。我知道我必須啓用瀏覽器並始終運行。我通常會用Python做些事情。這是我的具體要求,我不是很熟練使用JavaScript。話雖如此。使用Javascript我希望能夠在特定時間運行特定任務

我希望用戶能夠使用輸入設置時間。一旦設置了這些輸入,我希望瀏覽器檢查指定的時間。一旦時間到了,我希望它執行一個命令。

她是我到目前爲止有:

<html> 
<body> 

<p>Enter Time to start dashboard</p> 
<p>Hour</p> 
<input id="strthour"> 
<p>Minute</p> 
<input id="strtmin"> 
<button onclick="setTime()">Submit</button> 

<script> 
var hr = 06; //default time of 6am to run 
var mn = 00; 

function setTime() { 
    hr = strthour.value; 
    mn = strtmin.value; 
} 

window.setInterval(function(){ // Set interval for checking 
    alert(hr+mn); 
    var date = new Date(); // Create a Date object to find out what time it is 
    if(date.getHours() === hr && date.getMinutes() === mn && date.getSeconds() === 0){ // Check the time 
     alert("it worked") 
    } 
}, 5000); // Repeat every 60000 milliseconds (1 minute) 

</script> 

</body> 
</html> 

我能夠改變全局變量,但我無法得到window.setInterval認識的變化。有什麼建議?

這是我製作的JSFiddle的鏈接。

+0

我不確定你的意思是「我無法獲得window.setInterval來識別這些變化。」你能更具體地瞭解發生了什麼問題嗎?我預見到的一個問題是,你正在檢查'date.getSeconds === 0'',但'setInterval'每5秒運行一次。 – jered

+0

當我使用setTime()函數更改全局變量hr和mm時,window.setInterval無法識別更改。我希望能夠使用setTime()更改全局變量,並讓window.setInterval使用它們的值在特定時間運行命令。 – Ryan113

回答

1

您沒有正確指輸入,你也有你的警覺語法錯誤。下面是我建議的修復(工作):

<p>Enter Time to start dashboard</p> 
<p>Hour</p> 
<input id="strthour"> 
<p>Minute</p> 
<input id="strtmin"> 
<button onclick="setTime()">Submit</button> 
<script> 
    var hr = 0; 
    var mn = 0; 

    function setTime() { 
     hr = parseInt(document.getElementById("strthour").value); 
     mn = parseInt(document.getElementById("strtmin").value); 
     console.log("set time: "+hr+":"+mn); 
    } 

    setInterval(function(){ 
     var date = new Date(); 
     if(date.getHours() == hr && date.getMinutes() == mn){ // using == not === 
      alert("it worked"); 
     } 
    }, 10000); 
</script> 

注意:您也應該parseInt函數()的值,以確保它們是有效的數字。

+1

您還應該使用「==」運算符,而不是「===」 – TheMintyMate

+0

正確,字符串int比較將永遠不會出現在'===' – walkerrandophsmith

+0

謝謝。這給了我我需要的東西。 – Ryan113

1

這不是因爲setInterval無法識別更改,您實際上不會修改這些值。

如果您在jsfiddle頁面上打開javascript控制檯,您會看到「Uncaught ReferenceError:setTime未定義」。

如果你定義你setTime這樣它將工作:

window.setTime = function() { 
    hr = strthour.value; 
    mn = strtmin.value; 
} 

這是因爲的jsfiddle不直接運行你的代碼,但包裝成

<script type='text/javascript'>//<![CDATA[ 
window.onload=function(){ 
    ... // you code here } 
}//]]> 

這裏是一個modified JSFiddle剛剛「它爲我工作」。

更新 - 一些筆記,在其他的答案中提到:

  • 使用「===」也是一個問題,人力資源/分鐘都是字符串,所以你需要「==」或將hr/mn轉換爲整數
  • 表達式strthour.valuesetTime中可用於JSFiddle。我不太確定爲什麼,但它有效。在 「現實世界」,它應該像document.getElementById("strthour").value

更新2 - 爲什麼strthour.value工作(VS document.getElementById("strthour").value)?

這實際上對我來說是一個驚喜,但它看起來像所有主流瀏覽器都將所有元素與id放入窗口對象中。更重要的是,它實際上是HTML standard的一部分(雖然不建議使用此功能):

6.2.4 Named access on the Window object

window[name] Returns the indicated element or collection of elements.

As a general rule, relying on this will lead to brittle code. Which IDs end up mapping to this API can vary over time, as new features are added to the Web platform, for example. Instead of this, use document.getElementById() or document.querySelector().

參考文獻:

-1

我覺得你應該用「 > =「運營商,因爲你不知道這是否是時間。

1
if(date.getHours() === hr && date.getMinutes() === mn && date.getSeconds() === 0){ // Check the time 
     alert("it worked") 
    } 

這會將一個字符串與一個int進行比較,並始終爲false。

要麼執行parseInt(date.getHours())或使用==

1

你的代碼有幾個問題,各個人都指出了。

  1. 沃克倫道夫·史密斯正確地指出,date.GetHours()date.getMinutes()都將返回數字,而從價值觀和strthour.value返回strtmin.value將字符串。當JavaScript比較這兩個時,它將始終評估爲false。要解決此問題,請嘗試通過parseInt運行用戶輸入,如hr = parseInt(strthour.value, 10);。 10很重要,因爲它告訴parseInt創建一個基數10(你不需要知道這意味着什麼,只要確保包含10)。

  2. 您需要秒匹配可能是不必要的,並且與您選擇的間隔不匹配。 TheMintyMate在他們的代碼片段中通過簡單地刪除比較秒來做出這種更正。如果您確實需要確保秒數完美匹配,請選擇少於1000毫秒的時間間隔,以便您知道它將每秒至少檢查一次,以確保您將在所需的第0秒內運行檢查時間。

  3. ,如果你試圖將它們的比較結果爲字符串,而不是像點1.推薦.getMinutes()方法將返回一個數字0像6時間轉換爲數字你可能會遇到一些麻煩與單數的分鐘數: 00,而您的示例隱式提示用戶在同一時間輸入兩位數字。同樣,您可以完全避免使用parseInt,正如第1點中所建議的那樣。

我必須拋出一個插件,使用Cron作業來按照像這樣的已知時間表運行任務。我知道你說用戶在這種情況下要求JS,所以他們可能不會申請這個特定的情況。由於你沒有提到Cron工作,所以我必須將它們包含在這裏,以確保你和未來的讀者都能意識到它們,因爲它們是專門用於按照自動時間表運行任務的情況。

祝你好運!