使用百度天氣API實現自己的天氣預報

昨天在簡書看到一篇帖子是關於百度天氣API的,感覺很棒,所以今天自己也寫了個自己的天氣預報,利用jsonp跨域請求,實現自己的天氣預報展示。展示github鏈接:https://lwjcode.github.io/weatherForecast/weather.html
如圖:
這裏寫圖片描述
這裏寫圖片描述

最主要的肯定是js了,接下來看一下如何實現:

1. 獲得自己所在的當前城市

這個百度地圖給了API,我們只要調用就可以,代碼如下:

    //用百度地圖API獲得當前所在城市
    var map = new BMap.Map('map');
    var myCity = new BMap.LocalCity();
    var cityName;
    myCity.get(myFun); //異步獲得當前城市
    function myFun(result){
        cityName = result.name.replace('市', '');
    }

這個是獲得城市名字,是異步的,所以一定要確保城市名已獲得後再利用jsonp發送請求函數,不然會出錯。

2. 發送jsonp跨域請求

    //動態創建script標籤
    function jsonp(url){
        var script = document.createElement('script');
        script.src = url;
        document.body.append(script);
        document.body.removeChild(script);
    }
    //設置延時,因爲獲得當前城市所在地是異步的
    setTimeout(function(){
        var urls = []; 
        urls[0] = 'http://sapi.k780.com/?app=weather.future&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&jsoncallback=getWeather_week&weaid=' + encodeURI(cityName);
        urls[1] = 'http://api.map.baidu.com/telematics/v3/weather?output=json&ak=FK9mkfdQsloEngodbFl4FeY3&callback=getTodayWeather&location=' + encodeURI(cityName);
        jsonp(urls[0]);  //jsonp跨域請求
        jsonp(urls[1]);
    }, 1000);

這樣就獲得了當前自己所在城市的天氣,在src裏面傳遞了兩個函數,分別是getWeather_weekgetTodayWeather,去獲得今天的天氣和這周的天氣。

3.解析json數據,寫入DOM

{
    data:"週一 04月17日 (實時:23℃)"
    dayPictureUrl:"http://api.map.baidu.com/images/weather/day/qing.png"
    nightPictureUrl:"http://api.map.baidu.com/images/weather/night/qing.png"
    temperature:"28 ~ 11℃"
    weather:"晴"
    wind:"東風微風"
}

這是我從控制檯複製的一段json數據,只要根據裏面的鍵名獲得數據,並寫入DOM節點即可。

4. 爲查詢天氣按鈕添加事件,獲得任意城市的天氣

//添加事件,查詢天氣
    document.getElementById('search').addEventListener('click', function (){
        var cityname = document.getElementById('input-weather').value;
        if (cityname != ''){
            var urls = []; 
            urls[0] = 'http://sapi.k780.com/?app=weather.future&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&jsoncallback=getWeather&weaid=' + encodeURI(cityname);
            urls[1] = 'http://api.map.baidu.com/telematics/v3/weather?output=json&ak=FK9mkfdQsloEngodbFl4FeY3&callback=getTodayWeather&location=' + encodeURI(cityname);
            jsonp(urls[0]);
            jsonp(urls[1]);
        }
    }, true);

注意:以上jsonp請求的接口鏈接都是別人的,可能會失效,當然可以自己去申請,所以直接用的話,可能會出錯,望見諒!

大概的步驟就是這樣,感興趣的話可以自己實現一下的。源碼參考github:https://github.com/lwjcode/weatherForecast,覺得可以的話給個星吧!

發佈了92 篇原創文章 · 獲贊 43 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章