zoukankan      html  css  js  c++  java
  • 原生js实现查询天气的小应用

    4月16日已更新,由于聚合数据的天气api已开始收费,所以导致前一段时间页面报错,不能查询,现已更新,目前api使用的是nowapi百度地图开放平台。本文中代码也已更新,欢迎广大朋友提出宝贵意见,若能给个star就再好不过了(^_^)。

    预览地址:点此预览

    完整代码地址:zsqosos.github

    ----------------------------------------------------------------------------------------------------------------

    demo:https://zsqosos.github.io/weather/

    截图:

    实现功能:打开网页时显示用户所在城市的天气状况,在输入框输入城市可查询其它城市。

    实现过程:先调用百度地图的API来获取用户所在的城市,随后调用聚合数据的天气API将数据放在页面上。由于ajax不支持跨域,所以采用了jsonp的方式来调用数据。

    实现的原理比较简单,HTML和css比较长,我就只将js代码贴出来,想看完整代码的朋友可以去我的github查看 https://github.com/zsqosos/weather

    jsonp('https://api.map.baidu.com/api?v=2.0&ak=Dv1NMU23dh1sGS9n2tUouDEYY96Dfzh3&s=1&callback=getCity');
    window.onload=function(){
        //请求天气车数据
        btn.onclick=function (){
            jsonp(createUrl()[0]);
            jsonp(createUrl()[1]);
        }
    };
    
    function getCity(){
        function city(result){
            //去掉城市名后的"市"
            var city = result.name.substring(0,result.name.length-1);
            //请求当前城市的天气数据
            jsonp(createUrl(city)[0]);
            jsonp(createUrl(city)[1]);
        }
        var cityName = new BMap.LocalCity();
        cityName.get(city);
    }
    
    // 数据请求函数
    function jsonp(url){
        var script = document.createElement('script');
        script.src = url;
        document.body.insertBefore(script, document.body.firstChild);
        document.body.removeChild(script);
    }
    
    //数据请求成功回调函数,用于将获取到的数据放入页面相应位置
    function getWeather(response) {
        var oSpan = document.getElementsByClassName('info');
        var data = response.result;
        oSpan[0].innerHTML=data[0].citynm;
        oSpan[1].innerHTML=data[0].days;
        oSpan[2].innerHTML=data[0].week;
        oSpan[3].innerHTML=data[0].weather;
        oSpan[4].innerHTML=data[0].temperature;
        oSpan[5].innerHTML=data[0].winp;
        oSpan[6].innerHTML=data[0].wind;
    
        var aDiv = document.getElementsByClassName('future_box');
        for(var i=0; i<aDiv.length; i++){
            var aSpan = aDiv[i].getElementsByClassName('future_info');
            aSpan[0].innerHTML = data[i+1].days;
            aSpan[1].innerHTML = data[i+1].week;
            aSpan[2].innerHTML =data[i+1].weather;
            aSpan[3].innerHTML = data[i+1].temperature;
        }
    //根据返回数据,替换不同天气图片
        changeImg(response);
    }
    
    function getTodayWeather(response){
        var oSpan = document.getElementsByClassName('info');
        var data = response.results;
        oSpan[7].innerHTML=data[0].pm25;
        oSpan[8].innerHTML=data[0].index[4].zs;
        oSpan[9].innerHTML=data[0].index[1].zs;
        oSpan[10].innerHTML=data[0].index[2].zs;
        oSpan[11].innerHTML=data[0].index[0].zs;
    }
    
    //根据获取到的数据更改页面中相应的图片
    function changeImg(data){
        var firstImg = document.getElementsByTagName("img")[0];
        var firstWeatherId=data.result[0].weatid;
        chooseImg(firstWeatherId,firstImg);
    
        var aImg = document.getElementById('future_container').getElementsByTagName('img');
        for(var j=0; j<aImg.length; j++){
            var weatherId = data.result[j+1].weatid;
            chooseImg(weatherId,aImg[j]);
        }
    }
    
    //选择图片
    function chooseImg(id,index){
        switch(id){
            case '1':
                index.src='images/weather_icon/1.png';
                break;
            case '2':
                index.src='images/weather_icon/2.png';
                break;
            case '3':
                index.src='images/weather_icon/3.png';
                break;
            case '4':
            case '5':
            case '6':
            case '8':
            case '9':
            case '10':
            case '11':
            case '12':
            case '13':
            case '20':
            case '22':
            case '23':
            case '24':
            case '25':
            case '26':
                index.src='images/weather_icon/4.png';
                break;
            case '7':
                index.src='images/weather_icon/6.png';
                break;
            case '14':
            case '15':
            case '16':
            case '17':
            case '18':
            case '27':
            case '28':
            case '29':
                index.src='images/weather_icon/5.png';
                break;
            case '19':
            case '21':
            case '30':
            case '31':
            case '32':
            case '33':
                index.src='images/weather_icon/7.png';
                break;
            default:
                index.src='images/weather_icon/8.png';
        }
    }
    
    //根据城市名创建请求数据及url
    function createUrl(){
        var cityName = '';
        if(arguments.length == 0) {
            cityName = document.getElementById('text').value;
        }else{
            cityName = arguments[0];
        }
        // console.log(cityName);
        var urls = []; 
        urls[0] = 'https://sapi.k780.com/?app=weather.future&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&jsoncallback=getWeather&weaid=' + encodeURI(cityName);
        urls[1] = 'https://api.map.baidu.com/telematics/v3/weather?output=json&ak=FK9mkfdQsloEngodbFl4FeY3&callback=getTodayWeather&location=' + encodeURI(cityName);
        return urls;
    }

     一个简单的小demo,还有很多不足之处,欢迎大家提出改进建议。

  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/zsqos/p/6147191.html
Copyright © 2011-2022 走看看