1. 功能描述:

把页面加入收藏功能,兼容各个浏览器

注意:

有些浏览器的设置就是不支持用js来把页面加入收藏夹,只能让用户手动去在浏览器或者按键去设置这些功能,这里说的兼容是指当浏览器有这个设置的时候js会有提示.

1.ie使用:window.external.addFavorite()

2. Firefox

3.其他主流浏览器(chrome、opera、safari)其他浏览器没有此功能,不过可以提醒用户使用ctrl+d的方法手动添加

代码运行尝试1:

//加入收藏夹function AddFavorite(sURL, sTitle) {var sTitle =" ";                       //sTitle:添加到收藏夹中的网站页面标题名称。var sURL = location.href;              //sURL:添加到收藏夹的完整网站页面地址try {window.external.addFavorite(sURL, sTitle);//IE浏览器}catch (e) {try {window.sidebar.addPanel(sTitle, sURL, "");//Firefox浏览器}catch (e) {alert("加入收藏失败,请使用Ctrl+D进行添加");}}
}
<a href="#" onclick="AddFavorite(window.location,document.title)" >加入收藏</a>

这段代码是网上常用的收藏代码,包括我现在工作的地方项目网站也是这么写的,但实际上......

我们来测试一下吧

测试浏览器:ie,火狐浏览器,谷歌浏览器,猎豹浏览器,360浏览器,oprea浏览器

测试结果:火狐浏览器不行,360也是不行

失败原因:

1.360 失败原因:在ie浏览器下,加入收藏夹的功能是正常的,而360显然用的是ie内核,理论上没理由不行的,但是据某些不确定来源的消息说是新版360浏览器,为了安全所以禁用了加入收藏夹功能,在主程序里面写死了一个白名单。所以你懂得.......

2.火狐浏览器失败原因:官方文档上写的清楚,从版本23以后,sidebar.addPanel方法被抛弃,但是可以在标签上加上rel="sidebar"来代替,

<a href="#" onclick="AddFavorite(window.location,document.title)"  rel="sidebar">加入收藏</a>

找到了失败原因,下面我们就来改一下吧!!!

function AddFavorite(sURL, sTitle){var sTitle='';var sURL=location.href;if (window.sidebar) return true;try{window.external.addFavorite(sURL, sTitle);}catch(e){alert( "加入收藏失败,请使用Ctrl+D进行添加" );}return false;
}
<a href="#" onclick="AddFavorite(window.location,document.title)"  rel="sidebar">加入收藏</a>

测试浏览器:ie,火狐浏览器,谷歌浏览器,猎豹浏览器,360浏览器,oprea浏览器

测试结果:ie,火狐浏览器,猎豹直接弹出收藏框,其他都提示

相关知识点:

1.window.external

应用程序通过内嵌浏览器的方式,利用js的window.external可以达到控制窗体行为的效果,如控制窗体宽高大小,透明度,网页截屏,网页读写文件,网页控制桌面行为等

我们在js中可以通过window.external.aaaa()来调用浏览器提供的外部方法aaaa。

window.external的些用法

(1)external.AddFavorite 把网站加入到用户的收藏夹 

语法:external.AddFavorite(网址,标题);

  function f(){window.external.AddFavorite(location.href, document.title);}

(2)external.AddDesktopComponent 把网站作为用户的Active桌面 

语法:external.AddDesktopComponent(地址,类型[image/website],左距离,顶距离,宽度,长度) 

function f(){ //例子window.external.AddDesktopComponent("http://www.baidu.com/", "website",0,0,800,600);}

(3)external.NavigateAndFind 搜索指定网站中的某个字段 
语法:external.NavigateAndFind(文件地址,关键字,_Target)

function f(){window.external.NavigateAndFind("http://www.baidu.com/","张银","_self");}

(4)external.ShowBrowserUI 调用语言选择窗口与收藏夹管理窗口 
 语法:external.ShowBrowserUI(类型[LanguageDialog/OrganizeFavorites], null)

<input type="button" name="button" value="语言设置" οnclick="window.external.ShowBrowserUI('LanguageDialog', null)">
<input type="button" name="submit" value="整理收藏夹" οnclick="window.external.ShowBrowserUI('OrganizeFavorites', null)">  

(5)external.ImportExportFavorites 导入与导出用户收藏夹 
 语法:external.ImportExportFavorites(导入/true 导出/false, 文件路径)

<input type="button" name="Button" value="导入收藏夹" οnclick=window.external.ImportExportFavorites(true,"http://www.baidu.com/");><input type="button" name="Button3" value="导出收藏夹" οnclick=window.external.ImportExportFavorites(false,"http://www.baidu.com/");>

2.window location

window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。

window.location 对象在编写时可不使用 window 这个前缀

Window Location Hash

定义和用法

hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分)。

例子:

实例

假设当前的 URL 是: http://example.com:1234/test.htm#part2:

<html>
<body><script type="text/javascript">
document.write(location.hash);
</script></body>
</html>

输出:

#part2

Window Location Hostname

定义和用法

hostname 属性是一个可读可写的字符串,可设置或返回当前 URL 的主机名。

语法

location.hostname

实例

假设当前的 URL 是: http://example.com:1234/test.htm#part2:

<html>
<body><script type="text/javascript">
document.write(location.hostname);
</script></body>
</html>

输出:

example.com

注意:

之前var sURL = location.hostname;

然后发现所有的浏览器都提示加入收藏失败,请使用Ctrl+D进行添加,

后来才发现应该是var sURL = location.href;

Window Location Href

location.href 属性返回当前页面的 URL。

实例

返回(当前页面的)整个 URL:

<script>document.write(location.href);</script>

以上代码输出为:

http://www.runoob.com/js/js-window-location.html

3. 异常处理try catch (e)

Try...Catch 声明 
try...catch可以测试代码中的错误。try部分包含需要运行的代码,而catch部分包含错误发生时运行的代码。 
语法:

try
{ //在此运行代码
}
catch(err)
{ //在此处理错误
}

注意:try...catch使用小写字母。大写字母会出错。

我们可以添加try...catch声明,这样当错误发生时可以采取更适当的措施。

使用总结:

为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了。紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句。

也就是说
try块中的语句首先被执行。如果运行中发生了错误,控制就会转移到位于catch块中语句,否则,catch块的语句被跳过不执行

 下面我们来看一个例子:

<script language="javascript">try {document.writeln("开始执行try块语句 ---> ")document.writeln("还没有发生例外 ---> ")alert((prompt("输入一个值:","")))} catch(err) {document.writeln("捕捉到例外,开始执行catch块语句 --->");document.writeln("错误名称: " + err.name+" ---> ");document.writeln("错误信息: " + err.message+" ---> ");} finally {document.writeln("开始执行finally块语句")}</script>

  我们输入abc,然后确定,输出结果如下:

  “开始执行try块语句 ---> 还没有发生例外 ---> 捕捉到例外,开始执行catch块语句 ---> 错误名称: TypeError ---> 错误信息: 'abc' 未定义 ---> 开始执行finally块语句”
  上述例程以try块语句开始,当输出信息“还没有发生例外”后,弹出输入对话框,要求用户输入一个数值,当我们输入非法的信息"abc"后,就引发了一个例外,所以剩下的try块中的语句将被跳过而开始执行catch块语句。Catch块开始的err参数作为这个例外的错误对象,它具有name和message两个属性。最后,执行finally块的语句。

 我们看到,由于没有错误发生,当try块的语句执行完毕后,catch块语句被跳过,出现一个窗口显示输入的数值,最后执行了finally块的语句。

但是并不是所有的场合都适合try catch,大量的try catch会降低代码的可读性,只有在异常触发时才会对程序的性能造成较大的影响。(参考文章:小酌重构系列[20]——用条件判断代替异常)

流程控制语句:流程控制有它本身的逻辑,我们应该用判断来规避try catch语句块的使用

当使用try catch来控制程序流程时,如果程序中不存在“危险”代码(例如:类型转换、建立连接等),就没有必要使用try catch,我们可以直接使用条件判断来控制程序流程。

示例:

重构前

下面这段代码表示“微波炉当前如果没有被使用,那么我们就可以用它加热食物”。

public class Microwave
{private IMicrowaveMotor Motor { get; set; }public bool Start(object food){bool foodCooked = false;try{Motor.Cook(food);foodCooked = true;}catch (InUseException){foodcooked = false;}return foodCooked;}
}

这段代码通过是否触发自定义异常InUseException,来决定方法Start()方法的返回值,这是典型的使用try catch语句块来控制流程的做法。

catch语句块捕获了InUseException,却没有处理InUseException,这不仅损失了程序的性能,也未体现自定义异常InUseException的价值。
这仅仅是一个常见的逻辑判断,我们用条件判断就可以了。

重构后

public class Microwave
{private IMicrowaveMotor Motor { get; set; }public bool Start(object food){if (Motor.IsInUse)return false;Motor.Cook(food);return true;}
}

重构以后,代码的可读性增强了,还消除了捕捉异常带来的性能损失。

4. sURL = encodeURI(sURL)

使用encodeURI()编码,解决中文乱码问题

一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。

网址路径中包含汉字,使用encodeURI()编码,解决中文乱码问题,我们可以参考这篇文章学习下,

url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介,这里我就不多讲了。

注意:本文为原创,转载请以链接形式标明本文地址 ,谢谢合作。
本文地址:http://www.cnblogs.com/wanghuih/p/5710189.html

转载于:https://www.cnblogs.com/wanghuih/p/5710189.html

兼容各个浏览器的页面收藏效果相关推荐

  1. OPENCART之兼容多种浏览器的加入收藏夹扩展功能插件(CROSS-BROWSER BOOKMAR

    2019独角兽企业重金招聘Python工程师标准>>> OPENCART之兼容多种浏览器的加入收藏夹扩展功能插件(CROSS-BROWSER BOOKMARK) 由于安全原因,谷歌浏 ...

  2. 兼容所有浏览器的CSS3圆角效果

    解决CSS3圆角兼容所有浏览器的方法.本文提到了一种很不错的实现跨浏览器圆角的解决方案. 前一段时间,我经常收到一个关于如何在IE浏览器中使用CSS3的border-radius属性实现圆角HTML元 ...

  3. vue2.0兼容ie浏览器(页面加载及导出问题)

    最近项目开发中遇到需要用到ie浏览器的情况,因为是内网开发,大致记录下兼容过程. 问题1:ie11浏览器页面无法加载 首先遇到的问题是谷歌浏览器运行无问题,控制台也不报错,但是ie11浏览器就打不开, ...

  4. 加入收藏js代码 兼容所有浏览器

    我们介绍一个可兼容所有浏览器的加入收藏代码代码,大概原理是这样的我们根据获取用户navigator.userAgent.toLowerCase()信息来判断浏览器,根据浏览器是否支持加入收藏js命令, ...

  5. html5 加入收藏夹,js添加到收藏夹代码 兼容所有浏览器

    介绍一个可兼容所有浏览器的加入收藏代码代码,大概原理是这样的我们根据获取用户navigator.userAgent.toLowerCase()信息来判断浏览器,根据浏览器是否支持加入收藏js命令,如果 ...

  6. scrolltop 原生js_解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法...

    最近在做博客的目录功能,发现一个在现代浏览器间的一个bug,或是称之为差异,即页面滚动值(scrollTop)的获取与设定. 在此之前先说一下关于页面元素的坐标获取,这张图的经典性不必再提. 实现滚动 ...

  7. 兼容所有浏览器的设为首页收藏本站js代码,推荐使用

    加入收藏的按钮方法! 大家发现传统的收藏本站按钮在360浏览器下面没有效果了,但是360浏览器用户群却非常之大.所以我们在网上找到一个兼容所有浏览器的收藏本站解决方案,具体功能如下: 设为首页 和 收 ...

  8. JS兼容各个浏览器的本地图片上传即时预览效果

    JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...

  9. 动易CMS - 设为首页代码和加入收藏代码(兼容各种浏览器)

    注意: 这里虽然说是兼容,但是有些浏览器的设置就是不支持用js来把页面设为首页,加入收藏夹,只能让用户手动去在浏览器或者按键去设置这些功能,这里说的兼容是指当浏览器有这个设置的时候js会有提示.   ...

最新文章

  1. java网络编程udp_java网络编程 UDP网络编程问题
  2. Observable.OnSubscribe 的理解
  3. 字节AI实习生搞出这个玩意儿,撩到了图灵奖大神,我用了用结果画风逐渐鬼畜起来……...
  4. Nginx 之五: Nginx服务器的负载均衡、缓存与动静分离功能
  5. Numpy基础学习与总结
  6. java Locale 解析方法
  7. 【LVS】简介与说明
  8. 分布式搜索 Elasticsearch —— 删除索引
  9. 卡巴斯基发现新型恶意软件StoneDrill,或与 Shamoon有关
  10. Apache的Mod_rewrite学习(RewriteRule重写规则的语法)
  11. C# 将外部exe程序 嵌入到自己的窗体界面
  12. 用Kickstart批量安装Linux系统、Kickstart安装,linux批量安装;Linux的Kickstart的 无人值守安装;linux pxe自动安装linux系统...
  13. springmvc或者springboot 中实现跨域的5种方式
  14. 用VAE(variational autoencoder)做sentence embedding/representation或者其他任何结构数据的热presentation...
  15. 垂直跑马灯水平跑马灯
  16. @JsonView注解的使用
  17. IOS软件工程师课程分享
  18. 教室录播系统方案_《课堂教学录播专用教室》建设方案及装备标准
  19. 关于浏览器提示“隐私设置错误/证书错误导航已阻止”之 网站证书过期解决方案
  20. Identifying Encrypted Malware Traffic with Contextual Flow Data

热门文章

  1. 数学(二)三角求导公式总结
  2. 程序设计思维与实践 week10限时模拟 A - 签到题、B - 东东转魔方
  3. PS打造暗调高清的海景照片nbsp;摄…
  4. 【原创】高效质量活动之纺锤型分布
  5. 时尚vs青春发表日志:我的高考故事
  6. ECMA5与ECMA6
  7. java卸载错误2503_win10安装和卸载Java jdk错误出现2503,2502错误
  8. 玩机搞机----root面具的安装 更新 隐藏root 德尔塔面具等等综合解析
  9. 狄立克雷函数傅立叶变换0点_你真的理解傅立叶变换吗?
  10. 免费sip软电话软件(sip客户端)