firebug内置方法集,调试必备

命令行 API按 F1 打开在线 Firebug 帮助

$()返回指定 id 的单个元素

$$()返回与指定 CSS 选择器匹配的元素的数组

$0代表使用查看器选中的最后一个元素

$1代表使用查看器选中的倒数第二个元素

$n()返回使用查看器选中的最后五个元素之一。参数为从 0 开始的序号

$x()返回与指定 XPath 表达式匹配的元素的数组

cd()命令行表达式默认对应于页面的顶层窗口。cd() 可用来在页面顶层窗口和指定框架窗口间切换

clear()清空控制台

copy()复制函数的返回值或者对象到剪贴板

debug()在指定函数的第一行添加断点

dir()打印指定对象所有属性的互动列表。与 DOM 面板中的视图一致

dirxml()打印指定 HTML/XML 元素的 XML 源码树。与 HTML 面板中的视图一致。单击任意节点以在 HTML 面板中查看它

help显示所有可用命令的帮助

inspect()在最合适的面板中查看对象。可以通过第二个参数来指定面板,包括 “html”, “stylesheet”, “script”, 和 “dom”

keys()返回包含指定对象所有属性名称的数组

monitor()打开对指定函数所有调用的日志

monitorEvents()打开指定对象所有事件的日志。可以通过第二个参数来指定只记录特定的事件/事件类型,包括 “composition”, “contextmenu”, “drag”, “focus”, “form”, “key”, “load”, “mouse”, “mutation”, “paint”, “scroll”, “text”, “ui”, “xul”, 和 “clipboard”

profile()开始收集 Javascript 概况。可以通过第二个参数来指定概况报告表头的文本

profileEnd()停止记录 Javascript 概况并打印报告

table()可用于以表格布局记录数组/对象的数组。可以通过第二个参数来指定只记录特定的列/属性

traceAll()traceAll

traceCalls()traceCalls

undebug()移除指定函数第一行的断点

unmonitor()关闭对指定函数所有调用的日志

unmonitorEvents()关闭指定对象所有事件的日志。可以通过第二个参数来指定只停止记录特定的事件/事件类型。

untraceAll()untraceAll

untraceCalls()untraceCalls

values()返回包含指定对象所有属性值的数组

如何做出靠谱的产品来?

1)选择一个正确的市场。一般来说
– 用户有足够强烈的痛点,需要一个创新的解决方案。相比之下,如果你是试图去给用户创造一个新的需求,会困难很多。
– 规模够大,初级用户也能从中受益。如果你的产品面向对象只是高端用户,那么一开始的扩展会有问题。当然,初期要抓住核心用户营销,但是产品的好处一定是要普通用户也能容易享受的。
– 最好是一开始就有明确的盈利方向和能力,否则不可避免依赖VC输血。

2)在初期,坚持minimum viable product,一定要避免overdesign,这样团队才能把有限的精力集中在最关键的事情上。一些产品细节上线之后再调节。

3)给用户至少一个强烈记住你的理由。你的产品可以在其他方面都很烂,但是一定要有至少一个让用户看了觉得wow的地方。

4)UI不是那么重要。除非你能做出path这样让人看了大呼牛逼的UI,否则只要UI不是太差基本上都OK。用户需要的是实实在在的benefit,一开始花太多时间在UI上不划算。

5)调研用户,但是不要通过问卷等死板的方式,也不要追求所谓的统计显著性。多和用户聊天,自己亲自做客服,回答每一份用户邮件,弄个qq群让用户加入,很快你就可以了解什么是用户真正关心的事情。

6)初期的产品设计要简单,但是技术架构和产品架构一定要想长远一点,否则如果你的产品真正爆发了,在飞速发展的时候改底层的架构会烦死人的。

来至: http://www.zhihu.com/question/20186002

解决IE6内存泄露的简短办法

使用 try … finally 结构来使对象最终为 null ,以阻止内存泄露。

其中举了个例子:

  1. function createButton() {  
  2.     var obj = document.createElement(“button”);  
  3.     obj.innerHTML = “click me”;  
  4.     obj.onclick = function() {  
  5.         //handle onclick  
  6.     }  
  7.  
  8.     obj.onmouseover = function() {  
  9.         //handle onmouseover  
  10.     }  
  11.     return obj;//return a object which has memory leak problem in IE6  
  12. }  
  13.  
  14. var dButton = document.getElementById(“d1”).appendChild(createButton());  
  15. //skipped…. 

对于 IE6 中,引起内存泄露的原因,可看《Understanding and Solving Internet Explorer Leak Patterns》一文。

上面的例子,应该属于上文中的 “Closures”原因。

121P35M6-0

再看下用 try … finally 的解决方法:

  1. /**  
  2.      * Use the try … finally statement to resolve the memory leak issue  
  3. */ 
  4. function createButton() {  
  5.     var obj = document.createElement(“button”);  
  6.     obj.innerHTML = “click me”;  
  7.     obj.onclick = function() {  
  8.         //handle onclick  
  9.     }  
  10.     obj.onmouseover = function() {  
  11.         //handle onmouseover  
  12.     }  
  13.  
  14.     //this helps to fix the memory leak issue  
  15.     try {  
  16.         return obj;  
  17.     } finally {  
  18.         obj = null;  
  19.     }  
  20. }  
  21.  
  22. var dButton = document.getElementById(“d1”).appendChild(createButton());  
  23. //skipped…. 

可能大家有疑问: finally 是如何解析的呢?

答案是:先执行 try 语句再执行 finally 语句。

例如:

  1. function foo() {  
  2.     var x = 0;  
  3.     try {  
  4.         return print(“call return “ + (++x));  
  5.     } finally {  
  6.         print(“call finally “ + (++x));  
  7.     }  
  8. }  
  9.  
  10. print(‘before’);  
  11. print(foo());  
  12. print(‘after’); 

 返回的结果为:
print » before
print » call return 1
print » call finally 2
print » true
print » after

更多详细的演示:
《Finally, the alternative fix for IE6’s memory leak is available》

相关的一些讨论:
《Is “finally” the answer to all IE6 memory leak issues?》