js 创建书签小工具之理论


Posted in Javascript onFebruary 25, 2011

我们一直在寻找增加浏览体验的方法,有的方法众所周知,有的则鲜为人知。我原本认为书签小工具属于后者,非常令人讨厌的东西。令我非常懊恼的是我发现在这个问题上我完全是错误的。它并不是令人厌烦的,而是以用户为中心的,能实现很多出色的功能,而且就像人们所预期的一样,它成为了我与浏览者以及网络交互的核心部分。
这里我想向你介绍开发书签小工具以实现一些精妙的书签的全过程。是的,书签,我们将创建不只一个书签,即使是非常小的书签。很好奇吗?我们开始吧!

究竟什么是书签小工具呢?
引用前文的话:
书签小工具是一个非常棒的javascript代码小片断伪装成的小应用,它驻留在你的浏览器里并为网页提供额外的功能,仅仅只需要点击一下。

这个词是bookmark和applet的合成词,也叫做收藏小工具(favelets),这个小的javascript片断让你可以在浏览任何页面时召唤出额外的功能。因为它们只有javascript构成,所以它们是可移动的,可以支持所有的浏览器,甚至是移动设备和平板设备的。安装它们也相当简单,只需要将它们拖到收藏夹就行了!

那么,什么是关键呢?
关键之处在于书签小工具认你可以做很多原本要以开发人员为中心才能做的事情。任何通过书签小工具能获得的功能你都可以使用浏览器的控制台花费很少的时间而获得。书签小工具简化了这个过程,将实现一些功能的代码打包在一个小小的按钮里。书签小工具大体上来说可以分为以下几类:

用于传输数据。它用于将页面提交到特定的服务。处理社交媒体,查字典,搜索都属于这一类。我们将创建一个提交信息到Reddit(一个新闻网站)的书签小工具。
用于获取信息或修改当前页面的。我们将创建一个设置网页背景色的小工具。
用于后台运作。清除当前网站cookie的书签小工具是一个主要的例子,我们将下面创建一个。
1、开始
你需要记住的第一点就是在所有javascript代码前缀上“javascript”URI。浏览器实现了特定的前缀因此前缀后面的内容可以被当作javascript代码正确的处理,解析。
例如,点击“这个链接”(代码如下)将会强出一个对话框。

<a href="javascript: alert('文字链接');">这个链接</a>

2、包装成匿名函数
记住你的代码将运行于当前加载的页面,它可能会拥有自己的javascript代码,这意味着可能和书签小工具的代码存在冲突。最后你需要做的是让你的小工具中止当前页面。
将你的代码包装在一个匿名函数里可以保证没有名称冲突。此外,javascript新手将会被搞混并认为你是上帝,如果你这样做的话。
javascript:(function(){// your code here })();

当你在其它地方使用javascript代码时这也是适当,时刻注意保持自己的代码隔离。
3、按需外部化
书签小工具不一定要很小,你可以需要多大就写多大。在这种些情况下,为了发布方便并在不让用户手动干预的情况下保持代码为最新,最好是创建一个获取需要的代码的封装。
javascript: (function () { 
var jsCode = document.createElement('script'); 
jsCode.setAttribute('src', 'http://path/to/external/file.js'); 
document.body.appendChild(jsCode); 
}());

上面的代码变得美化了许多,它创建了一个script标签,将src属性设置成其它地方的一个文件,然后最终将它附加到文档中。通过这种方法,无论你哪上部分代码发生变化,你可以部署你修改后的文件并立刻传播到每一个用户。

注意:这不仅限于javascript。如果你的书签小工具使用前端,你也可以自由地引入外部HTML和CSS,使得你的小工具真正的自动更新。

4、谨慎地添加类库
如果你要创建一个大型的书签工具,你可能需要一个javascript类库。但是在你的页面里使用它们不仅仅只是将它们包含进来那么简单,你需要保证这个库不是已经存在了的。像jQuery和MooTools这样占有很大市场的类库你得仔细的处理来确保它预先没有被载入。
另一方面网页可能已经载入了其它类库,可能会导致“$”符号组件冲突。版本冲突在一些情况下也会出现,所以也要注意。

这里是一段我代码中使用的脚本。注意,在你的代码中你需要注意我上面说的几点。

if (!($ = window.jQuery)) { // typeof jQuery=='undefined' works too 
script = document.createElement( 'script' ); 
script.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'; 
script.onload=releasetheKraken; 
document.body.appendChild(script); 
} 
else { 
releasetheKraken(); 
} function releasetheKraken() { 
// The Kraken has been released, master! 
// Yes, I'm being childish. Place your code here 
}

这段代码的含义应该很明确了,我们简单地过一下。

首先我们通过判断jQuery对象是不是存在于名称空间里来确定jQuery是不是已经被加载了。
如果不存在,我们引入它。我们根据最佳实践能过CDN来载入它。最后我们确保指向包含要执行的代码的程序主函数。
如果已存在,直接运行主函数。
如果你觉得解决这个问题很麻烦,我强烈推荐Ben Alman的“书签小工具生成器”。它用一种很完全的方法解决全称空间和版本冲突。好东西!

5、非不得已不要搞乱母页
这一点太重要了。如果不小心破坏了母页,书签小工具就是毫无用处的。请注意javascript并不是你唯一需要处理的东西。如果你有一个前端,HTML和CSS也会在页面中运行。不要给你的容器和类取非常普通的名字,比如你把它叫做“container”,我会永远讨厌你。一种简单的方法就是给所有名字添加具有工具特色的特别前缀(或者是后缀)字符串。当你写CSS的时候,需要特别特别的特殊。使用样式很不错,但请使用最高的精度。如果有样式泄漏到主页面上是不合规范的,且会引发不信任。

6、测试,测试,再测试
如果你正创建一个较小的书签小工具,它引用了脆弱的第三方的类库,你可能会碰到永远的噩梦——跨浏览器兼容性问题。看起来很明显但是这是很多人很多时候都会忘记的一点。
另一个陷阱是希望能工作在所有网站上的小工具只工作在几个网站上。网页可以有不同的层次,使用不同的方法论。有些网站可能包含了HTML5并且使用了相关的容器而其它的可能安全起见使用了通用的div标签。在收集信息的时候确保考虑了每一种情况。

Javascript 相关文章推荐
JavaScript 新手24条实用建议[TUTS+]
Jun 21 Javascript
基于jQuery的为attr添加id title等效果的实现代码
Apr 20 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
Sep 02 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
Apr 24 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
实现JavaScript高性能的数据存储
Dec 11 Javascript
Angularjs 动态改变title标题(兼容ios)
Dec 29 Javascript
Vue.js展示AJAX数据简单示例讲解
Mar 29 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
VUE元素的隐藏和显示(v-show指令)
Jun 23 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
Sep 27 Javascript
JS实现的自定义map方法示例
May 17 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
Feb 25 #Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
Feb 25 #Javascript
23个Javascript弹出窗口特效整理
Feb 25 #Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 #Javascript
dojo随手记 gird组件引用
Feb 24 #Javascript
浏览器常用高宽的jquery插件
Feb 24 #Javascript
基于jquery的横向滚动条(滑动条)
Feb 24 #Javascript
You might like
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
php猜单词游戏
2015/09/29 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
Python datetime时间格式化去掉前导0
2014/07/31 Python
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python之super的使用小结
2018/08/13 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
求职信的最佳写作思路
2014/02/01 职场文书
师德师风演讲稿
2014/05/05 职场文书
政府采购方案
2014/06/12 职场文书
党的生日活动方案
2014/08/15 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
欢送领导祝酒词
2015/08/12 职场文书