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 相关文章推荐
JS函数实现动态添加CSS样式表文件
Dec 15 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
Mar 27 Javascript
javascript中的作用域和闭包详解
Jan 13 Javascript
jQuery实现下拉框功能实例代码
May 06 Javascript
jQuery添加options点击事件并传值实例代码
May 18 Javascript
轻松实现jquery选项卡切换效果
Oct 10 Javascript
javaScript嗅探执行神器-sniffer.js
Feb 14 Javascript
Vue 仿百度搜索功能实现代码
Feb 16 Javascript
webstorm+vue初始化项目的方法
Oct 18 Javascript
vue实现路由懒加载及组件懒加载的方式
Jun 11 Javascript
js实现贪吃蛇游戏 canvas绘制地图
Sep 09 Javascript
vant中的toast层级改变操作
Nov 04 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
中国收音机工业发展史
2021/03/02 无线电
php下获取客户端ip地址的函数
2010/03/15 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
Python绘制组合图的示例
2020/09/18 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
Canvas 文本填充线性渐变的使用详解
2020/06/22 HTML / CSS
土木建筑学生自我评价
2014/01/14 职场文书
七一建党日演讲稿
2014/09/05 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书