你的添加收藏夹脚本,靠谱吗?

分类:Javascript | 标签:,

实现添加到收藏夹的脚本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方法是否支持的判断上,有三种方式:

  1. external.AddFavorite   ie提示:对象不支持此属性或方法
  2. typeof external.AddFavorite !=’undefined’  maxthon2判断出错
  3. ‘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。

发表于:2010/12/03 01:17 | 139 views | 2条讨论

共有2条评论,发表一条新评论>>

  1. Ben says:

    使用try catch 轻松搞定,你加这么多判断,这么多浏览器,你判断的完么

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

回顶部