Archive for the ‘JavaScript’ Category.

腾讯天气接口

地址:http://mat1.qq.com/weather/inc/minisite2_{$CITY_CODE}.js

资源在这段JS里面,自己整理:

/* http://www.qq.com/js/j.soso.weatherV2.0.2.js */

MiniSite.Weather = {
	defaultCity: 125,
	city: {
		"北京市": {
			"_": 125,
			"北京市": 125
		},
		"上海市": {
			"_": 252,
			"上海市": 252
		},
		"天津市": {
			"_": 127,
			"天津市": 127,
			"塘沽区": 132
		},
		"重庆市" : {
			"_": 212,
			"奉节区": 201,
			"重庆市": 212,
			"涪陵区": 213
		},
		"香港": {
			"_": 1,
			"香港": 1
		},
		"澳门": {
			"_": 2,
			"澳门": 2
		},
		"台湾省": {
			"_": 280,
			"台北": 280
		},
		"安徽省": {
			"_": 248,
			"合肥市": 248,
			"安庆市": 253,
			"蚌埠市": 243,
			"亳州市": 238,
			"巢湖市": 100,
			"池州市": 102,
			"滁州市": 95,
			"阜阳市": 241,
			"淮北市": 77,
			"淮南市": 75,
			"黄山市": 254,
			"六安市": 242,
			"马鞍山市": 76,
			"宿州市": 239,
			"铜陵市": 92,
			"芜湖市": 249,
			"宣城市": 105
		},
		"福建省": {
			"_": 276,
			"福州市": 276,
			"龙岩市": 277,
			"南平市": 274,
			"宁德市": 275,
			"莆田市": 107,
			"泉州市": 279,
			"三明市": 278,
			"厦门市": 287,
			"漳州市": 286,
			"浦城市": 271
		},
		"甘肃省": {
			"_": 57,
			"兰州市": 57,
			"白银市": 58,
			"定西市": 60,
			"甘南州": 225,
			"嘉峪关市": 378,
			"金昌市": 50,
			"酒泉市": 379,
			"临夏市": 229,
			"陇南市": 380,
			"平凉市": 90,
			"庆阳市": 91,
			"天水市": 377,
			"武威市": 51,
			"张掖市": 49
		},
		"广东省": {
			"_": 292,
			"广州市": 292,
			"潮州市": 336,
			"东莞市": 334,
			"佛山市": 331,
			"河源市": 293,
			"江门市": 332,
			"揭阳市": 337,
			"茂名市": 302,
			"梅州市": 285,
			"清远市": 284,
			"汕头市": 294,
			"汕尾市": 297,
			"韶关市": 283,
			"深圳市": 296,
			"阳江市": 301,
			"云浮市": 338,
			"湛江市": 300,
			"肇庆市": 291,
			"中山市": 335,
			"珠海市": 330,
			"南雄市": 235,
			"佛冈市": 322,
			"梅县市": 323,
			"电白市": 324,
			"高要市": 325
		},
		"广西": {
			"_": 295,
			"南宁市": 295,
			"百色市": 288,
			"北海市": 299,
			"崇左市": 343,
			"防城港市": 339,
			"贵港市": 289,
			"桂林市": 232,
			"河池市": 281,
			"贺州市": 341,
			"来宾市": 342,
			"柳州市": 282,
			"钦州市": 298,
			"梧州市": 290,
			"玉林市": 340
		},
		"贵州省": {
			"_": 227,
			"贵阳市": 227,
			"安顺市": 226,
			"毕节地区": 219,
			"六盘水市": 368,
			"黔西南州": 230,
			"铜仁地区": 221,
			"遵义市": 220
		},
		"海南省": {
			"_": 303,
			"海口市": 303,
			"白沙黎族自治县": 354,
			"保亭黎族苗族自治县": 357,
			"澄迈市": 351,
			"儋州市": 347,
			"定安县": 352,
			"东方市": 350,
			"临高市": 353,
			"琼海市": 346,
			"三亚市": 344,
			"屯昌县": 345,
			"万宁市": 349,
			"文昌市": 348,
			"乐东黎族自治县": 355,
			"陵水黎族自治县": 356,
			"琼中黎族苗族自治县": 358
		},
		"河北省": {
			"_": 82,
			"石家庄市": 82,
			"保定市": 130,
			"沧州市": 131,
			"承德市": 121,
			"邯郸市": 3,
			"衡水市": 8,
			"廊坊市": 126,
			"秦皇岛市": 122,
			"唐山市": 128,
			"邢台市": 86,
			"张家口市": 120
		},
		"河南省": {
			"_": 189,
			"郑州市": 189,
			"安阳市": 89,
			"鹤壁市": 260,
			"济源市": 309,
			"焦作市": 251,
			"开封市": 207,
			"洛阳市": 228,
			"漯河市": 307,
			"南阳市": 192,
			"平顶山市": 231,
			"濮阳市": 305,
			"三门峡市": 188,
			"商丘市": 308,
			"新乡市": 304,
			"信阳市": 198,
			"许昌市": 306,
			"周口市": 193,
			"驻马店市": 197
		},
		"黑龙江省": {
			"_": 17,
			"哈尔滨市": 17,
			"大庆市": 40,
			"大兴安岭地区": 5,
			"鹤岗市": 12,
			"黑河市": 6,
			"鸡西市": 18,
			"佳木斯市": 13,
			"牡丹江市": 97,
			"七台河市": 42,
			"齐齐哈尔市": 10,
			"双鸭山市": 15,
			"绥化市": 11,
			"伊春市": 14,
			"漠河市": 38,
			"绥芬河市": 98
		},
		"湖北省":{
			"_": 211,
			"武汉市": 211,
			"鄂州市": 314,
			"恩施州": 208,
			"黄冈市": 203,
			"黄石市": 310,
			"荆门市": 202,
			"潜江市": 320,
			"神农架林区": 321,
			"随州市": 317,
			"天门市": 319,
			"仙桃市": 318,
			"咸宁市": 316,
			"襄樊市": 196,
			"孝感市": 315
		},
		"湖南省": {
			"_": 218,
			"长沙市": 218,
			"常德市": 387,
			"郴州市": 233,
			"衡阳市": 328,
			"怀化市": 217,
			"娄底市": 329,
			"邵阳市": 222,
			"湘潭市": 327,
			"益阳市": 223,
			"岳阳市": 215,
			"张家界市": 214,
			"株洲市": 326,
			"桑植市": 311,
			"沅陵市": 312,
			"南岳市": 313
		},
		"吉林省": {
			"_": 103,
			"长春市": 103,
			"白城市": 37,
			"白山市": 119,
			"吉林市": 104,
			"辽源市": 34,
			"四平市": 385,
			"松原市": 96,
			"通化市": 36,
			"延边州": 110,
			"桦甸市": 109,
			"集安市": 118
		},
		"江苏省": {
			"_": 244,
			"南京市": 244,
			"常州市": 250,
			"淮安市": 240,
			"连云港市": 237,
			"南通市": 247,
			"苏州市": 44,
			"宿迁市": 62,
			"泰州市": 61,
			"无锡市": 43,
			"徐州市": 236,
			"盐城市": 246,
			"扬州市": 245,
			"镇江市": 59,
			"盱眙市": 45,
			"赣榆市": 46,
			"东台市": 47,
			"高邮市": 53
		},
		"江西省": {
			"_": 264,
			"南昌市": 264,
			"抚州市": 273,
			"赣州市": 234,
			"景德镇市": 259,
			"九江市": 258,
			"萍乡市": 153,
			"上饶市": 267,
			"新余市": 154,
			"宜春市": 224,
			"鹰潭市": 265,
			"庐山市": 111,
			"玉山市": 137,
			"贵溪市": 138,
			"广昌市": 145
		},
		"辽宁省": {
			"_": 115,
			"沈阳市": 115,
			"鞍山市": 114,
			"本溪市": 116,
			"朝阳市": 112,
			"大连市": 133,
			"丹东市": 124,
			"抚顺市": 117,
			"阜新市": 108,
			"葫芦岛市": 25,
			"锦州市": 113,
			"辽阳市": 29,
			"盘锦市": 26,
			"铁岭市": 30,
			"营口市": 123,
			"瓦房店市": 129
		},
		"内蒙古": {
			"_": 69,
			"呼和浩特市": 69,
			"巴彦淖尔市": 63,
			"包头市": 64,
			"赤峰市": 106,
			"鄂尔多斯市": 383,
			"呼伦贝尔市": 4,
			"通辽市": 101,
			"乌海市": 382,
			"乌兰察布市": 384,
			"锡林郭勒盟": 16,
			"兴安盟": 7,
			"锡林浩特市": 99
		},
		"宁夏": {
			"_": 78,
			"银川市": 78,
			"固原市": 209,
			"石嘴山市": 54,
			"吴忠市": 83
		},
		"青海": {
			"_": 56,
			"西宁市": 56,
			"果洛州": 158,
			"海北州": 48,
			"海东地区": 210,
			"海南州": 55,
			"海西州": 195,
			"黄南州": 157,
			"玉树州": 155
		},
		"山东省": {
			"_": 140,
			"济南市": 140,
			"滨州市": 135,
			"德州市": 134,
			"东营市": 160,
			"菏泽市": 206,
			"济宁市": 146,
			"莱芜市": 165,
			"聊城市": 139,
			"临沂市": 183,
			"青岛市": 144,
			"日照市": 147,
			"泰安市": 141,
			"威海市": 164,
			"潍坊市": 143,
			"烟台市": 136,
			"枣庄市": 159,
			"淄博市": 142,
			"泰山市": 156
		},
		"山西省": {
			"_": 84,
			"太原市": 84,
			"长治市": 9,
			"大同市": 72,
			"晋城市": 94,
			"晋中市": 22,
			"临汾市": 88,
			"吕梁市": 80,
			"朔州市": 70,
			"忻州市": 81,
			"阳泉市": 85,
			"运城市": 93,
			"五台山市": 381
		},
		"陕西省": {
			"_": 186,
			"西安市": 186,
			"安康市": 194,
			"宝鸡市": 375,
			"汉中市": 190,
			"商洛市": 191,
			"铜川市": 374,
			"渭南市": 187,
			"咸阳市": 376,
			"延安市": 87,
			"榆林市": 79
		},
		"四川省": {
			"_": 166,
			"成都市": 166,
			"阿坝州": 163,
			"巴中市": 199,
			"达州市": 200,
			"德阳市": 361,
			"甘孜州": 162,
			"广安市": 364,
			"广元市": 362,
			"乐山市": 171,
			"凉山州": 367,
			"泸州市": 216,
			"眉山市": 365,
			"绵阳市": 167,
			"内江市": 363,
			"南充市": 205,
			"攀枝花市": 360,
			"遂宁市": 204,
			"雅安市": 168,
			"宜宾市": 172,
			"资阳市": 366,
			"自贡市": 359,
			"峨眉山市": 170
		},
		"西藏": {
			"_": 150,
			"拉萨市": 150,
			"阿里地区": 152,
			"昌都地区": 161,
			"林芝地区": 169,
			"那曲地区": 148,
			"日喀则地区": 149,
			"山南地区": 151
		},
		"新疆": {
			"_": 28,
			"乌鲁木齐市": 28,
			"阿克苏地区": 32,
			"阿拉尔市": 23,
			"博尔塔拉州": 27,
			"昌吉州": 19,
			"哈密地区": 41,
			"和田地区": 39,
			"喀什地区": 35,
			"克拉玛依市": 24,
			"克孜勒苏柯州": 20,
			"石河子市": 33,
			"吐鲁番地区": 31,
			"伊犁州": 21,
			"奇台市": 52
		},
		"云南省": {
			"_": 179,
			"昆明市": 179,
			"保山市": 176,
			"楚雄州": 178,
			"大理州": 177,
			"德宏州": 371,
			"迪庆州": 373,
			"红河州": 185,
			"丽江市": 174,
			"临沧市": 182,
			"怒江州": 372,
			"曲靖市": 175,
			"思茅市": 184,
			"文山州": 369,
			"西双版纳州": 370,
			"玉溪市": 181,
			"昭通市": 173,
			"瑞丽市": 180
		},
		"浙江省": {
			"_": 255,
			"杭州市": 255,
			"湖州市": 65,
			"嘉兴市": 256,
			"金华市": 261,
			"丽水市": 268,
			"宁波市": 263,
			"衢州市": 266,
			"绍兴市": 262,
			"台州市": 269,
			"温州市": 272,
			"舟山市": 74,
			"嵊州市": 66,
			"平湖市": 67,
			"石浦市": 68,
			"宁海市": 71,
			"洞头市": 73,
			"定海市": 257
		}
	},
timelapse:null,defaultUrl:"http://mat1.qq.com/www/images/200801/wealth/",WealtherImg:{"晴":{"day":"sun.png","night":"night.png","nm":"4.png","em":"3.png","xm":"2.png","mm":"1.png"},"晴,阳光充足":{"day":"sun.png","night":"night.png","nm":"4.png","em":"3.png","xm":"2.png","mm":"1.png"},"晴朗":{"day":"sun.png","night":"night.png","nm":"4.png","em":"3.png","xm":"2.png","mm":"1.png"},"炎热":{"day":"sun.png","night":"night.png","nm":"4.png","em":"3.png","xm":"2.png","mm":"1.png"},"多云":{"day":"cloud.png","night":"night.png","nm":"4.png","em":"3.png","xm":"2.png","mm":"1.png"},"大部多云":{"day":"cloud.png","night":"night.png","nm":"4.png","em":"3.png","xm":"2.png","mm":"1.png"},"局部多云":{"day":"cloud.png","night":"night.png","nm":"4.png","em":"3.png","xm":"2.png","mm":"1.png"},"时有多云":{"day":"cloud.png","night":"night.png","nm":"4.png","em":"3.png","xm":"2.png","mm":"1.png"},"阴":{"day":"shade.png","night":"night.png"},"冷":{"day":"shade.png","night":"night.png"},"阵雨":{"day":"brain.png"},"雷阵雨":{"day":"lrain.png"},"雷雨":{"day":"lrain.png"},"局部雷雨":{"day":"lrain.png"},"零星雷雨":{"day":"lrain.png"},"局部阵雨":{"day":"lrain.png"},"雷阵雨并伴有冰雹":{"day":"lrain.png"},"冰雹雨":{"day":"lrain.png"},"雨夹雪":{"day":"rs.png"},"雨加雪":{"day":"rs.png"},"雨、雨夹雪":{"day":"rs.png"},"雪、雨夹雪":{"day":"rs.png"},"小雨":{"day":"srain.png"},"冰毛雨":{"day":"srain.png"},"毛毛雨":{"day":"srain.png"},"中雨":{"day":"mrain.png"},"大雨":{"day":"brain.png"},"暴雨":{"day":"drain.png"},"暴风雨":{"day":"drain.png"},"大暴雨":{"day":"drain.png"},"特大暴雨":{"day":"drain.png"},"阵雪":{"day":"bsnow.png"},"小阵雪":{"day":"bsnow.png"},"零星阵雪":{"day":"bsnow.png"},"小雪":{"day":"ssnow.png"},"中雪":{"day":"msnow.png"},"吹雪":{"day":"msnow.png"},"雪":{"day":"msnow.png"},"大雪":{"day":"bsnow.png"},"暴雪":{"day":"bsnow.png"},"暴风雪":{"day":"bsnow.png"},"局部暴雪":{"day":"bsnow.png"},"雾":{"day":"fog.png"},"薄雾":{"day":"fog.png"},"烟雾":{"day":"fog.png"},"冻雨":{"day":"rs.png"},"冰雨":{"day":"rs.png"},"沙尘暴":{"day":"sand.png"},"小到中雨":{"day":"srain.png"},"中到大雨":{"day":"mrain.png"},"大到暴雨":{"day":"brain.png"},"暴雨-大暴雨":{"day":"drain.png"},"大暴雨-特大暴雨":{"day":"drain.png"},"热带风暴":{"day":"drain.png"},"飓风":{"day":"drain.png"},"小到中雪":{"day":"ssnow.png"},"大到暴雪":{"day":"bsnow.png"},"冰雹":{"day":"bsnow.png"},"浮尘":{"day":"sand.png"},"灰尘":{"day":"sand.png"},"扬沙":{"day":"sand.png"},"风":{"day":"sand.png"},"大风":{"day":"sand.png"},"龙卷风":{"day":"sand.png"},"强沙尘暴":{"day":"sand.png"}},lunarInfo:new Array(0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0),lYearDays:function(y)
{var i,sum=348
for(i=0x8000;i>0x8;i>>=1)sum+=(MiniSite.Weather.lunarInfo[y-1900]&i)?1:0
return(sum+MiniSite.Weather.leapDays(y))},leapDays:function(y)
{if(MiniSite.Weather.leapMonth(y))return((MiniSite.Weather.lunarInfo[y-1900]&0x10000)?30:29)
else return(0)},leapMonth:function(y)
{return(MiniSite.Weather.lunarInfo[y-1900]&0xf)},monthDays:function(y,m)
{return((MiniSite.Weather.lunarInfo[y-1900]&(0x10000>>m))?30:29)},Lunar:function(objDate)
{var i,leap=0,temp=0
var baseDate=new Date(1900,0,31)
var offset=(objDate-baseDate)/86400000
this.dayCyl=offset+40
this.monCyl=14;for(i=1900;i<2050&&offset>0;i++)
{temp=MiniSite.Weather.lYearDays(i)
offset-=temp
this.monCyl+=12}
if(offset<0)
{offset+=temp;i--;this.monCyl-=12}
this.year=i
this.yearCyl=i-1864
leap=MiniSite.Weather.leapMonth(i)
this.isLeap=false
for(i=1;i<13&&offset>0;i++)
{if(leap>0&&i==(leap+1)&&this.isLeap==false)
//{--i;this.isLeap=true;temp=leapDays(this.year);}
{--i;this.isLeap=true;temp=MiniSite.Weather.leapDays(this.year);}
else
{temp=MiniSite.Weather.monthDays(this.year,i);}
if(this.isLeap==true&&i==(leap+1)){this.isLeap=false}
offset-=temp
if(this.isLeap==false)this.monCyl++}
if(offset==0&&leap>0&&i==leap+1)
{if(this.isLeap)
{this.isLeap=false;}
else
{this.isLeap=true;--i;--this.monCyl;}}
if(offset<0){offset+=temp;--i;--this.monCyl;}
this.month=i
this.day=offset+1
if(Math.floor(this.day)==MiniSite.Weather.monthDays(this.year,this.month))
{this.day=0;}
return Math.floor(this.day);},getMoon:function(d)
{if(d==0)
{return"night";}
else if(d>0&&d<3)
{return"nm";}
else if((d>2&&d<=6)||23<d)
{return"em";}
else if((d>6&&d<15)||(d>16&&d<24))
{return"xm";}
else if(d==15||d==16)
{return"mm";}},getWealth:function(wealth)
{var ret,T;if(wealth.indexOf("转")>=0)
{var tmp=wealth.split("转");ret=tmp[1];}
else
{ret=wealth;}
var date=new Date();var LunarDay=MiniSite.Weather.Lunar(date);var t=date.getHours();var m=date.getMinutes();if(ret=="晴"||ret=="多云"||ret=="炎热"||ret=="晴,阳光充足"||ret=="晴朗"||ret=="时有多云"||ret=="大部多云"||ret=="局部多云")
{if(t<19)
{if(t>5)
{T="day";}
else
{T=MiniSite.Weather.getMoon(LunarDay);}}
else
{T=MiniSite.Weather.getMoon(LunarDay);}}
else
{T="day";}
if(typeof this.WealtherImg[ret]!=="undefined")
{
	if (typeof MiniSite.Weather.WealtherImg[ret][T] != "undefined")
	{
		return MiniSite.Weather.WealtherImg[ret][T];
	}
	else
	{
		return false;
	}
}
else
{return false;}
return MiniSite.Weather.WealtherImg[ret][T];},_print:function(province,city,conainter)
{if(typeof this.city[province]!="undefined")
{if(typeof this.city[province][city]!="undefined")
{var _city_=this.city[province][city];}
else if(typeof this.city[province]["_"]!="undefined")
{var _city_=this.city[province]["_"];}
else
{var _city_=this.defaultCity;}}
else
{var _city_=this.defaultCity;}
MiniSite.JsLoader.load("http://mat1.qq.com/weather/inc/minisite2_"+_city_+".js?"+Math.round((new Date()).getTime()),function()
{try
{var tmp=__minisite2__weather__.split(" ");var tmp1=tmp[2]+" "+tmp[1];MiniSite.$(conainter).onclick=function()
{window.open("http://www.soso.com/q?cid=w.q.wea&ie=utf-8&w="+encodeURIComponent(tmp[0]+'天气'));call_0410("UNKNOWN","weather",1);}
MiniSite.$(conainter).alt="点击查看"+tmp[0]+"天气详情";MiniSite.$(conainter).title="点击查看"+tmp[0]+"天气详情";if(MiniSite.Weather.getWealth(tmp[3])==false)
{MiniSite.$(conainter).innerHTML="<p><h6><span style='font-size:11px'> "+tmp[1]+"</span></h6><div><a href='http://www.soso.com/q?cid=w.q.wea&ie=utf-8&w="
+encodeURIComponent(tmp[0]+'天气')+"' target='_blank'>"
+tmp[0]+"</a></div></p>";MiniSite.$(conainter).getElementsByTagName("div")[0].style.width="170px";}
else
{if(tmp[0].length>7)
{MiniSite.$(conainter).innerHTML="<span class='img'><img src='"+MiniSite.Weather.defaultUrl+MiniSite.Weather.getWealth(tmp[3])+"'  onload='loadPng(this)' alt='点击查看"+tmp[0]+"天气详情' title='点击查看"+tmp[0]+"天气详情' /></span>"
+"<p><h6>"+tmp[1]+"</h6><div>"
+tmp[0]+"</div></p>";MiniSite.$(conainter).getElementsByTagName("h6")[0].style.paddingTop="8px";MiniSite.$(conainter).getElementsByTagName("a")[1].style.lineHeight="14px";}
else
{MiniSite.$(conainter).innerHTML="<span class='img'><img src='"+MiniSite.Weather.defaultUrl+MiniSite.Weather.getWealth(tmp[3])+"'  onload='loadPng(this)' alt='点击查看"+tmp[0]+"天气详情' title='点击查看"+tmp[0]+"天气详情' /></span>"
+"<p><h6>"+tmp[1]+"</h6><div>"
+tmp[0]+"</div></p>";}}}
catch(e)
{}});},print:function(conainter)
{var ok=function()
{var province=null;var city=null;var ipAddress=MiniSite.Cookie.get("qq_index_ip_1hrcache");if(ipAddress!=null)
{try
{var ipAddressArr=ipAddress.split(",");province=ipAddressArr[0];city=ipAddressArr[1];}
catch(e)
{}}
MiniSite.Weather._print(province,city,conainter);};if(!MiniSite.Cookie.get("qq_index_ip_1hrcache"))
{MiniSite.Weather.timelapse=setTimeout(ok,20000);MiniSite.JsLoader.load("http://fw.qq.com:80/ipaddress",function()
{if(MiniSite.Weather.timelapse!=null)
{clearTimeout(MiniSite.Weather.timelapse);};if(typeof IPData!="undefined")
{MiniSite.Cookie.set('qq_index_ip_1hrcache',IPData[2]+','+IPData[3]);ok();};});}
else
{ok();}}};/*  |xGv00|9e88a0d52b06a0d2668de7195a578a25 */

收一个 Javascript 图片放大镜效果插件

http://www.mind-projects.it/projects/jqzoom/

使用 yslow 分析网站

下面是使用 Yahoo! yslow 工具分析本博客首页的结果:

yslow staticstics weight graphs

yslow staticstics weight graphs

如何保证 cookie 只能被 PHP 读取,而客户端 Javascript 脚本读取不了?

刚才群里一个朋友去百度面试了,被问到,”如何保证cookie可以被 PHP 读取而不能被 Javascript 读取呢?”

其实这个问题,我阅读手册的时候有点印象,就去手册查了一下:

PHP setcookie 函数的最后一个参数 $httponly 为 true 时,cookie 只能被通过 http 协议读取,而不能被客户端脚本(包括 JS)读取。该选项有助于减少 XSS 跨站脚本攻击。

该选项从 PHP 5.2.0 开始被支持,并且不是所有的浏览器都支持这个特性。

既然不是所有的浏览器都支持这个特性,那么仅依靠这个特行来提升安全性就不那么靠谱了。其实,可以考虑将 cookie 加密,那么 Server 发送给 Client 的 cookie 就无法被客户端 JS 解密(因为 JS 不知道解密算法)。这就提升了安全性能。

说到 setcookie 函数,其实 $secure 这个参数项平时我们使用的也比较少,应该引起注意。这个参数表明是否仅仅允许通过 https 安全连接来传输这个 cookie 项。

IE6 & IE7 动态创建 iframe 读取不到 contentWindow.name 属性解决方案

公司项目中,动态创建了一个iframe, 然后 append 到当前页面中:

var ajaxframeid = 'ajaxframe' + formid;
var ajaxframe   = $(ajaxframeid);

if(ajaxframe == null) {
    try {
        ajaxframe      = document.createElement("iframe");
	ajaxframe.name = ajaxframeid;
	ajaxframe.id   = ajaxframeid;
    } catch(e) {
	ajaxframe = document.createElement("<iframe name='" + ajaxframeid + "' id='" + ajaxframeid + "'></iframe>");
    }
    ajaxframe.style.display = 'none';
    $('append').appendChild(ajaxframe);
}

然后,我们想让一个form表单提交到此iframe中:

form.target = ajaxframe.name;

此代码在firefox、chrome以及IE8+上没有问题,而在IE6-7中却出现一个问题:会将form表单提交到一个新窗口!
后来经过同事调试了很久,终于发现了问题的所在:IE6-7下面,读取不到 ajaxframe.contentWindow.name 属性!

因此,需要先显式的写入,然后才能使用。所以代码变为:

var ajaxframeid = 'ajaxframe' + formid;
var ajaxframe   = $(ajaxframeid);

if(ajaxframe == null) {
    try {
        ajaxframe      = document.createElement("iframe");
	ajaxframe.name = ajaxframeid;
	ajaxframe.id   = ajaxframeid;
    } catch(e) {
	ajaxframe = document.createElement("<iframe name='" + ajaxframeid + "' id='" + ajaxframeid + "'></iframe>");
    }
    ajaxframe.style.display = 'none';
    $('append').appendChild(ajaxframe);
    ajaxframe.contentWindow.name = ajaxframe.name; // 此语句必须要在 appendChild 语句之后
}

完整测试代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>

<body>
<iframe id="iwin" src="about:blank" name="newWin"></iframe>
<script type="text/javascript">
alert(document.getElementById('iwin').name); // newWin
alert(document.getElementById('iwin').contentWindow.name); // newWin

var x = document.createElement('iframe');
x.setAttribute('id', 'iwin2');
x.setAttribute('name', 'newWin2');
document.body.appendChild(x);

alert(document.getElementById('iwin2').name); // newWin2
//document.getElementById('iwin2').contentWindow.name = 'newWin2';
alert(document.getElementById('iwin2').contentWindow.name); // 如果没有上面一句,则输出空字符串;有上面一句,则输出 "newWin2"
</script>
</body>
</html>

这个问题真是很隐蔽 :) 害我找了一天~ 悲催的IE6~ 记录一下,以备后来参考。

Javascript 获取 input[type=file] 表单控件的本地文件路径

没啥好说的,直接上代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Javascript 获取 input:file 路径</title>
</head>

<body>
<input type="file" id="file" />

<script type="text/javascript">
/**
 * 本脚本用于获取 HTML input[type=file] 控件的文件路径
 * 当使用 IE 浏览器且版本高于 6.0 时, 由于浏览器安全限制, 暂时没有好的解决方案,
 * 需要客户端浏览器进行设置: Internet选项 - 安全 - 自定义级别 - 启用"将文件上载到服务器时包含本地目录路径"
 */

var o = document.getElementById('file');

o.onchange = function(){
	getFilePath(this, function(file_path){
		alert(file_path);
	});
}

function getFilePath(o, callback){
	var url = '';

	if(document.all){ // MSIE
		url = o.value;
	}else{
		if(o.files && o.files[0]){
			if(window.File && window.FileReader && window.FileList && window.Blob){
				var reader = new FileReader();
				reader.onloadend = function(e){
					if(e.target.readyState == FileReader.DONE){
						callback(e.target.result);
					}
				};
				reader.readAsDataURL(o.files[0]);
			}else if(o.files[0].getAsDataURL() != undefined){
				url = o.files[0].getAsDataURL();
			}
		}
	}

	if(url != '')
		callback(url);
}

// Javascript获取IE浏览器版本号
// 非IE浏览器返回空字符串
function getIEVersion(){
	if (window.navigator.userAgent.indexOf('MSIE') > -1) {
		var regex = /MSIE ([^;]*);/i;
		regex.test(window.navigator.userAgent);
		return RegExp.$1;
	} else {
		return '';
	}
}
</script>
</body>
</html>

JavaScript 跨域请求方法总结

在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?

同源策略

在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。

同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?当两个域具有相同的协议(如http),相同的端口(如80),相同的host(如www.example.org),那么我们就可以认为它们是相同的域。

比如http://www.example.org/index.html和http://www.example.org/sub/index.html是同域,而http://www.example.org,https://www.example.org,http://www.example.org:8080,http://sub.example.org中的任何两个都将构成跨域。同源策略还应该对一些特殊情况做处理,比如限制file协议下脚本的访问权限。本地的HTML文件在浏览器中是通过file协议打开的,如果脚本能通过file协议访问到硬盘上其它任意文件,就会出现安全隐患,目前IE8还有这样的隐患。

受到同源策略的影响,跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步,目前在跨域请求的技巧上,有很多宝贵经验的沉淀和积累。这里我把跨域资源共享分成两种,一种是单向的数据请求,还有一种是双向的消息通信。接下来我将罗列出常见的一些跨域方式,以下跨域实例的源代码可以从这里获得。

单向跨域

JSONP(JSONwithPadding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的javascript,于是我们可以通过script标记来动态加载其他域的资源。

例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据,然后在pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。

JSONP易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

flash有自己的一套安全策略,服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问,SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域访问资源时,例如从域www.a.com请求域www.b.com上的数据,我们可以借助flash来发送HTTP请求。

首先,修改域www.b.com上的crossdomain.xml(一般存放在根目录,如果没有需要手动创建),把www.a.com加入到白名单。

其次,通过FlashURLLoader发送HTTP请求。

最后,通过FlashAPI把响应结果传递给JavaScript。FlashURLLoader是一种很普遍的跨域解决方案,不过需要支持iOS的话,这个方案就无能为力了。

window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。那么我们可以在页面A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给window.name,iframe加载完成之后,页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出window.name的值了。这个方式非常适合单向的数据请求,而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。

在数据提供方没有提供对JSONP协议或者window.name协议的支持,也没有对其它域开放访问权限时,我们可以通过serverproxy的方式来抓取数据。例如当www.a.com域下的页面需要请求www.b.com下的资源文件asset.txt时,直接发送一个指向www.b.com/asset.txt的Ajax请求肯定是会被浏览器阻止。

这时,我们在www.a.com下配一个代理,然后把Ajax请求绑定到这个代理路径下,例如www.a.com/proxy/,然后这个代理发送HTTP请求访问www.b.com下的asset.txt,跨域的HTTP请求是在服务器端进行的,客户端并没有产生跨域的Ajax请求。这个跨域方式不需要和目标资源签订协议,带有侵略性,另外需要注意的是实践中应该对这个代理实施一定程度的保护,比如限制他人使用或者使用频率。

双向跨域

通过修改document的domain属性,我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域,比如www.a.com和sub.a.com是不同的域,这时,我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript方法。但是当我们把它们document的domain属性都修改为a.com,浏览器就会认为它们处于同一个域下,那么我们就可以互相调用对方的method来通信了。

不同的域之间,JavaScript只能做很有限的访问和操作,其实我们利用这些有限的访问权限就可以达到跨域通信的目的了。FIM(FragmentIdentitierMessaging)就是在这个大前提下被发明的。父窗口可以对iframe进行URL读写,iframe也可以读写父窗口的URL,URL有一部分被称为frag,就是#号及其后面的字符,它一般用于浏览器锚点定位,Server端并不关心这部分,应该说HTTP请求过程中不会携带frag,所以这部分的修改不会产生HTTP请求,但是会产生浏览器历史记录。

FIM的原理就是改变URL的frag部分来进行双向通信。每个window通过改变其他window的location来发送消息,并通过监听自己的URL的变化来接收消息。这个方式的通信会造成一些不必要的浏览器历史记录,而且有些浏览器不支持onhashchange事件,需要轮询来获知URL的改变,最后,URL在浏览器下有长度限制,这个制约了每次传送的数据量。

页面上的双向通信也可以通过Flash来解决,FlashAPI中有LocalConnection这个类,该类允许两个SWF之间通过进程通信,这时SWF可以播放在独立的FlashPlayer或者AIR中,也可以嵌在HTML页面或者是PDF中。遵循这个通信原则,我们可以在不同域的HTML页面各自嵌套一个SWF来达到相互传递数据的目的了。

SWF通过LocalConnection交换数据是很快的,但是每次的数据量有40kb的大小限制。用这种方式来跨域通信过于复杂,而且需要了2个SWF文件,实用性不强。

window.postMessage是HTML5定义的一个很新的方法,这个方法可以很方便地跨window通信。由于它是一个很新的方法,所以在很旧和比较旧的浏览器中都无法使用。

JAVASCRIPT总结

跨域的方法很多,不同的应用场景我们都可以找到一个最合适的解决方案。比如单向的数据请求,我们应该优先选择JSONP或者window.name,双向通信我们采取CrossFrame,在未与数据提供方没有达成通信协议的情况下我们也可以用serverproxy的方式来抓取数据。

希望通过本文的介绍,能够给你带来帮助。

原文:http://www.cnblogs.com/rmbteam/archive/2011/08/09/2131633.html

关于 |= 运算符

最近已经有好几次有人在讨论这个运算符的相关问题了。我之前遇到过,却没有实际使用过。根据学习的经验,如果此运算符合法,那么应该有:

a |= b

// 上面的表达式应该等同于下面的这个表达式
a = a | b

实际在 PHP 中执行一下就知道了:

<?php
$a = 2;
$b = 1;
$a |= $b;
var_dump($a); // int(3)
?>

很容易知道,这个整数3应该就是$a和$b进行位或运算的结果。即二进制的 10 与 01 进行或运算,得到二进制11, 即十进制的3.

可见,|= 运算符就是这个作用。那么,是不是还应该有 ^= 和 &= 运算符呢?

<?php
$a = 3;
$b = 1;
$a ^= $b;
var_dump($a); // int(2)

$a = 3;
$b = 1;
$a &= $b;
var_dump($a); // int(1)

实际的试验结果证明了我们的猜测。

OK, PHP 中这些操作符是合法的,那么Javascript中呢?实际上也是相同的。

<script type="text/javascript">
var a = 2;
var b = 1;
a |= b;
alert(a); // 3

a = 3;
a ^= b;
alert(a); // 2

a = 3;
a &= b;
alert(a); // 1
</script>

QQZone 分享 UTF-8 编码的 HTML5 页面乱码解决方案

今天一个朋友让帮忙看看页面分享的乱码问题。使用的是JiaThis的分享插件。一切都完美无缺,除了 QQZone 分享的乱码问题。

http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=xxx

其中,xxx 就是要分享的网址了。但是对于 Doctype 声明为 HTML5 并且 UTF-8 编码的页面,提取页面title和description出现乱码。为啥单单 UTF-8 的乱码?GB2312的却没事儿呢?

可能的原因是,腾讯的这个空间分享工具,是根据页面的 HTML 编码声明语句来正则匹配得到当前页面的编码的。如果匹配到,则使用页面设定的编码,否则将使用GB2312的编码。

XHTML 1.0 中标准的编码声明:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

HTML5 中的编码声明:

<meta charset="utf-8">

由于该页面使用的是 HTML5 的 doctype,导致获取页面编码失败,默认使用GB2312编码,才出现了乱码问题。那么如何解决呢?显然是更换 Doctype 为 XHTML 1.0的咯。

真不明白,为啥一个页面明明没有用到 HTML5的任何特性,却要声明为 HTML5 的 Doctype.  莫非这就是传说中的NC …

更改好编码之后,仍然是乱码,由此猜想可能是腾讯的服务器端做了数据缓存。咋办呢?换个页面地址?一般来说这样是可行的。不过今天的情况有点不一样。产品已经推出,宣传上都是用的现有地址,如果更改了页面地址,肯定要流失不少点击量。

借鉴一下我们针对图片和JS,CSS等页面资源文件缓存的处理办法,给页面地址加个QUERY STRING。例如,地址原来是:

http://www.abc.com/

更改为

http://www.abc.com/?v1

不过这个地址貌似不太好看呐。所以就想取个折中方案。在浏览的时候,使用原始地址,而在分享的时候,使用下面的带有Query String 的地址以防止使用缓存数据。

由于 JiaThis 插件是第三方站的 JS 生成的,所以我们需要确保在插件完成初始化之后,对其进行事件的重新绑定。这里可以使用setInterval 或者 setTimeout 函数来进行插件初始化的检测。如果捕获到插件生成的页面元素的存在,那么就认为 JiaThis 插件已经完成了初始化,则可以对其进行事件的解除绑定和再次重新绑定,并清除定时器以释放系统资源。如果没有检测到响应的页面元素,则继续执行定时器。

后来经过测试,发现QQZone的分享按钮并不总是在固定位置,所以还需要进行逐个检测,判断按钮是不是QQZone的,如果是,则进行解绑定和再次重新绑定操作,如果不是,则不进行任何操作。

最终代码如下:

<script type="text/javascript">
var setIntervalId = setInterval(function(){
	if($('#jiathis_sers a:first').size()){ // jiathis 加载完毕
		clearInterval(setIntervalId);
		$('#jiathis_sers a').each(function(k, v){
			var regex = /qzone/;
			if(regex.test($(this).attr('onclick'))){
				$(this).attr('onclick', '').attr('href', 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + encodeURIComponent(document.location.href + '?v1'));
			}
		});
	}
}, 500);

经过实际线上测试,原来的乱码和缓存问题都得到了解决。

延迟 Image 加载Lazy Image Jquery 插件

雨林木风系统门户页面源码看到的,记录一下,备用。

/*
 * 作者:zen  (346816084@qq.com)
 * 图片延迟加载脚本
 * 适用于图片较多的页面.可加快页面的加载速度,同时节省一部分流量
 *
 * 使用方法:
 * 该脚本依赖于jQuery1.3+以上
 * 延迟加载的图片的src统一为一个1*1像素的透明图片.同时将宽高预设好.将图片的真实地址放在自定义属性"rsrc"中.
 *
 * 例: <img class="lazy-image" src="空白图片路径" rsrc="真实图片路径" height="300px" width="500px" alt="" />
 *
 * 在页面的document加载完成后,加载该脚本,同时用下列的命令开始运行脚本
 *
 *  例:var lazyImage=$(".lazy-image").lazyImage();
 *
 *  手动执行图片加载:
 *  lazeImage.reloadImage();
 */
jQuery.fn.extend({
    lazyImage:function(){
        var _self=this,
            scrollTop,
            interval,
            lazy=400;

        //判断页面是否发生了滚动
        var scrollWindow=function(){
            var ran=getViewRang();
            if(ran.y!=scrollTop){
                loopLoad(ran);
            }
            //所有图片加载完成,停止事件监听
            if(_self.length>0){
                interval=setTimeout(arguments.callee,lazy);
            }
        };

        //循环队列加载图片
        var loopLoad=function(){
            var temp=[],
                ran=getViewRang();
            _self.each(function(i,n){
                if(isOver(ran,$(this))){
                    temp.push(this);
                    loadImage($(this));
                }
            });
            scrollTop=ran.y;
            //将已读取对象清除出队列
            _self=_self.not(temp);
        }

        //获取视口范围
        var getViewRang=function(){
            return {
                y:$(document).scrollTop(),
                height:$(window).height()
            }
        };
        //是否在视口范围内
        var isOver=function(ran,obj){
            var offset=obj.offset(),
                //objHeight=obj.height()?obj.height():obj.attr("height"),  //隐藏元素需要height属性的支持,否则不能加载
                objHeight=obj.height(),
                overX=overY=false;
            if(offset.top<(ran.y+ran.height)&&(offset.top+objHeight)>ran.y){
                overY=true;
            }
            return overY;
        };
        //读取真正的图片
        var loadImage=function(obj){
            obj.attr("src",obj.attr("rsrc"));
            return obj;
        }

        scrollWindow();
        return {
            reloadImage:function(){
                loopLoad();
            }
        }
    }
});