想做个直接通过JS获取某个城市的天气。本来想通过直接调用中国气象网的接口:

http://www.weather.com.cn/weather/101070201.shtml,但是跨域问题一直无法解决,有谁知道请告诉我。因而改调用腾讯接口,部分源码如下:


  1 function Weather() {};
  2 
  3 Weather.prototype = {
  4     
  5     getWeather: function (city, callback) {
  6         var that = this,
  7             cities = Weather.cityParse(),
  8             code = cities[city] ? cities[city] : 125,                           // 默认使用北京城市
  9             url = 'http://mat1.qq.com/weather/inc/minisite2_' + code + '.js';   // 腾讯天气API jsonp接口
 10 
 11         this.createJsonp(url, function (para) {
 12             var desc = that.weatherParse(para);                                 // 通过jsonp获取天气相关信息
 13             callback(desc);
 14         });
 15     },
 16     // jsonp    
 17     createJsonp: function (url, callback) {
 18         var script = document.createElement('script');
 19         script.type = 'text/javascript';
 20         script.src = url;
 21 
 22         script.onreadystatechange = function () {
 23             if (script.readyState === 'loaded' || script.readyState === 'complete') {
 24                 callback(__minisite2__weather__);
 25 
 26                 script.onreadystatechange = null;
 27                 script.onload = null;
 28          }
 29     };
 30 
 31     script.onload = function () {
 32         callback(__minisite2__weather__);
 33         script.onreadystatechange = null;
 34         script.onload = null;
 35     };
 36 
 37     document.body.appendChild(script);
 38     },
 39 
 40     weatherParse: function (para) {
 41                   
 42         try {
 43         var params = para.split(' ');
 44         var weather = {
 45             city: params[0],
 46             temperature: params[1],
 47             range: params[2],
 48             describe: params[3]
 49         };
 50 
 51         return weather;
 52     } catch (e) {
 53         
 54     }
 55     }
 56 };
 57 // 将城市及其对应代码解析成hash形式
 58 Weather.cityParse = function () {
 59     var cities = {},
 60     prop,
 61     code,
 62     item;
 63         
 64     for (prop in this.city) {
 65         item = Weather.city[prop];
 66         for (var city in item) {
 67         if (city !== '_') {
 68             code = item[city];
 69             city = city.slice(0, -1);
 70             cities[city] = code;
 71         }
 72         }
 73     }
 74 
 75     return cities;
 76 };
 77 
 78 Weather.city =  {
 79         "北京市": {
 80             "_": 125,
 81             "北京市": 125
 82         },
 83         "上海市": {
 84             "_": 252,
 85             "上海市": 252
 86         },
 87         "天津市": {
 88             "_": 127,
 89             "天津市": 127,
 90             "塘沽区": 132
 91         },
 92         "重庆市" : {
 93             "_": 212,
 94             "奉节区": 201,
 95             "重庆市": 212,
 96             "涪陵区": 213
 97         },
 98         "香港": {
 99             "_": 1,
100             "香港": 1
101         },
102         "澳门": {
103             "_": 2,
104             "澳门": 2
105         },
106         "台湾省": {
107             "_": 280,
108             "台北市": 280
109         },
110         "云南省": {
111             "_": 179,
112             "昭通市": 173,
113             "丽江市": 174,
114             "曲靖市": 175,
115             "保山市": 176,
116             "大理州": 177,
117             "楚雄州": 178,
118             "昆明市": 179,
119             "瑞丽市": 180,
120             "玉溪市": 181,
121             "临沧市": 182,
122             "思茅市": 184,
123             "红河州": 185,
124             "文山州": 369,
125             "西双版纳州": 370,
126             "德宏州": 371,
127             "怒江州": 372,
128             "迪庆州": 373
129         },
130         "内蒙古": {
131             "_": 69,
132             "呼伦贝尔市": 4,
133             "兴安盟": 7,
134             "锡林郭勒盟": 16,
135             "巴彦淖尔市": 63,
136             "包头市": 64,
137             "呼和浩特市": 69,
138             "锡林浩特市": 99,
139             "通辽市": 101,
140             "赤峰市": 106,
141             "乌海市": 382,
142             "鄂尔多斯市": 383,
143             "乌兰察布市": 384
144         }
145 };
146 // 主要是些事件处理相关的方法包装
147var Util = {
148     addEvent: function (element, type, handler) {
149     if (element.addEventListener) {
150         element.addEventListener(type, handler, false);
151     } else if (element.attachEvent) {
152         element.attachEvent('on' + type, handler);
153     }
154     },
155 
156     getEvent: function (event) {
157     return event || window.event;
158     },
159 
160     getTarget: function (event) {
161     return event.target || event.srcElement;
162     },
163 
164     getComputedStyle: function (element) {
165     if (element.currentStyle) {
166         return element.currentStyle;
167     } else {
168         return document.defaultView.getComputedStyle(element, null);
169     }
170     },
171 
172     getBoundingClientRect: function (element) {
173     var scrollTop = document.documentElement.scrollTop;
174     var scrollLeft = document.documentElement.scrollLeft;
175         
176     if (element.getBoundingClientRect) {
177         if (typeof arguments.callee.offset != 'number') {
178             var temp = document.createElement('div');
179                              temp.style.cssText = 'position: absolute; left: 0; top: 0;';
180                 document.body.appendChild(temp);
181                 arguments.callee.offset = -temp.getBoundingClientRect().top - scrollTop;
182                 document.body.removeChild(temp);
183                 temp = null;
184             }
185             
186             var rect = element.getBoundingClientRect();
187             var offset = arguments.callee.offset;
188             
189             return {
190                 left: rect.left + offset,
191                 rigth: rect.right + offset,
192                 top: rect.top + offset,
193                 bottom: rect.bottom + offset
194             };
195         } else {
196             var offset = this.getElementOffset(element);
197             
198             return {
199                 left: offset.left - scrollLeft,
200                 right: offset.left + element.offsetWidth - scrollLeft,
201                 top: offset.top - scrollTop,
202                 bottom: offset.top + element.offsetWidth - scrollTop
203             };
204         }
205     },
206     
207     getElementOffset: function (element) {
208         var actualLeft = element.offsetLeft;
209         var actualTop = element.offsetTop;
210         var current = element.offsetParent;
211         
212         while (current !== null) {
213             actualLeft += current.offsetLeft;
214             actualTop += current.actualTop;
215             current = current.offsetParent;
216         }
217         
218         return {
219             left: actualLeft,
220             top: actualTop
221         };
222     }
223 };

HTML页面的代码如下:


  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <title>weather</title>
  5         <meta http-equiv="Content-Type" content="text/html; charset=gbk;" />
  6         <style type="text/css" >
  7             #city {
  8                 width: 150px;
  9                 heigth: 30px;
 10             }
 11             #inputCity {
 12                 position: absolute;
 13                 width: 130px;
 14                 heigth: 25px;
 15             }
 16         </style>
 17     </head>
 18     <body>
 19         <h1>Weather</h1>
 20         <fieldset>
 21             <legend> 获取时间 </legend>
 22             <label for="city">请选择城市:</label>
 23             <select name="city" id="city">
 24                 <!--<option selected="selected"></option>-->
 25                 <option>北京</option>
 26                 <option>大连</option>
 27                 <option>福州</option>
 28             </select>
 29             <input type="text" id="inputCity" value = '请输入或选择城市' />
 30             <input type="button" id="getWeather" value="获取天气" />
 31         </fieldset>
 32         <div id="showWeather">
 33         
 34         </div>
 35         <script type="text/javascript" src="weather.js"></script>
 36         <script>
 37         (function(){
112             
113             var city = document.getElementById('city');
114             var getWeather = document.getElementById('getWeather');
115             var inputCity = document.getElementById('inputCity');
116             var tip = inputCity.value;
117             var cities = Weather.cityParse();
118             
119             
120             var pos = Util.getBoundingClientRect(city);
121             var volumn = Util.getComputedStyle(city);
122             console.log(pos);
123             
124             // 设置输入文本框的位置
125             inputCity.style.left = pos.left + 'px';
126             inputCity.style.top = pos.top + 'px';
127             
128             Util.addEvent(city, 'change', function (event) {
129                 var value = city.options[city.selectedIndex].value;
130                 inputCity.value = value;
131             });
132             
133             Util.addEvent(inputCity, 'focus', function (event) {
134                 Util.getTarget(event).select();
135             });
136             
137             Util.addEvent(inputCity, 'change', function () {
138                 
139                 var city = inputCity.value;
140                 if ( city.slice(-1) === '市') {
141                     city = city.slice(0, -1);
142                 }
143                 if ( city && !cities[city] ) {
144                     alert('目前无法获取' + city + '的天气,请输入其它城市');
145                 } else if ( !city ) {
146                     inputCity.value = tip;
147                 }
148                 
149             });
150             
151             Util.addEvent(getWeather, 'click', function (event) {
152                 var city = inputCity.value;
153                 if ( city && !cities[city] ) {
154                     alert('目前无法获取' + city + '的天气,请输入其它城市');
155                     return false;
156                 }
157                 // 天气获取
158                 (new Weather()).getWeather(city, function(param){
159                  
160                     var showWeather = document.getElementById('showWeather');
161                     showWeather.innerHTML = '城市:' + param.city + 
162                         '<br /> 温度:' + param.temperature +
163                         '<br />  温度范围:' + param.range +
164                         '<br />  描述:' + param.describe;                       
165                 });
166             }); 
168             
169         })();    
170         </script>
171     </body>
172 </html>

JS调用腾讯接口获取天气的更多相关文章

  1. js调用百度地图接口

    原文:js调用百度地图接口 这是前几天公司做的新项目,上面需要用到地图的数据.第一次做这类型的东西没啥思路,咱们经理说,这东西简单,截个图存文件夹里调整好尺寸,数据库里存上图片的地址动态调用就行了.心 ...

  2. Java通过webservice接口获取天气信息

    通过SOAP请求的方式获取天气信息并解析返回的XML文件. 参考: http://www.webxml.com.cn/WebServices/WeatherWS.asmx import java.io ...

  3. iOS UIWebView 中 js调用OC 打开相册 获取图片, OC调用js 将图片加载到html上

    线上html <!DOCTYPE html> <html> <head> <title>HTML中用JS调用OC方法</title> < ...

  4. #PHP#微信支付 第二篇 JSAPI 调用统一下单接口获取预支付交易数据

    上一篇讲到成功获取 openid,本篇要调用微信统一接口创建预支付交易单,并获取到相关数据,以便(后边)在微信内调起H5支付 第三步,调用微信统一下单接口创建预支付交易单 微信统一下单API是微信支付 ...

  5. js调用百度地图接口绘制任意多边形并获取每个点的经纬度等

    来自:https://blog.csdn.net/u013239236/article/details/52213977 侵删 <!DOCTYPE html> <html> & ...

  6. js调用高德地图API获取地理信息进行定位

    <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=(需要自 ...

  7. 内网公告牌获取天气信息解决方案(C# WebForm)

    需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...

  8. Java调用第三方http接口的方式

    1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...

  9. cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsbinding

    参考:http://www.tairan.com/archives/4902 参考文章是2.x版本的,对于3.0也许不合适了,没有深究. 代码:https://github.com/kenkozhen ...

随机推荐

  1. Spring配置项<context:annotation-config/>说明

    配置applicationContext.xml时经常会看到: <context:annotation-config/> 它的作用是隐式地向Spring容器注册AutowiredAnnot ...

  2. HDU 4405 【概率dp】

    题意: 飞行棋,从0出发要求到n或者大于n的步数的期望.每一步可以投一下筛子,前进相应的步数,筛子是常见的6面筛子. 但是有些地方可以从a飞到大于a的b,并且保证每个a只能对应一个b,而且可以连续飞, ...

  3. Linux安装MySQL的两种方法

    转载:http://blog.csdn.net/superchanon/article/details/8546254/ 1.       运行平台:CentOS 6.3 x86_64,基本等同于RH ...

  4. struts2+hibernate+poi导出Excel实例

    本实例通过struts2+hibernate+poi实现导出数据导入到Excel的功能 用到的jar包: poi 下载地址:http://poi.apache.org/ 根据查询条件的选择显示相应数据 ...

  5. HTTP与HttpServlet

    (1).HTTP协议 Web浏览器和服务器通过HTTP协议在Internet上发送和接收消息.HTTP是一种基于请求/响应模式的协议.客户端发送一个请求,服务器端返回对该请求响应. . (2).HTT ...

  6. jsp页面List迭代

    1.行迭代 <tbody>   <c:choose>    <c:when test="${not empty result}">     &l ...

  7. (转)直接拿来用!最火的iOS开源项目(二)

    “每一次的改变总意味着新的开始.”这句话用在iOS上可谓是再合适不过的了.GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7, ...

  8. MFC创建非模态对话框并修改CStatic文字

    //由IDD_STATUS_DIALOG创建一个对话框CDialog* pCheckNetStatusDlg = new CDialog(); pCheckNetStatusDlg->Creat ...

  9. HDU1213

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1213 #include<stdio.h> #include<algorithm&g ...

  10. 百度地图API 学习网站

    官方示例:http://developer.baidu.com/map/jsdemo.htm#a1_2 (注意:此网页可能由于浏览器问题,源代码编辑器中的代码不能看到.火狐亲测有效) http://d ...