用兩天晚上的時間用原生JS擼出一個時間選擇器无切,發(fā)現(xiàn)并沒有自己想象的那么復(fù)雜,只要了解關(guān)于JS的Date對象和方法泳秀、以及如何處理事件和DOM,基本就可以了榄攀。
時間選擇器
直接看DEMO
說說踩到的坑:
關(guān)于觸發(fā)事件的元素
JS的事件機制是由捕獲和冒泡組成的嗜傅,先捕獲到最底部的元素,再逐層冒泡觸發(fā)事件檩赢。而在chrome開發(fā)中吕嘀,可以通過event.srcElement 和 event.target 去獲取觸發(fā)的元素的,而在 firefox 中贞瞒,只能通過 event.target 獲取偶房, 通過查找資料,在 IE 中只能通過 event.srcElement 去獲取军浆。
about srcElement and target關(guān)于對象的比較
如果你嘗試對兩個Date對象進行大小的比較棕洋,你會發(fā)現(xiàn)可以得到結(jié)果,但如果使用 == 去比較瘾敢,就永遠(yuǎn)都是 false拍冠。
這個仔細(xì)想想就明白了,當(dāng)我們使用 > | < | >= | <= 這些符號去比較兩個對象時簇抵,比較的時候會自動調(diào)用 Object.valueOf() 函數(shù)庆杜,如果 valueOf獲取到的還是對象無法比較的話,那么就會調(diào)用 Object.toString() 將對象轉(zhuǎn)化為字符串來比較碟摆;
但是如果使用 == 或者 === 時晃财, 比較的是對象的地址是否一樣,也就是這個變量存儲的指向?qū)ο蟮牡刂肥欠褚恢铝恕?/p>
這個可以通過下面的例子去理解:
var a = { 'a': 100};
var b = {'a': 100};
a == b // false
a > b // false
a < b // false
a >= b // true
a <= b // true
a.toString = function() { return 1000;}
b.toString = function() { return 999; }
a > b // true
a < b // false
a >= b // true
a <= b // false
a.valueOf = function() { return this['a'];}
a.valueOf = function() { return this['a'];}
a > b // false
a >= b // true
b < a // false
b <= a // true
- 如何獲取元素的絕對位置
通過 obj.offsetLeft 和obj.offsetTop 可以獲取元素相對父容器的左邊距和頂部邊距典蜕,然后循環(huán)迭代到頂層節(jié)點断盛,從而計算出元素的絕對位置, 有了絕對位置愉舔,可以通過 scrollLeft 和scrollTop 計算出元素相對于瀏覽器的位置钢猛。
DEMO