你的添加收藏夹脚本,靠谱吗?
实现添加到收藏夹的脚本Google一搜一大片,实现起来更没什么难度,使用了一下却发现有不少问题。主要是脚本的兼容性问题,由于ie下是通过 external 调用添加搜藏夹方法,external与浏览器外壳实现有很大关系,不同的浏览器提供的功能上会有差别;另外,external也并非ie独有的属性,Gecko、wekit都有这个属性,比如chrome下实现添加搜索引擎的AddSearchProvider方法就在这个对象上,所以在判断特性支持上需要仔细考虑和测试。
下面是写脚本的过程:
首先考虑判断是否支持AddFavorite方法,来区分不同的添加方法,考虑通过特性检测来区分不同实现:
if(external&&external.AddFavorite){}
但是addFavorite并不像普通js函数一样,ie下报错:对象不支持此属性或方法;尝试使用typeof ,ie下输出unkown,因此通过这种方法检测:
if(external&&typeof external.AddFavorite != ‘undefined’){}
在主要浏览器测试都ok,可杯具的是遨游下就判断为false了,external并不是内核实现,和浏览器关联很大,测试了下,maxthon2下 external.AddFavorite===undefined 但是又可以通过 external.AddFavorite()添加搜藏,尴尬,!–。好吧,用浏览器检测吧:
if(document.all){}
maxthon2,ie都ok,正高兴地时候,杯具又来了maxthon3 兼容模式下的 external ===null ,。。。,通过这种方法就判断不出浏览器是否支持自动添加;紧接着测试the world:根本不支持,tt :中规中矩和ie一样,sogou :牛b,兼容模式和ie一样,webkit下 也实现了这个方法,基于webkit浏览器中唯一一个提供这种方法的,顿时另我对sougou刮目。看来通过浏览器检测完全不靠谱了,还是方法检测,对bt的maxthon2 做特殊对待:
if(external&&(typeof external.AddFavorite != ‘undefined’ || isMaxthon2)){}
对于firefox和opera 都可以通过指定链接 rel=“sidebar” 来实现添加搜藏夹功能,可惜不足是firefox下会自动勾选在侧边栏打开
其他不能自动添加的给个提示
ok,代码基本就出来了,add-favorite.js
—————————————————————————————————————————————————–
update: 2011-11-14
关键是在 external.AddFavorite方法是否支持的判断上,有三种方式:
- external.AddFavorite ie提示:对象不支持此属性或方法
- typeof external.AddFavorite !=’undefined’ maxthon2判断出错
- ‘AddFavorite’ in external 所有ie内核浏览器正确
所以通过最后一种方式,就无需特殊处理了,直接特性检测:
/**
* @author: tiejun[at]taobao.com
* @date: 2010-12-2
* @log: 去除对a上设置 rel的依赖,更新判断,优化代码 2011-11-14
* @description: opera勿阻止浏览器默认事件否则无效;wekits内核不支持自动搜藏
*/
function addFav(el,url,title){
if(!el){return false;}
url= url || location.href;
title= title || document.title;
var external = window.external,
sidebar = window.sidebar,
ret = true;
if(external && 'AddFavorite' in external){
// ies
external.AddFavorite(url,title);
}else if(sidebar && sidebar.addPanel){
//ff
sidebar.addPanel(title,url,"");
}else if(window.opera){
//opera,defaluts to sidebar
el.setAttribute('rel','sidebar');
el.href=url;
el.title=title;
}else{
//webkits
alert("您的浏览器不支持自动添加收藏夹功能\n请手动将本页添加到收藏夹(快捷键:"+
(navigator.appVersion.indexOf("Mac")>-1?'Cmd':'Ctrl')+
'+D)');
ret = false;
}
return ret;
}
效果:
相比之前清晰了很多,兼容所有ie内核浏览器,webkit内核不支持(sougou除外)
有任何问题feedback here。
使用try catch 轻松搞定,你加这么多判断,这么多浏览器,你判断的完么
更新了下版本,目前只是特性检测,没有try catch的必要