巧妙利用图片IMG的onerror事件,对付网通电信的南北分家

 背景:
我国电信网通南北分家已经成为了一种不可改变的现状,做网站的朋友都知道,如果想让南北方地朋友们都能够顺利地访问我们的网站,需要买双线服务器,就是既通网通用户又通电信用户的线路,尽管如此有的机房在提供双线服务器的时候会提供两个IP地址(网通和电信分别有一个IP);这时候我们就需要在域名映射的时候映射一个电信地址,一个网通地址,例如:dianxin.xxx.com;wangtong.xxx.com;可是用户访问的时候总是希望访问www.xxx.com,就是说我们需要在用户访问www.xxx.com  的时候智能的判断出用户在北方还是在南方,然后进行跳转。

思路:
我们在www.xxx.com 中让客户端同时向地址dianxin.xxx.comwangtong.xxx.com发出一个错误的请求,哪一个地址返回错误的响应速度快就说明用户应该访问那个地址。

关键代码:
<img src="http://dianxin.xxx.com/NotExistsUrl" width="1" height="1"
   onerror="location.top.url='http://dianxin.xxx.com/'"/>
<img src="http://wangtong.xxx.com/NotExistsUrl"  width="1" height="1"
   onerror="location.top.url='http://wangtong.xxx.com/'"/>

为了在用户下次访问的时候可以直接跳转到比较快的线路上我们可以将这一次判断的结果保存到cookie中。

IMG
onerror事件的另一个用武之地:
我们都不希望用户看到我们网站上面出现无效的图片,即便是出现了无效的图片我们也希望以一种友好的方式告诉用户图片无效,而不是直接给用户看默认的红叉;怎么办,我们可以在图片的onerror事件中将图片的src属性设置为我们网站上已存在的表示图片不存在的图片。
代码示例:
<img src="http://www.xxx.com/someImage.gif
   onerror="this.src='http://www.xxx.com/invlid.gif'"/>

说明:
关于南北分家的解决方案有很多种,本文只是为大家提供一种思路。
我的微博地址是:http://weibo.com/yukaizhao 我会把一些技术心得碎片写到微博中,欢迎关注。
posted @ 2007-03-02 17:59 玉开 阅读(5716) 评论(31) 编辑 收藏

 回复 引用   
#1楼2007-03-02 18:01 | 羽怂[未注册用户]
很好
 回复 引用 查看   
#2楼2007-03-02 18:30 | Anders Liu      
我的问题是,这个www.xxx.com放在哪个IP上?
 回复 引用   
#3楼2007-03-02 18:47 | 萧寒
我的问题是,这个www.xxx.com放在哪个IP上?
////////////////////////////////////////////

这个问题问的有意思,但是思路不是这样的,应该是电信和网通的两个ip上都放这种机制,那只是第一次访问比较慢,并不代表无法访问.

 回复 引用   
#4楼2007-03-02 18:54 | yukaizhao[未注册用户]
@Anders Liu
不是放在哪台服务器的问题,程序是放在一台服务器上的,ip有两个,或者说线路是两条;用户分南北。

www.xxx.com可以映射到电信或者网通的ip上,内容很少(可能只有1,200字节),用户可以很快的接收到,然后根据文中的方法跳转。

 回复 引用   
#5楼2007-03-02 18:55 | yukaizhao[未注册用户]
@萧寒
您说的很对,呵呵

 回复 引用   
#6楼2007-03-02 19:35 | cricy[未注册用户]
图片的大小为零不可以吗???
 回复 引用   
#7楼2007-03-02 19:44 | JoeLee[未注册用户]
很明显这个方法不保险,因为网络原因,浏览起原因等很多原因都可以造成这个图片无法加载.这个做法和天涯类似,搞十几张图片.那个下载快,就转到那个服务器上.可惜还有很多浏览器不支持js,或者就不支持cookie.

通过IP判断或让用户自己选比较好.

 回复 引用 查看   
#8楼2007-03-02 20:23 | Cat Chen      
这个世界上有种东西叫做CDN……有米的话,直接CDN算啦,南方和北方的DNS解释你的域名后返回的IP可以不同,分别设为“两岸”的镜像服务器就是了。
 回复 引用 查看   
#9楼2007-03-02 20:52 | JesseZhao      
哈哈,很巧妙啊
 回复 引用   
#10楼2007-03-02 21:05 | yukaizhao[未注册用户]
@cricy
不需要图片的大小,只是要浏览器向服务器发出一个请求,让服务器返回404错误,然后看服务器的相应速度。

 回复 引用   
#11楼2007-03-02 21:06 | yukaizhao[未注册用户]
@JoeLee
您说的没错,不过可以用这种方法+用户选择,如果这种方法有效的话,当然就没必要让用户选择了,如果无效的话,在让用户选。

 回复 引用   
#12楼2007-03-02 21:08 | yukaizhao[未注册用户]
@Cat Chen
没错,这只是一种方法而已。还有很多方法可以实现。

 回复 引用   
#13楼2007-03-02 21:08 | yukaizhao[未注册用户]
@JesseZhao
谢谢,赵兄的鼓励。

 回复 引用 查看   
#14楼2007-03-02 23:01 | Jeffrey Zhao      
这种方式虽然巧妙,但非正统,不可取啊。
 回复 引用 查看   
#15楼2007-03-03 01:57 | Bention      
@Jeffrey Zhao
老大有何方法呢,我之前也是经常用这种方式,不过感觉不是非常好,请老大指教一下

 回复 引用   
#16楼2007-03-03 08:20 | 虫虫[未注册用户]
中国的电信公司
搞得象军阀割据一样

 回复 引用   
#17楼2007-03-03 08:56 | net[未注册用户]
这样的网站是否会被 百度或者google 杀死啊
 回复 引用 查看   
#18楼2007-03-03 09:03 | 补丁      
CDN很贵
免费的CDN稳定性还有待提升

http://www.putop.com/
我写的这个"线路选择"代码如何
如果页面没有加载完成就调用有可能引发IE的错误(一个BUG)
但是很多用户有这种需求,他们等不及页面加载完成...

 回复 引用 查看   
#19楼2007-03-03 09:10 | Bention      
楼上的,你的网站压根打不开啊。
 回复 引用 查看   
#20楼2007-03-03 09:30 | Bention      
现在又行了,嘻嘻。
 回复 引用 查看   
#21楼2007-03-03 11:12 | 金色海洋(jyk)      
1、好像很难被搜索引擎搜录。又被风沙的可能性

2、不准确。

在早上的时候(8:00以前)网速是很快的,有可能电信的用户返回了网通的IP,郁闷的是你又把这个记录到了cookie里面,等到了晚上网速慢的时候就......


 回复 引用 查看   
#22楼2007-03-03 11:35 | 补丁      
@金色海洋(jyk)
其实也没有那么悲观,请看驱动之家的处理方式...
也没有那么多副作用,还是相对准确的

 回复 引用 查看   
#23楼2007-03-03 11:42 | Wisdom-zh      
好啊, 很有用
 回复 引用   
#24楼2007-03-03 16:36 | yukaizhao[未注册用户]
@虫虫
这是一种现状我们目前只有接受呀。

 回复 引用   
#25楼2007-03-03 16:37 | yukaizhao[未注册用户]
@net
这一点确实有待google或者baidu的专家指点。

 回复 引用   
#26楼2007-03-03 20:16 | cw[未注册用户]
不错.
 回复 引用 查看   
#27楼2007-03-09 22:59 | 大豆男生      
收藏
谢谢楼主,我做了这么多年web竟然不知道onerror可以这么用,算是白活了:)
 回复 引用   
#29楼2008-04-03 14:55 | yongfa365[未注册用户]
这个方法好啊
 回复 引用 查看   
#30楼2008-05-11 10:52 | 簡簡單單..      
学习学习..
 回复 引用 查看   
#31楼2010-07-28 20:56 | 軒轅劍      
此文不错,值得推荐!
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 662021 YRdvtG2YHb4=