HTML5簡明教程(七)其他新技術

最后一部分介紹HTML5其他新技術。

1. 地理位置

HTML5地理定位功能由navigator.geolocation對象提供,API方法有三個:

  • getCurrentPosition: 獲取當前位置信息,包含經緯度挤巡,海拔慷垮,精度绵患。
navigator.geolocation.getCurrentPosition(successCallback, [errorCallback] , [positionOptions]);
  • watchPosition:定期輪詢設備位置信息,函數入參和getCurrentPosition相同账胧。
var watchID = navigator.geolocation.watchPosition(successCallback, [errorCallback] , [positionOptions]);
  • clearWatch:配合watchPosition()使用竞慢,停止輪詢
clearWatch(watchID);

瀏覽器在加載位置信息時,會開啟詢問窗口治泥,需要用戶確定后才允許網站訪問該數據筹煮。

confrim dialog.png

查找坐標的方法是異步的,不會立刻返回數據居夹,所以需要回調函數來處理成功或失敗消息败潦。下面是一個簡單的例子,點擊“l(fā)ocation”按鈕訪問位置信息:

<body>
<button onclick="getPosition()">Location!</button>
<div id="info"></div>
<script>
    var infoElt = document.getElementById("info");
    function getPosition() {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(geolocationSuccess,
                geolocationFailure,
                {
                    enableHighAccuracy: true, // 用高精度GPS位置檢測
                    timeout: 100000, // 等待位置數據返回的最大時間
                    maximunAge: 300000 // 緩存位置數據時間
                })
        }
        else {
            infoElt.textContent = "Do not support navigator.geolocation!";
        }
    }

    // 成功時的回調函數
    function geolocationSuccess(position) {
        infoElt.textContent = "Location: " + position.coords.latitude + ";" + position.coords.longitude;
    }

    // 失敗時的回調函數
    function geolocationFailure(error) {
        infoElt.textContent = "Error: code is " + error.code + "; message is " + error.message;
    }
</script>
</body>
小貼士

navigator是JavaScript中一個比較特殊的對象准脂,它的屬性包含當前瀏覽器的信息劫扒。
比如,最常用的navigator.userAgent狸膏,返回瀏覽器的版本號沟饥,操作系統(tǒng)等細節(jié)。
這個屬性常用于檢測移動設備操作系統(tǒng)湾戳,IOS或者Android闷板。

2. history對象

單頁面應用中使用的路由系統(tǒng),常用的實現(xiàn)方式是監(jiān)聽錨地變化院塞,即Hashbang URL遮晚。另一只實現(xiàn)方式就是利用history對象管理會話歷史,在URL變化的情況下不刷新頁面拦止。

history對象提供3個方法:

  • pushState(): 添加新的歷史條目
  • replaceState(): 用新條目替代已有的歷史條目
  • popstate事件: 每當激活的歷史記錄發(fā)生變化時县遣,該事件被觸發(fā)(激活的歷史記錄為用pushState創(chuàng)建的歷史條目)

例如,調用history.pushState(pageData, pageData.title, pageURL);方法添加一條新的歷史幾句汹族,頁面URL發(fā)生變化萧求,這時會觸發(fā)popstate事件,在事件回調中顶瞒,可以做UI方面的更新操作夸政,同時,頁面不會reload榴徐。

window.addEventListener('popstate', function(event) {
  updateContent();
});

3. 拖拽

HTML5提供拖拽的API守问,可以在需要拖拽/目標的元素上監(jiān)聽這些事件匀归,從而操作DOM元素。

相關事件有:

  • ondragstart:當拖拽元素開始被拖拽的時候觸發(fā)的事件(作用在被拖曳元素上)
  • ondragenter:當拖曳元素進入目標元素的時候觸發(fā)的事件(作用在目標元素上)
  • ondragover:拖拽元素在目標元素上移動的時候觸發(fā)的事件(作用在目標元素上)
  • ondrop 事件:被拖拽的元素在目標元素上同時鼠標放開觸發(fā)的事件(作用在目標元素上)
  • ondragend 事件:當拖拽完成后觸發(fā)的事件(作用在被拖曳元素上)

可以參考https://github.com/etianqq/html5-dnd-demo 耗帕,這個demo實現(xiàn)了在列表上拖拽列表項從而實現(xiàn)重新排序的功能穆端。

4. 跨域通信postMessage

window.postMessage()可以實現(xiàn)跨域通信,當調用此方法時仿便,會向目標窗口發(fā)送一個MessageEvent消息体啰,目標窗口通過監(jiān)聽事件接受消息。

主要用于跨域iframe直接通信嗽仪。

語法為:

otherWindow.postMessage(message, targetOrigin, [transfer]);

* otherWindow:其他窗口的一個引用荒勇,比如iframe的contentWindow屬性
* message:消息
* targetOrigin:目標地址
* transfer(可選):和message一起傳遞的對象

在父窗口http://my.example.com中定義發(fā)送和接受消息:

<body>
<input type="button" value="get data from child frame" onclick="getData()"/>
<div id="result"></div>

<iframe src="http://child.example.com/api.html" frameborder="0" id="child-frame" style="display: none">
</iframe>

<script>
    function getData(){
        frames[0].postMessage('http://child.example.com/some-data', 'http://child.example.com');
    }

    window.addEventListener('message', function(event){
        if (event.origin !== 'http://child.example.com'){
            return;
        }

        document.getElementById('result').innerHTML = event.data;
    }, false);
</script>
</body>

在子窗口http://child.example.com中定義發(fā)送和接受消息:

<script>
    window.addEventListener('message', function(event){
        if (event.origin !== 'http://my.example.com'){
            return;
        }
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){
            if (xhr.readyState ==4 && xhr.status ==200){
                event.source.postMessage(xhr.responseText, 'http://my.example.com');
            }
        };

        var url = event.data;
        xhr.open(url, 'GET');
        xhr.send(null);
    }, false);
</script>

5. Web Component

用一個很簡單的標簽,比如<user-card>就可以實現(xiàn)較復雜的組件效果闻坚,且該組件的CSS和JS都是沙盒枕屉,外界代碼無法操控。這就是Web Component鲤氢。

userCard.png

具體講解可以參考老阮文章《Web Components 入門實例教程》搀擂,Demo:https://jsbin.com/xuqasemozo/edit?html,js,output

小結

當然,HTML5的功能還不止于系列文章中所提到的卷玉,在《HTML5簡明教程》中哨颂,只是把最常用的也是比較有特色的新特性介紹給大家,如有興趣相种,可以去探索更多HTML5的優(yōu)秀功能威恼。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寝并,隨后出現(xiàn)的幾起案子箫措,更是在濱河造成了極大的恐慌,老刑警劉巖衬潦,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斤蔓,死亡現(xiàn)場離奇詭異,居然都是意外死亡镀岛,警方通過查閱死者的電腦和手機弦牡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漂羊,“玉大人驾锰,你說我怎么就攤上這事∽咴剑” “怎么了椭豫?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我赏酥,道長喳整,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任今缚,我火速辦了婚禮算柳,結果婚禮上低淡,老公的妹妹穿的比我還像新娘姓言。我一直安慰自己,他們只是感情好蔗蹋,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布何荚。 她就那樣靜靜地躺著,像睡著了一般猪杭。 火紅的嫁衣襯著肌膚如雪餐塘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天皂吮,我揣著相機與錄音戒傻,去河邊找鬼。 笑死蜂筹,一個胖子當著我的面吹牛需纳,可吹牛的內容都是我干的。 我是一名探鬼主播艺挪,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼不翩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了麻裳?” 一聲冷哼從身側響起口蝠,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎津坑,沒想到半個月后妙蔗,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡疆瑰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年灭必,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃摹。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡禁漓,死狀恐怖,靈堂內的尸體忽然破棺而出孵睬,到底是詐尸還是另有隱情播歼,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站秘狞,受9級特大地震影響叭莫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜烁试,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一雇初、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧减响,春花似錦靖诗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颂鸿,卻和暖如春促绵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘴纺。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工败晴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栽渴。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓尖坤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親熔萧。 傳聞我的和親對象是個殘疾皇子糖驴,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容