Latest Publications

JavaScript调试技巧之:快速定位

赶紧总结一下JavaScript的调试技巧,这次首先是“快速定位”篇。

快速定位,其实就是快速定位程序的错误,所以也算是调试。这个在实际的码代码时往往比较实用。大多数情况下,你的js代码不多(少于1000行),只要能迅速发现代码的错误,往往不用复杂的调试。关于常用的快速定位方法,我总结了一下几点,欢迎大家补充。

1. 使用alert

alert其实比较实用。本地调试中,在合适的位置写alert,打出来一些变量,虽然比较土,但是往往事半功倍!另外有一个alert技巧,想看看一个对象中的属性和它的值吗,试试这个:

var str = "", i;
for (i in obj) {
  str += i + ": " +obj[i] + "\n";
}
alert(str);

2. 使用地址栏

(阅读全文…)

提高JavaScript程序的鲁棒性

我是学控制理论出身,一个控制系统的鲁棒性,确实是在做系统设计时需要着重注意的。什么是控制系统的鲁棒性?

所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持某些性能的特性(摘自百度百科……汗)。

在软件设计和开发中,同样也要时刻考虑提高鲁棒性。那么如何提高JavaScript程序的鲁棒性呢?我认为,RIA的鲁棒性,一般来讲,主要跟js的代码规范性和DOM操作有关系。下面我总结几点开发中需要注意的地方,让页面跑不死、不报错。这些事情可能在实际开发中都是小事,但是对于提高软件整体的鲁棒性,是非常critical的!

1. 严禁使用全局变量

唉,这个我可是亲身体会并深受其害啊!话说,当时我修改一个页面,开发一段脚本,需要写cookie。我发现页面上以前有人引用了一个js文件,里面有setCookie函数,好啊,拿来用!结果这个cookie死活都写不对。检查了半天,才发现这个页面引用的另外一个js文件也有一个setCookie函数,函数的参数和刚才那个不一样,而我调用的估计是这个函数!应该是之前的两个同事在同一个页面上自己搞自己的,结果竟然函数重名,而这两个函数都是全局的!设想一下,加入两个人都在全局范围内搞一个var i = 0; 那岂不是更加疯掉。

(阅读全文…)

Web应用程序的beta精神

Gmail的logo上终于没有了Beta字样,于此同时,Google Calendar,Google Docs也脱离了beta。Gmail长达七年之久的开发与测试终于结束。

Gmail最初设计稿的其中一张

Gmail最初设计稿的其中一张(图片来源:TechCrunch)

从2004年的愚人节到现在,Gmail一直beta着。在此期间,Gmail小组又加入了很多创新性、革命性的东西在里面。例如加入了Gtalk,让大家在网页上聊天,甚至后来在网页上视频通话;加入了pop邮件的功能;使用long polling来实时获取新邮件;创新性地用标签,而不是文件夹来分类邮件。这些都是之前的网页开发者很难想象、很难做到的。

不过,更值得一提的是web应用程序的beta精神。Web App和桌面程序不同,有很多因素会影响其稳定性。例如网络环境,例如浏览器的兼容性和浏览器设置等等。事实上JavaScript本身就是一个设计上存在缺陷的语言,浏览器对它的支持也不尽相同,而CSS在不同浏览器下的差异更是让我们费尽脑子。这些因素都让我们无法理直气壮地说自己的web程序没有问题。一个复杂的网页程序,在Firefox下运行正常了,你敢说在IE5.5下运行也正常?你敢说在Konqueror下显示和运行都没有问题?大概正因如此,Gmail一直都没有脱离beta。也就是说,上个世纪的浏览器大战造成的兼容性问题,折磨了Gmail整整7年啊。 (阅读全文…)

由IE一例处理comment节点的bug得到的结论

近期处理一个项目,需要“翻译”页面的注释节点。功能在Firefox下一切正常,项目进行非常顺利。拿到IE全系列下,却非常不正常,把注释翻译成ELEMENT Node,页面立刻飞掉。检查不出来原因,抓狂了好几天。

后来发现,问题出在IE渲染li的时候。我们的项目里,有时候要求注释节点需要插入在li的后面。虽然这不太标准,但是实际应用中,也是没办法的事。IE6+会把注释节点包进li里面,真是无语。

例如页面上的代码:

<ul id="test">
  <!-- comment_begin -->
  <li>asdf</li>
  <li>asdf</li>
  <li>asdf</li>
  <!-- comment_end -->
</ul>

试试document.getElementById(“test”).innerHTML,弹出:

<!-- comment_begin -->
<LI>asdf
<LI>asdf
<LI>asdf <!-- comment_end --></LI>

(阅读全文…)

开发WYSIWYG编辑器可能遇到的问题

最近从头开发了一个简单实用的页面可视化编辑器,感觉从中学到了不少东西。功能就是用一个脚本把前端页面的某些块搞成可以编辑的状态。遇到了几个主要的问题,让我印象最深刻。汇总一下吧:

Firefox 3+开始支持contenteditable属性,这让可视化编辑变得简单。想要“可视化”一个节点,只要给它赋上contenteditable属性即可。如果你想让某一个页面上实现简易的在线编辑功能,那么思路就是:

1. 前端页面,通过JavaScript给需要编辑的节点赋上contenteditable属性,为true。注意这里要用o.contentEditable = “true”,用setAttribute在IE下设置不成功。

2. 用js生成一个按钮工具条,包括一些常用的按钮,例如加粗、修改链接等等。用document.execCommand来执行一些常用的命令,但可用的不多,只有createlink, unlink, bold等。需要的话,还是自己写。

3. 需要弹出对话框的指令,例如修改链接,用行内对话框(inline popup)来实现,不用window.open。一来比较方便,二来可以避免某些浏览器把弹窗block掉。

(阅读全文…)