JS调用腾讯接口获取天气
想做个直接通过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调用腾讯接口获取天气的更多相关文章
- js调用百度地图接口
原文:js调用百度地图接口 这是前几天公司做的新项目,上面需要用到地图的数据.第一次做这类型的东西没啥思路,咱们经理说,这东西简单,截个图存文件夹里调整好尺寸,数据库里存上图片的地址动态调用就行了.心 ...
- Java通过webservice接口获取天气信息
通过SOAP请求的方式获取天气信息并解析返回的XML文件. 参考: http://www.webxml.com.cn/WebServices/WeatherWS.asmx import java.io ...
- iOS UIWebView 中 js调用OC 打开相册 获取图片, OC调用js 将图片加载到html上
线上html <!DOCTYPE html> <html> <head> <title>HTML中用JS调用OC方法</title> < ...
- #PHP#微信支付 第二篇 JSAPI 调用统一下单接口获取预支付交易数据
上一篇讲到成功获取 openid,本篇要调用微信统一接口创建预支付交易单,并获取到相关数据,以便(后边)在微信内调起H5支付 第三步,调用微信统一下单接口创建预支付交易单 微信统一下单API是微信支付 ...
- js调用百度地图接口绘制任意多边形并获取每个点的经纬度等
来自:https://blog.csdn.net/u013239236/article/details/52213977 侵删 <!DOCTYPE html> <html> & ...
- js调用高德地图API获取地理信息进行定位
<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=(需要自 ...
- 内网公告牌获取天气信息解决方案(C# WebForm)
需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...
- Java调用第三方http接口的方式
1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...
- cocos2d-js 3.0 RC0 手动绑定 C++调用js,js调用C++ jsbinding
参考:http://www.tairan.com/archives/4902 参考文章是2.x版本的,对于3.0也许不合适了,没有深究. 代码:https://github.com/kenkozhen ...
随机推荐
- BC-Clarke and five-pointed star(水)
Clarke and five-pointed star Accepts: 237 Submissions: 591 Time Limit: 2000/1000 MS (Java/Others) Me ...
- 利用Scanner键盘输入
Scanner不在java.lang.*包中,故必须import包java.util.Scanner.输入流(InputStream)为System.in 方法如下:Scanner s= new Sc ...
- mac下的几个命令-黑苹果之路
涉及一些文件操作的命令: 1.去掉/加上windows下文件的系统.只读.隐藏等属性,用chflags,nounchg/unchg,nohidden/hidden 2.去掉文件的@属性(这个属性经常导 ...
- JSP SQL注入--破法
1.JS验证拦截 <%@ page language="java" import="java.util.*" pageEncoding="UTF ...
- 007 The Inheritance In JAVA
在JAVA中有一个特型叫继承(Inheritance),通过继承我们可以重复使用代码,令代码简洁,易于扩展.例如:有一个sharp的类,这个类实现了sharp的一些方法,现在我们要写一个circle的 ...
- Android开发-API指南-<data>
<data> 英文原文:http://developer.android.com/guide/topics/manifest/data-element.html 采集(更新)日期:2014 ...
- Java垃圾收集器之--Garbage-First Collector
简介 Garbage-First(G1)垃圾收集器全面支持JDK7 Upate 4及后续版本.G1收集器是一个服务器形式(server-style)的垃圾收集器,主要用于内存大.多处理器的 ...
- Windows7下安装IIS出现“出现错误,并非所有的功能被成功更改
1.开始,搜索输入UAC-->选择 “更改用户账户控制设置” 2.调到最低 3.打开控制面板-->程序-->打开或关闭windows功能,去掉图里的2个选项,点确定,重启 4.重启后 ...
- 详解Ossim 4.3控制台
在Ossim 4.2以后的发行版中增加了控制台功能下面加以详细说明,当Ossim 启动之后,在控制台以root身份登录系统后会执行ossim-setup脚本,然后显示如下图1所示,了解这些功能,以及操 ...
- 【WCF 1】WCF框架宏观了解
导读:使用WCF框架爱开发项目也有很长一段时间了,最开始的时候,是理解的不深,所以不写博客进行总结.后来是项目赶,发现需要总结的有很多,一直没有把WCF排上日程,尤其是最近研究EF这一块,更是研究了一 ...