2010-09-30 55 views
1

我正在爲我的網站倒計時計時器,但無法使腳本正常工作。腳本的創建者PHP F1無法提供幫助。倒數計時器不能正常工作

問題是:爲什麼在目標日期($targetDate)的年份變量沒有通過HTML/JavaScript實現?

我正在使用mktime()函數。不管我是否將實際日期放入最後一個屬性位置(一年)或是否放入日期函數(例如我在下面的代碼中完成它),我都無法使其正確顯示前端。

我不是任何方式的PHP/JavaScript大師,所以這可能看起來像一個真正的noobie問題,但如果任何人都可以幫助我,這將不勝感激!

這裏是現場執行下面的代碼: http://tripdealio.com/countdown/countdown5.php

下面是代碼:

<?php 
/* Define your target date here 
    $targetYear = 2011; 
    $targetMonth = 09; 
    $targetDay = 30; 
    $targetHour = 23; 
    $targetMinute= 59; 
    $targetSecond= 59; 
End target date definition */ 

// Define date format 
$dateFormat = "Y-m-d H:i:s"; 

$targetDate = mktime(23,59,59,09,30,date("Y")); 
$actualDate = time(); 

$secondsDiff = $targetDate - $actualDate; 

$remainingDay  = floor($secondsDiff/60/60/24); 
$remainingHour = floor(($secondsDiff-($remainingDay*60*60*24))/60/60); 
$remainingMinutes = floor(($secondsDiff-($remainingDay*60*60*24)-($remainingHour*60*60))/60); 
$remainingSeconds = floor(($secondsDiff-($remainingDay*60*60*24)-($remainingHour*60*60))-($remainingMinutes*60)); 

$targetDateDisplay = date($dateFormat,$targetDate); 
$actualDateDisplay = date($dateFormat,$actualDate); 

?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Max's Countdown System</title> 
<link href="style/style.css" rel="stylesheet" type="text/css" /> 
<script type="text/javascript"> 
    var days = <?php echo $remainingDay; ?> 
    var hours = <?php echo $remainingHour; ?> 
    var minutes = <?php echo $remainingMinutes; ?> 
    var seconds = <?php echo $remainingSeconds; ?> 

function setCountDown() 
{ 
    seconds--; 
    if (seconds < 0){ 
     minutes--; 
     seconds = 59 
    } 
    if (minutes < 0){ 
     hours--; 
     minutes = 59 
    } 
    if (hours < 0){ 
     days--; 
     hours = 23 
    } 
    document.getElementById("remain").innerHTML = days+" days, "+hours+" hours, "+minutes+" minutes, "+seconds+" seconds"; 
    setTimeout ("setCountDown()", 1000); 
} 

</script> 
</head> 

<body onload="setCountDown();"> 
<div id="container"> 
    <div id="header"><div id="header_left"></div> 
    <div id="header_main">Max's Countdown System</div><div id="header_right"></div></div> 
    <div id="content"> 
     <table class="countTable"> 
      <tr><td>Target date:</td><td><?php echo $targetDateDisplay; ?></td></tr> 
      <tr><th colspan="2" id="remain"><?php echo "$remainingDay days, $remainingHour hours, $remainingMinutes minutes, $remainingSeconds seconds";?></th></tr> 
      <tr><td>Actual date:</td><td><?php echo $actualDateDisplay; ?></td></tr> 
     </table> 
    </div> 
    <div id="footer"><a href="http://www.phpf1.com" target="_blank">Powered by PHP F1</a></div> 
</div> 
</body> 
</html> 
+0

PHP代碼看起來不錯。你能發佈生成的HTML標記嗎? – Confluence 2010-09-30 23:50:17

+1

不需要時使用字符串值'setTimeout';改用函數引用('setTimeout(setCountDown,1000)')。順便說一句,你不要在HTML/JS中使用'$ targetDate',而是使用'$ targetDateDisplay';此外,當你的鏈接時,沒有什麼是錯的。 – 2010-09-30 23:50:59

回答

1

我看不出有什麼特別錯誤的算法,只有語法錯誤(缺少分號)在JS代碼中。這是固定的代碼:

var days = <?php echo $remainingDay; ?>; 
var hours = <?php echo $remainingHour; ?>; 
var minutes = <?php echo $remainingMinutes; ?>; 
var seconds = <?php echo $remainingSeconds; ?>; 

function setCountDown() 
{ 
    seconds--; 
    if (seconds < 0){ 
     minutes--; 
     seconds = 59; 
    } 
    if (minutes < 0){ 
     hours--; 
     minutes = 59; 
    } 
    if (hours < 0){ 
     days--; 
     hours = 23; 
    } 
    document.getElementById("remain").innerHTML = days+" days, "+hours+" hours, "+minutes+" minutes, "+seconds+" seconds"; 
    setTimeout ("setCountDown()", 1000); 
} 

你也可以用它代替的setTimeout的setInterval但是這只是一個表面上的變化。

+2

當不需要時,不要將字符串值用於'setTimeout';改用函數引用('setTimeout(setCountDown,1000)')。 – 2010-09-30 23:54:49

+0

或更好setTimeout(function(){..},1000) – shox 2010-10-01 00:12:07

+0

@shox:使用匿名封裝函數的優點是什麼? – 2010-10-01 00:37:11

1

你計算使用的目標時間

$targetDate = mktime(23,59,59,09,30,date("Y")); 
    // be careful:   ↑ 

但有0開始的數字被視爲在PHP 八進制;此外,引用documentation

如果在八進制整數(即8或9)中給出無效數字,則忽略該數字的其餘部分。

所以09實際上將被解析爲0,正如例如#的mktime 3顯示

任何給定月份的最後一天都可以被表示爲下個月的第「0」天,不是-1天。

所以一個月0將導致每年數遞減,在這一刻2009年

正如你已經猜到了,解決方法很簡單:掉落0

$targetDate = mktime(23,59,59,9,30,2011); 

date("Y")目前將返回2010年,但根據你的評論你想2011年)。

順便說一句,我想你想用setInterval而不是setTimeout;請參閱setTimeout or setInterval?