Leon's blog

关注: 开源&互联网, GTD with open source and Web

正在浏览 软件开发 里的文章

昨天Sublime Text 2 释出了新的beta版本,2165。除了修正了很多bugs,另外有几个新特性很值得关注了。 首当其冲的是速度方面有了很大的提升,现在启动速度明显快了。看来是想尽快摘掉Beta这顶帽子啊。 重新设计了默认的界面主题, 现在这个主题非常类似soda theme的风格,已经完全不必再安装soda theme扩展了. Auto complete自动补齐功能。自动补齐会使用字典和snippets作为补齐的列表源,速度非常快,不会对你的输入有明显的干扰。对我这样英语不好的同志很有帮助啊,呵呵。这里还有一个小改进,是把Tab键用作自动补齐,而保留Enter键继续作为Enter,而不进行补齐;开启这个功能的选项是auto_complete_commit_on_tab。 通过Ctrl+Shift+T来打开最近关闭的文件,这个行为跟多标签浏览器里打开最近关闭的标签设计一样。又一个扩展Open Recent Files牺牲了。 我升级后,没有发现与现有扩展的明显冲突。喜欢尝鲜的朋友赶快去升级啊。

在上一篇关于Sublime Text 2的文章我提到了可以使用CTags扩展。 使用Sublime Package Control安装CTags扩展很容易。按快捷键”Ctrl+Shift+P”,然后选择安装package,再选择CTags就可以了。 在Linux和Mac上,CTags扩展可以自动生成tags文件,你只需要按下快捷方式”Ctrl+t,Ctrl+b”即可。 其实他就是在当前目录执行了一下”ctags -R -f .tags”命令。 在Windows平台上,我不知道有没有ctags命令,如果没有CTags扩展是没办法起作用的。不过只要能用其他工具生成tags文件,注意tags文件要放在项目的当前目录,并且文件名要是”.tags”. CTags基本上与Vim下的CTaga一致,当光标停在某个函数上时,按下快捷键”Ctrl+Alt+]”,就可以打开函数所在的文件,并跳转到相应位置。 如果要返回之前的位置只需要按下”Ctrl+Alt+[“即可。 由于使用Sublime Package Control安装扩展太方便了,我经常会安装很多。这其实是个不好的习惯,大部分扩展安装以后可能很少用到。 而且可能是Sublime Text 2还比较新的缘故吧,有些扩展之间还会冲突。 比如EncodingHelper跟CTags扩展就有冲突。EncodingHelper会造成CTags只能打开函数所在的文件, 却跳转不到精确的位置。 另外Mac上缺省的CTags似乎并不是那个Exuberant CTags,不知道是什么版本,参数都不一样!所以在Mac上还要先更改CTags,安装步骤如下。

最近使用mediaelementjs做一个iPad上的Html5的video标签的播放器包装. 首先感谢一下mediaelementjs这样的开源项目, 可用度极高, 代码质量明显比我自己写要好多了, 模块化清晰, 许可证很开放(MIT). 开发的过程中遇到了些浏览器兼容问题, 也涉及到一下iPad这样的平板平板设备上的浏览器与桌面浏览器在用户行为设计上的不同的问题. 下面罗列一下: 0. position:fixed 最著名的应该是iOS5之前的版本不支持css的 position:fixed 了吧. 1. 脱离浏览器的视频播放和全屏问题 在手机上, 如iPhone, 浏览器对video标签的处理, 基本上是直接使用系统的媒体播放器播放. 这时由于已经脱离了浏览器, 所以没有办法在播放视频的同时在屏幕上叠加任何显示元素. iPad好一点, 能在页面内直接播放视频, 但是一但用户选择了全屏播放, 则进入iPhone一样的状态. 只有桌面上的Chrome对这个支持的最好, 全屏状态下依然能够叠加浏览器里元素; Firefox逊色些, 全屏并没有全屏显示, 而是把视频充满了当前浏览器窗口. 2. 音量控制问题 在iOS设备上, 浏览器没有办法通过Javascript来操作音量控制, 不管是调节音量大小, 还是静音都不行. 读取当前音量也永远只会得到1. 这又是Apple故意的吧. 3. 剪贴板问题 在iOS设备上, 不能通过Javascript访问系统剪贴板. 用户只能在文字上单击, 调出系统的拷贝粘贴按钮. 要是不想让用户拷贝粘贴倒是有办法, 使用这个CSS. 4. 文本框文字选取问题 在iOS设备上, 不能通过Javascript访问textarea元素的select()来选中该元素的文字, 得到的只不过是把光标移到到了文字的最后位置. 5. 文本框滚动条问题 在iOS设备上, [...]

ECMAScript里关于delete操作符的解释晦涩的很, 实在不是我能理解的. 有兴趣你可以去看看. 实际中使用中, 经常会碰到Javascript变量有时候能成功删除, 有时候却不掉成功删除的情况. 这篇Understanding delete牛文详细解释了, 为什么会这样, 什么样的变量能成功delete, 什么样的不能成功delete. 简而言之, 就是通过”声明“方式创建的变量不能成功删除, 通过”赋值“方式创建的变量能成功删除; 一但一个变量创建后, 它能不能被删除的属性将不会改变. 一个特例是通过eval()函数执行动态代码创建出来的变量,都是可以删除的. 如下面这段代码在Firefox/Chrome/Nodejs里的运行结果如下: Firebug的console里直接定义的变量(不包括在函数里定义的变量), 似乎是因为以eval()的方式在运行代码. 所以通过在Firebug的console里输入代码创建出来的变量,是可以删除的. Chrome等webkit系的浏览器的开发工具没有这个问题. 这一点在调试代码时可能会引起奇怪的现象.

在Web程序员应该知道的Javascript prototype原理里,说到了prototype chain. 但是有一点要特别注明一下, 那就是prototype chain只在对对象的方法和属性调用和读取时有效, 遵循沿着prototype查找方法和属性的规律; 但是在对对象属性进行赋值时, 并不遵循这一规律. 在对Javascript对象的属性进行赋值时, 原则是这样的: 1. 如果该对象本身有这个属性, 则对该属性赋值 2. 如果该对象本身没有这个属性, 则在该对象上新建一个该属性, 并进行赋值. (这时不会通过__proto__属性, 找该对象的prototype, 检查prototype上有没有该属性, 然后在prototype的属性上赋值.) 举个简单的例子: 看console里打出了的对象应该比较清楚. 用对象的数组写法可能更容易理解些.