如何利用iframe標簽以及Javascript制作時鍾?
如何制作一個時鍾呢?效果如下圖所示:

這里的時鍾會不停的走,但是下面的頁面是不會變得,這樣就實現了我們想要的效果了。下面我將分為以下幾個方面來講:
- javascript中的Date引用類型
- 幾種效果不佳的實例
- <iframe>標簽
- 最終效果不錯的實例、
- 使用react
如果大家想直接看最終不錯的效果實例,可以直接點擊這里。
第一部分:Date引用類型
1.日期對象可以直接使用new操作符和Date構造函數構造。代碼如下:
var date=new Date();
2. 通過構造函數直接得到的date對象的時間是當前的時間。由於Date類型使用自UTC(Coordinated Universal Time,國際協調時間)1970年1月1日午夜至改日期經過的毫秒數。所以如果直接輸出,按道理來說會出現一個很大的數字。但是因為Date引用類型是繼承了Object引用類型的,同時也就繼承了Object的toString()方法。故直接輸出時,它會默認使用toString()方法。
var date=new Date; console.log(date);// Mon Oct 31 2016 23:29:07 GMT+0800 (中國標准時間)
console.log(date.toString());//Mon Oct 31 2016 23:29:07 GMT+0800 (中國標准時間)
3.如果我們使用valueOf()方法(同樣也是繼承自Object()引用類型),就可以得到歷經的毫秒數了。
var date=new Date();
console.log(date.valueOf());//1477927747916
1477927747916毫秒算下來剛好是46年多。
4.同時,Date還有一個toLocaleString()方法,該方法會將毫秒表示的時間轉化為當地的字符串表示的時間,如下所示:
var date=new Date(); console.log(date.toLocaleString());//2016/10/31 下午11:29:07
5.但是如果我們不想使用當前時間而希望使用自定義的時間呢? Date類型為我們提供了兩種方法,分別具有不同的初始化方式。
var time=new Date(Date.parse("October 31,2016"));
console.log(time);//Mon Oct 31 2016 00:00:00 GMT+0800 (中國標准時間)
var Time=new Date("October 31,2016");
console.log(Time);//Mon Oct 31 2016 00:00:00 GMT+0800 (中國標准時間)
var dateTime=new Date(Date.UTC(2016,9,31,23,26,50));
console.log(dateTime);//這是一個bug Tue Nov 01 2016 07:26:50 GMT+0800 (中國標准時間)
var Timedate=new Date(2016,9,31,23,26,50);
console.log(Timedate);//Mon Oct 31 2016 23:26:50 GMT+0800 (中國標准時間)
即這兩個方法分別是在構造函數時初始化,一個是Date.parse(),如果輸入的格式正確,我們甚至省略之。另外一個是Date.UTC,這里傳入了六個參數,分別是 年 月 日 時 分 秒 ,同樣是可以省略不寫。這里值得注意的是:
- “月”是從0開始計算的,即2月但是要輸入1,10月要輸入9......
- “時”必須使用24小時的方法來計算。
但是這里有一個bug,即當我們使用var dateTime=new Date(Date.UTC(2016,9,31,23,26,50));傳入的數字是9,應該得到10月份,卻得到了11月份,這時我們可以采用其他方法來替換之。
第二部分:幾種效果不佳的實例
ok!已經知道了如何創建時間對象,這時候,我們就可以使用它來做時鍾了。但是,以下幾種方法創建時鍾是不合適的。
A. 使用javascript定時器外加meta標簽中的自動刷新功能。
代碼如下圖所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="2">
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="time"></div>
<script>
var date=new Date();
var time=document.getElementById("time");
setInterval(function(){
time.innerHTML=date.toLocaleString();
},1);
</script>
</body>
</html>
如果你嘗試以下發現確實可以達到類似的效果,但是你應該注意到這時我們在div元素中沒有插入任何內容,一旦插入內容,就會發現得不到我們想要的效果了,因此這種方式不可取。
B 使用javascript定時器外加window.location.reload()函數,使頁面不斷刷新。代碼如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="time"></div>
<script>
var date=new Date();
var time=document.getElementById("time");
function reload(){
window.location.reload();
}
setInterval(function(){
reload();
},1000);
setInterval(function(){
time.innerHTML=date.toLocaleString();
},1000);
</script>
</body>
</html>
毫無疑問,這種方法也會導致頁面不斷刷新,在div中加入一些文字或者圖片就可以看出來。
C.使用javascript以及dom方法實現。
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="2">
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="time"><img src="時鍾.jpg"/>我是桌面上的時鍾,哈哈</div>
<div id="bottom">
</div>
<script>
var date=Date.now();
var time=document.getElementById("time");
var para=document.createElement("p");
time.appendChild(para);
setInterval(function(){
para.innerHTML=date.toLocaleString();
},1000);
</script>
</body>
</html>
即我們在div中只創建一個p,把時鍾放到p中去,動態的刷新p,並且這是你可以添加文字或者圖片,發現都不會有影響。這就大功告成了嗎?如果你嘗試這在div中插入一個視頻,就會發現,視頻會在你規定的時間不斷刷新,播放不了,因此圖片和文字看不出來,是因為我們肉眼沒法分辨,因此,這種方法也不可取。
注:插入視頻可以如下:
<embed align="center" src="告白氣球.mp4" type="audio/mpeg" width="1002" autostart="false" controls="controls" height="500" ></embed>
當然,這只是其中一種方法,html5中還有其他方法,大家可以學習。
第三部分:<iframe>標簽
<iframe>標簽規定了一個內聯框架,它可以用來在當前html文檔中嵌入另外一個文檔。
如<iframe scr="http://www.zhuzhenwei.com"><iframe>。在iframe元素的內容部分,即<iframe>與</iframe>之間是不需要放內容的。但是我們可以放一些提示性的內容,這樣對於一些不支持<iframe>標簽的瀏覽器就可以顯示其中的內容了。
在iframe標簽中有一些屬性,比較常用的就是height width ,這兩個屬性可以規定這個內聯框架的高度和寬度。name屬性可以規定<iframe>的名稱。src屬性用於規定在<iframe>中顯示的文檔的url。scrolling屬性有yes no auto 三種屬性值,它規定是否在<iframe>中顯示滾動條。
第四部分:最終效果不錯的實例
從第三部分可知,如果我們能使用iframe標簽引入一個外部的文檔,就可以解決所有的問題了,因為每當刷新時,只會刷新在iframe里面的內容。代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<iframe src="test.html" width="200" height="30" seamless="seamless" scrolling="no" ></iframe>
<p>我是頁面上的時鍾,哈哈</a>
</body>
</html>
以下是test.html中的代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="time"></div>
<script>
var date=new Date();
var time=document.getElementById("time");
function reload(){
window.location.reload();
}
setInterval(function(){
reload();
},1000);
setInterval(function(){
time.innerHTML=date.toLocaleString();
},1000);
</script>
</body>
</html>
OK!成功解決問題!效果圖如下:

此時,下面的時鍾可以正常運行,上面的視頻也可以正常播放。
第五部分:使用React
使用reactl.js來實現也是非常簡單的,代碼如下所示:
htmL
<div id="root">
<!-- This element's contents will be replaced with your component. -->
</div>
js
function tick() {
const element = (
<div>
<h1>Hello, world!</h1>
<h2>現在是{new Date().toLocaleTimeString()}.</h2>
</div>
);
ReactDOM.render(
element,
document.getElementById('root')
);
}
setInterval(tick, 1000);
這種方法是最好的。因為react的虛擬dom的特點,每次只會修改被修改的dom部分。
世之奇偉、瑰怪、非常之觀,常在於險遠,而人之所罕至焉,故非有志者不能至也。
