<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>AJAX论坛最新讨论 - JavaEye</title>
    <description>JavaScript编程、XMLHTTP、AJAX开发、UI设计、Rich Client<br/>
圈子: 
<a href="http://flex2.group.javaeye.com/" target="_blank">Flex</a>
<a href="http://hzjavaeyer.group.javaeye.com/" target="_blank">JS研究</a>
<a href="http://css.group.javaeye.com/" target="_blank">CSS探讨</a>
<a href="http://ext.group.javaeye.com/" target="_blank">EXT</a>
<a href="http://jquery.group.javaeye.com/" target="_blank">JQuery</a>
<a href="http://dojo.group.javaeye.com/" target="_blank">dojo</a>
 - Java编程，Ruby编程，微软.net，AJAX，敏捷软件开发，综合软件技术</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>JavaScript中的继承学习笔记(1)：Crockford uber方法中的陷阱</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lifesinger.javaeye.com">lifesinger</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248933" style="color:red;">http://www.javaeye.com/topic/248933</a>&nbsp;
          发表时间: 2008年10月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文同步发表在<a href="http://lifesinger.org/blog/?p=192" target="_blank">岁月如歌</a>，欢迎讨论交流。<br /><br />先来看 Douglas Crockford 的经典文章：<a href="http://javascript.crockford.com/inheritance.html" target="_blank">Classical Inheritance in JavaScript</a>. 此文的关键技巧是给Function.prototype增加inherits方法，代码如下（注释是我的理解）：<br /><pre name="code" class="javascript">
Function.prototype.method = function (name, func) {
	this.prototype[name] = func;
	return this;
};

Function.method('inherits', function (parent) {
	var d = {}, // 递归调用时的计数器
		// 下面这行已经完成了最简单的原型继承：将子类的prototype设为父类的实例
		p = (this.prototype = new parent());
	
	// 下面给子类增加uber方法（类似Java中的super方法），以调用上层继承链中的方法
	this.method('uber', function uber(name) {
		if (!(name in d)) {
			d[name] = 0;
		}
		var f, r, t = d[name], v = parent.prototype;
		if (t) {
			while (t) {
				// 往上追溯一级
				v = v.constructor.prototype;
				t -= 1;
			}
			f = v[name];
		} else {
			f = p[name];
			if (f == this[name]) {
				f = v[name];
			}
		}
		// 因为f函数中，可能存在uber调用上层的f
		// 不设置d[name]的话，将导致获取的f始终为最近父类的f（陷入死循环）
		d[name] += 1;
		
		// slice.apply的作用是将第2个及其之后的参数转换为数组
		// 第一个参数就是f的名字，无需传递
		// 这样，通过uber调用上层方法时可以传递参数：
		// sb.uber(methodName, arg1, arg2, ...);
		r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
		
		// 还原计数器
		d[name] -= 1;
		
		return r;
	});
	// 返回this, 方便chain操作
	return this;
});
</pre><br />上面d[name]不好理解，我们来创建一些测试代码：<br /><pre name="code" class="javascript">
function println(msg) {
	document.write(msg + '&lt;br />');
}

// 例1
function A() { }
A.prototype.getName = function () { return 'A'; }; // @1

function B() { }
B.inherits(A);
B.prototype.getName = function () { return this.uber('getName') + ',B'; }; // @2

function C() { }
C.inherits(B);
C.prototype.getName = function () { return this.uber('getName') + ',C'; }; // @3

var c = new C();
println(c.getName()); // => A,B,C
println(c.uber('getName')); // => A,B
</pre><br />c.getName()调用的是@3, @3中的uber调用了@2. 在@2中，又有this.uber('getName'), 这时下面这段代码发挥作用：<br /><pre name="code" class="javascript">
while (t) {
	// 往上追溯一级
	v = v.constructor.prototype;
	t -= 1;
}
f = v[name];
</pre><br />可以看出，d[name]表示的是递归调用时的层级。如果不设此值，@2中的this.uber将指向@2本身，这将导致死循环。Crockford借助d[name]实现了uber对同名方法的递归调用。<br /><br />uber只是一个小甜点。类继承中最核心最关键的是下面这一句：<br /><pre name="code" class="javascript">
p = (this.prototype = new parent());
</pre><br /><strong>将子类的原型设为父类的一个实例，这样子类就拥有了父类的成员，从而实现了一种最简单的类继承机制。</strong>注意JavaScript中，获取obj.propName时，会自动沿着prototype链往上寻找。这就让问题变得有意思起来了：<br /><pre name="code" class="javascript">
// 例2
function D1() {}
D1.prototype.getName = function() { return 'D1' }; // @4

function D2() {}
D2.inherits(D1);
D2.prototype.getName = function () { return this.uber('getName') + ',D2'; }; // @5

function D3() {}
D3.inherits(D2);

function D4() {}
D4.inherits(D3);

function D5() {}
D5.inherits(D4);
D5.prototype.getName = function () { return this.uber('getName') + ',D5'; }; // @6

function D6() {}
D6.inherits(D5);

var d6 = new D6();
println(d6.getName()); // => ?
println(d6.uber('getName')); // => ?
</pre><br />猜猜最后两行输出什么？按照uber方法设计的原意，上面两行都应该输出D1,D2,D5, 然而实际结果是：<br /><pre name="code" class="javascript">
println(d6.getName()); // => D1,D5,D5
println(d6.uber('getName')); // => D1,D5
</pre><br />这是因为Crockford的inherits方法中，考虑的是一种理想情况（如例1），对于例2这种有“断层”的多层继承，d[name]的设计就不妥了。我们来分析下调用链：<br /><br />d6.getName()首先在d6对象中寻找是否有getName方法，发现没有，于是到D6.prototype(一个d5对象)中继续寻找，结果d5中也没有，于是到D5.protoype中寻找，这次找到了getName方法。找到后，立刻执行，注意this指向的是d6. this.uber('getName')此时表示的是d6.uber('getName'). 获取f的代码可以简化为：<br /><pre name="code" class="javascript">
// 对于d6来说, parent == D5
var f, v = parent.prototype;
f = p[name];
// 对于d6来说，p[name] == this[name]
if (f == this[name]) {
    // 因此f = D5.prototype[name]
    f = v[name];
}

// 计数器加1
d[name] += 1;

// 等价为 D5.prototype.getName.apply(d6);
f.apply(this);
</pre><br />至此，一级调用d6.getName()跳转进入二级递归调用D5.prototype.getName.apply(d6). 二级调用的代码可以简化为：<br /><pre name="code" class="javascript">
var f, t = 1, v = D5.prototype;
while (t) {
	// 这里有个陷阱，v.constructor == D1
	// 因为 this.prototype = new parent(), 形成了下面的指针链：
	// D5.prototype = d4
	// D4.prototype = d3
	// D3.prototype = d2
	// D2.prototype = d1
	// 因此v.constructor == d1.constructor
	// 而d1.constructor == D1.prototype.constructor
	// D1.prototype.constructor指向D1本身，因此最后v.constructor = D1
	v = v.constructor.prototype;
	t -= 1;
}
// 这时f = D1.prototype.getName
f = v[name];

d[name] += 1;
// 等价为 D1.prototype.getName.apply(d6)
f.apply(this);
</pre><br />上面的代码产生最后一层调用：<br /><pre name="code" class="javascript">
return 'D1';
</pre><br />因此d6.getName()的输出是D1,D5,D5.<br />同理分析，可以得到d6.uber('getName')的输出是D1,D5.<br /><br />上面分析了“断层”时uber方法中的错误。注意上面提到的v.constructor.prototype产生的陷阱，这个陷阱在“非断层”的理想继承链中也会产生错误：<br /><pre name="code" class="javascript">
// 例3
function F1() { }
F1.prototype.getName = function() { return 'F1'; };

function F2() { }
F2.inherits(F1);
F2.prototype.getName = function() { return this.uber('getName') + ',F2'; };

function F3() { }
F3.inherits(F2);
F3.prototype.getName = function() { return this.uber('getName') + ',F3'; };

function F4() { }
F4.inherits(F3);
F4.prototype.getName = function() { return this.uber('getName') + ',F4'; };

var f3 = new F3();
println(f3.getName()); // => F1,F2,F3

var f4 = new F4();
println(f4.getName()); // => F1,F3,F4
</pre><br />很完美的一个类继承链，但f4.getName()没有产生预料中的输出，这就是v.constructor.prototype这个陷阱导致的。<br /><br /><strong>小结</strong><br /><ul><li>在JavaScript中，模拟传统OO模型来实现类继承不是一个很好的选择（上面想实现一个uber方法都困难重重）。</li><li>在JavaScript中，考虑多重继承时，要非常小心。尽可能避免多重继承，保持简单性。</li><li>理解JavaScript中的普通对象，Function对象，Function对象的prototype和constructor, 以及获取属性时的原型追溯路径非常重要。（比如上面提到的constructor陷阱）</li><li>Crockford是JavaScript界的大仙级人物，但其代码中依旧有陷阱和错误。刚开始我总怀疑是不是自己理解错了，费了牛劲剖析了一把，才敢肯定是Crockford考虑不周，代码中的错误是的的确确存在的。学习时保持怀疑的态度非常重要。</li></ul><br /><br /><strong>后续</strong><br /><br />上面的分析花了一个晚上的时间，今天google了一把，发现对Crockford的<a href="http://blog.csdn.net/chensheng913/archive/2006/12/28/1465741.aspx" target="_blank">uber方法中的错误</a>能搜到些零星文章，还有人给出了<a href="http://hax.pie4.us/2006/12/bug-of-douglas-crockfords-uber.html" target="_blank">修正方案</a>（忍不住八卦一把：从链接上看，是CSDN上的一位兄弟第一次指出了Crockford uber方法中的这个bug，然后John Hax（估计也是个华人）给出了修正方案。更有趣的是，Crockford不知从那里得知了这个bug, 如今<a href="http://javascript.crockford.com/inheritance.html" target="_blank">Classical Inheritance in JavaScript</a>这篇文章中已经是修正后的版本^o^）。<br /><br />这里发现的uber方法中的<strong>constructor陷阱</strong>，尚无人提及。导致constructor陷阱的原因是：<br /><pre name="code" class="javascript">
p = (this.prototype = new parent());
</pre><br />上面这句导致while语句中v.constructor始终指向继承链最顶层的constructor. 分析出了原因，patch就简单了：<br /><pre name="code" class="javascript">
// patched by lifesinger@gmail.com 2008/10/4
Function.method('inherits', function (parent) {
    var d = { }, 
        p = (this.prototype = new parent());
        // 还原constructor
        p.constructor = this;
        // 添加superclass属性
        p.superclass = parent;
                
    this.method('uber', function uber(name) {
        if (!(name in d)) {
            d[name] = 0;
        }
        var f, r, t = d[name], v = parent.prototype;
        if (t) {
            while (t) {
                // 利用superclass来上溯，避免contructor陷阱
                v = v.superclass.prototype;
                // 跳过“断层”的继承点
                if(v.hasOwnProperty(name)) {
                    t -= 1;
                }
            }
            f = v[name];
        } else {
            f = p[name];
            if (f == this[name]) {
                f = v[name];
            }
        }
        d[name] += 1;        
        if(f == this[name]) { // this[name]在父类中的情景
            r = this.uber.apply(this, Array.prototype.slice.apply(arguments));
        } else {
            r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
        }
        d[name] -= 1;
        return r;
    });
    return this;
});
</pre><br />测试页面：<a href="/blog/wp-content/uploads/2008/10/crockford_classic_inheritance_test.html" target="_blank">crockford_classic_inheritance_test.html</a><br /><br />最后以Douglas Crockford的总结结尾：<br /><div class="quote_title">引用</div><div class="quote_div"><br />我编写JavaScript已经8个年头了，从来没有一次觉得需要使用uber方法。在类模式中，super的概念相当重要；但是在原型和函数式模式中，super的概念看起来是不必要的。现在回顾起来，我早期在JavaScript中支持类模型的尝试是一个错误。<br /></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248933" style="color:red;">已有 <strong>9</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 04 Oct 2008 21:21:17 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248933</link>
        <guid>http://www.javaeye.com/topic/248933</guid>
      </item>
          <item>
        <title>正则表达式 </title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cscs31.javaeye.com">cscs31</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249251" style="color:red;">http://www.javaeye.com/topic/249251</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如下两段代码：<br /><pre name="code" class="javascript">var r =/^\d{1,4}(.\d{1,2})?$/;
if(!r.test(value)){
 alert("error");
}
</pre><br /><pre name="code" class="javascript">var r = new RegExp('^\d{1,4}(.\d{1,2})?$','g');
if(!r.test(value)){
 alert("error");
}
</pre><br /><br />但是第一段代码是起作用的，第二段不起作用，请大家帮忙。<br /><br />还有就是对于第一种中间的字符，能不能有什么连接符号？
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249251" style="color:red;">已有 <strong>3</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 10:54:18 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249251</link>
        <guid>http://www.javaeye.com/topic/249251</guid>
      </item>
          <item>
        <title>用js写的一个用在手机上的倒计时程序</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tibetjungle.javaeye.com">tibetjungle</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249294" style="color:red;">http://www.javaeye.com/topic/249294</a>&nbsp;
          发表时间: 2008年10月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　申明：这段程序是用在我自己手机上的，所以超级简单。<br /><br />　　前些时候在网上找Moto E6 用的倒计时程序，发现现有的倒计时程序尽是为Windows Mobile设计的，E6可以用的找不到一个。干嘛不自己实现呢？用J2ME实现是不错的想法，但是我没有弄过这个东东。另外想到，E6手机用的不是Opera浏览器吧，为什么不可以用js实现。有了这个想法，开始动手实现。约一个小时后，程序在电脑上调试成功，放到手机上运行，ok！<br /><br />　　现在把这段程序贡献出来，虽然含金量不高，但是已经可以满足大部分需求。各位也可以根据个性化的需要，修改代码。<br /><br />　　文件说明：countdown.css，样式表文件；countdown.js，倒计时的js实现源码；countdown.html，展示文件。<br /><br />　　使用时，只需要修改countdown.html中的如下部分，其余地方无需改动：<br /><pre name="code" class="javascript">&lt;script language='javascript'>
	var year		=	2009;	&lt;!-- any valid year -->  
	var month		=	1;		&lt;!-- from 1 to 12   -->  
	var day			=	25;		&lt;!-- from 1 to 31   -->  
	var hour 		=	23;		&lt;!-- from 0 to 23   -->  
	var	minute	= 59;		&lt;!-- from 0 to 59   -->  
	var second 	= 59;		&lt;!-- from 0 to 59   -->  
&lt;/script></pre><br />　　<br />　　另外，各位xdjm有什么好的idea，欢迎拍砖。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249294" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Oct 2008 12:31:17 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249294</link>
        <guid>http://www.javaeye.com/topic/249294</guid>
      </item>
          <item>
        <title>Adobe Air 应用实践： 乐道“乐宝”</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://koalant.javaeye.com">koalant</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249121" style="color:red;">http://www.javaeye.com/topic/249121</a>&nbsp;
          发表时间: 2008年10月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.likenote.com/air/index.html" target="_blank"><img src="http://www.likenote.com/air/test.jpg" /></a><br /><br />乐道“乐宝”网站： <a href="http://www.likenote.com/air/index.html" target="_blank">http://www.likenote.com/air/index.html</a><br /><br />原文：<a href=" http://blog.csdn.net/koalant/archive/2008/10/05/3016839.aspx" target="_blank"> http://blog.csdn.net/koalant/archive/2008/10/05/3016839.aspx</a><br /><br /><a href="http://www.likenote.com/air/images/cap1.jpg" target="_blank"><img src="http://www.likenote.com/air/images/cap1_thumb.jpg" /></a><br />点击放大<br /><br />“乐宝”是为了解决访问“乐道”的乐友无法收藏自己喜欢的推荐而开发的一个桌面小应用。“乐道”网站 是"少数DJ推荐，多数听众乐友留言"的模式，为了保证推荐品质和服务器性能等原因，以及这种模式决定了 “乐道”短期内将无法开放注册。很多乐友希望乐道开放注册，也仅仅是为了收藏自己喜欢的推荐文章。 “乐宝”的开发也就应运而生。<br /><br />访问 http://www.likenote.com/air/index.html, 点击图片，会弹出安装程序，按照提示将“乐宝”安装到系统中，桌面上会显示一个"likenote"图标。“乐宝”支持 Windows, Mac OS 两种操作系统，未来将支持 linux 。 <br /><br />“乐宝”是采用 Adobe Air 技术开发的一个桌面应用。第一次安装需要先安装 Adobe Air Runtime 环境，所以 在线安装下载比较慢。“乐宝”程序本身只有400多K，以后的更新将会非常快。
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249121" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Oct 2008 19:11:34 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249121</link>
        <guid>http://www.javaeye.com/topic/249121</guid>
      </item>
          <item>
        <title>Flex性能,以及文件大小.</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhengshina5.javaeye.com">zhengshina5</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249135" style="color:red;">http://www.javaeye.com/topic/249135</a>&nbsp;
          发表时间: 2008年10月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>本文介绍一下关于flex性能优化,以及flex生成的的swf大小优化.<br />我也是学了不长时间,有写的不对的,请大家指正,如果大家有这方面好的想法,互相讨论,提出来,共同学习.<br />至于后来和数据库的就先不说了,因为水平有限</p>
<p>as3一出来,flex也跟着火一把,目前学习flex的人也越来越多了,但是国内flex的成品确实是很少.比起国外的是相差太多了.<br />观察了一下现在flex web方面的东西,有2个问题.</p>
<p><br />a.速度太慢.<br />b.生成的文件太大,其实加载的速度慢和这个有关系.<br />c.创意太少.</p>
<p>&nbsp;</p>
<p>A-a.速度太慢,其实速度慢有很多方面,先列举先例子吧,程序有问题,swf文件太大等,这些都是速度慢的原因.还有很多暂时不列出.<br />B-b.生成的文件太大,flex项目刚创建,随便生成一个button,然后观察一下文件的大小,400多K,比较大了吧.就这么一个简单button就这么大.<br />C-c.这个我不想用太解释了,看看国外的网站就明白了.其实并不是创意多就好,但是国内的东西是模仿为主的.自己的产品太少了.(但是也是有的)</p>
<p>&nbsp;</p>
<p>首先先说下Flex项目里程序的性能的调整.</p>
<p><br />a-1.刚开始编写代码的时候,有的时候会把一个对象重复创建2次,这种情况是存在的,你可以去看看你的项目里有没有这样的情况,用不了多长时间.<br />a-2.当做一个click事件时,重复加载了数据,但是页面显示的数据是正确的,这种情况也是存在的.我自己遇到过.这在非debug模式下,一般是不会看出来的,<br />所以要深入下代码进行查询一遍才能看得出代码里面是否有这种问题.<br />a-3.可以去看下 AS3中的数据存取方式效率比较 这篇文章,我认为里面说的很详细了.地址是:http://www.kingda.org/archives/kingda/2007/09/as313as3.html<br />对于几种数据存取方式的正确使用,也会影响flex的性能.<br />a-4.Flex Bulider3里面有一个profile的这么一个工具,我认为这里主要还是去调整一些没有释放的资源的.从这个工具里可以很清楚的看到哪些资源没有被释放掉.<br />a-5.URLLoader这个东西相信大家经常用吧,不过我发现在网上搜索到的代码很少有看到,当complete时,很少有看到close掉这个东西或者=null,我觉得这个是有必要做的.<br />a-6.addEventListener 这个东西,在flex里应该经常用到,但是removeEventListener你想想你使用了嘛,如果没有的话,建议使用上.<br />a-7.有些数字,具体不列举,as3里的类型有Number,int,uint,都可以用.但是这个不能随便用的. Number 数据类型<br />在 ActionScript 3.0 中，Number 数据类型可以表示整数、无符号整数和浮点数。<br />但是，为了尽可能提高性能，应将 Number 数据类型仅用于浮点数，或者用于 int 和 uint 类型可以存储的、大于 32 位的整数值。<br />要存储浮点数，数字中应包括一个小数点。如果您省略了小数点，数字将存储为整数。<br />a-8.有些不必要的东西就不必要写了.比如有一个XML,给你XML的一个节点,让你打印出这个个节点里的所有属性,我当时看到这个问题时,连想都没想.<br />直接while循环,晕,结果是正确,但是浪费资源.E4X,里是可以直接根据节点找到所有属性的.具体可看下cookbook里的关于XML的解释.<br />a-9.代码规范,其实这影响不了多少,但是一个良好的代码规范,是对程序有一定的影响的,我开始写程序时,就不太注意这些,但是后来慢慢发现这个的重要性.<br />a-10.setStyle 这个东西建议最好还是不要使用,因为很消耗资源的.如果不相信的话,自己可以写个例子试一下就知道了.</p>
<p>a-11.FlashType可以内嵌字体,这个东西也会影响性能,我觉得字体用一种就可以了</p>
<p>&nbsp;</p>
<p>a-12.使用timer类的时候是否stop了.这个要注意一下,别一直跑了.</p>
<p>&nbsp;</p>
<p>a-a:策略优化.<br />a-a-1:TabNavigator,ViewStack,这些组件,相信大家也多少都用过或者看过.creationPolicy这个属性不知道大家有没有用过,<br />如果没用过的话,可以看下以下这篇文章 : <a href="http://www.zengrong.net/?p=353">http://www.zengrong.net/?p=353</a> 里面的方式会对性能有影响.<br />a-a-2:应该理解Flex UIComponent里的生命周期.具体可以看下以下文章 : <br /><a href="http://xylffxyfpp.javaeye.com/blog/248946">http://xylffxyfpp.javaeye.com/blog/248946</a>,&nbsp; <br /><a href="http://xinsync.xju.edu.cn/index.php/archives/935">http://xinsync.xju.edu.cn/index.php/archives/935</a><br />a-a-3:做一些数据缓存,具体实现方式有很多用,因人而异.<br />a-a-4:尽量少使用大容器,比如HBox,VBox这些东西不是很好,容器里比较小的就是canvas,这个东西能满足你大部分的需求。<br />a-a-5:大家可以去看下有关于Flex的几种传输方式的性能比较: <a href="http://xinsync.xju.edu.cn/index.php/archives/2162">http://xinsync.xju.edu.cn/index.php/archives/2162</a><br />a-a-6:其实byteArray是个好东西.<br />性能上调整暂时就写这么多,想到其它的再补充一下.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />b.下面是对于文件的大小调整<br />b-1.不管是怎样建立一个flex项目或者是加多少东西,怎么的这个东西生成出来也是得有最少200来K吧,够大,让人很郁闷.<br />b-2.大部分人应该知道RSL这个东西了,如果不知道的话查一下,这个东西其实并不能缩小大小,只是相当于一个cookies吧.也算有一定的用处了.<br />b-3.Flex里有一个export-release-Build的功能,用一下吧,能缩小了文件的的大小.<br />b-4.传输时使用byteArray,进行传输的比较大的内容压缩,也能缩小一些.性能上也有优化.<br />b-5.自己写as脚本,因为as脚本写出来的组件编译后,和自带的编译之后所生成的大小是不同的,可以测试下,我测试过了是不同的.<br />b-6.RSL,我觉得大部分人都是用framework.swf这个自带的,生成之后就什么也不管了,我觉得这样做不算是很好的方法,我建议还是把些东西分出来<br />然后单独去使用,这样的话,加载的速度也很快.如果直接加载一个500多K的东西肯定是慢了,如果分开,10个每次加载50K,速度应该会加快.我是这样认为的.<br />b-7.降低容器的使用率,也就是说,不要把一个页面里放很多容器,太多了不会有好处的,占资源,占文件大小.<br />b-8.还有就是a-1,a-2里说的,都会有影响的.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>文件的大小调整暂时也就想到这些,想到其它的再加上吧.</p>
<p><br />Flex在中国小火一把,但是我认为国内暂时没有多大实力,能开发出像样的东西.</p>
<p><br />一方面是网络速度比较慢,如果性能,加载速度很快的话,那还有可能.</p>
<p><br />二是国内自己的东西没多少,只是模仿(说好点听),说难听点就是抄袭.校内就是一个典型的例子.</p>
<p>&nbsp;</p>
<p>Flex的项目如果能成功,我认为皮肤也算是影响比较重要的地方了.</p>
<p>&nbsp;</p>
<p>如果创意好,皮肤做的漂亮,加载速度快,这些问题都解决了的话,那么说明你的项目已经快成功了.</p>
<p>&nbsp;</p>
<p>最后再预测下SNS的发展,劲舞团还没倒了吧,如果劲舞团倒掉后,那么国内90%的SNS几乎全部倒掉了.个人观点.</p>
<p>&nbsp;</p>
<p>欢迎大家一起讨论Flex as3里的东西,我的QQ:64868686</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249135" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Oct 2008 20:31:04 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249135</link>
        <guid>http://www.javaeye.com/topic/249135</guid>
      </item>
          <item>
        <title>Adobe OpenSource Flex 4每晚构建（Nightly Builds）版本可以下载了</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yulimin.javaeye.com">YuLimin</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249041" style="color:red;">http://www.javaeye.com/topic/249041</a>&nbsp;
          发表时间: 2008年10月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Adobe OpenSource Flex 4（Gumbo）可以开始尝尝鲜了：<br />下载Adobe OpenSource Flex 4<br /><a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4" target="_blank">http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4</a><br /><br />这是每晚构建（Nightly Builds）的版本下载，并非正式版，当中包含了三部分： <br />Adobe Flex SDK <br />Open Source Flex SDK <br />Adobe Add-ons <br /><br />Flex 4目标是要适用于Flash Player 10，可以去下载试用一把。 <br /><br />相关文档：<a href="http://opensource.adobe.com/wiki/display/flexsdk/Developer+Documentation" target="_blank">http://opensource.adobe.com/wiki/display/flexsdk/Developer+Documentation</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249041" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Oct 2008 12:04:23 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249041</link>
        <guid>http://www.javaeye.com/topic/249041</guid>
      </item>
          <item>
        <title>ExtJs框架系列之上传组件</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhw511006.javaeye.com">zhw511006</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/249034" style="color:red;">http://www.javaeye.com/topic/249034</a>&nbsp;
          发表时间: 2008年10月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          效果图如下：
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/249034" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Oct 2008 10:50:04 +0800</pubDate>
        <link>http://www.javaeye.com/topic/249034</link>
        <guid>http://www.javaeye.com/topic/249034</guid>
      </item>
          <item>
        <title>两个 JavaScript 面向对象的方法</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangdong.javaeye.com">yangdong</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248503" style="color:red;">http://www.javaeye.com/topic/248503</a>&nbsp;
          发表时间: 2008年10月02日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><span style="font-size: large">准备工作</span></strong><br /><br />为了演示或者您试验，请先准备好下面的 HTML 模板。<br /><pre name="code" class="html">
&lt;html>
&lt;head>
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
&lt;style type="text/css">
body, body * {
	font: 10pt Arial;
}

.tbl {
	border-style: solid;
	border-width: 1px;
	width: 500px;
	table-layout: fixed;
}

.tbl thead {
	background-color: #555;
	color: #FFF;
}

.tbl tbody td {
	border-style: solid;
	border-width: 1px;
}
&lt;/style>
&lt;script type="text/javascript">
&lt;/script>
&lt;/head>
&lt;body>
&lt;input type="button" value="Insert A Row" />&lt;br />
&lt;input type="text" id="indexText" />
&lt;input type="button" value="Remove A Row" />&lt;br />
&lt;table class="tbl">
	&lt;thead>
		&lt;tr>
			&lt;td>Col A&lt;/td>
			&lt;td>Col B&lt;/td>
		&lt;/tr>
	&lt;/thead>
	&lt;tbody id="tblbody">
	&lt;/tbody>
&lt;/table>
&lt;/body>
&lt;/html>
</pre><br />这个页面包含一个两列的表格。"Insert A Row" 这个按钮意在向此表中添加一行。"Remove A Row"意在从此表中删除一行。在文本框中指定要删除的行号（从一开始索引）。<br /><br /><strong><span style="font-size: large">第一种，基于单个对象</span></strong><br /><br /><pre name="code" class="js">
var tableObj = (function() {
	var count = 0;
	
	var validateIndex = function(index) {
		if (index >= 1 && index &lt;= count) return true;
		return false;
	};
	
	return {
		addRow: function(a, b) {
			if (!a) a = "";
			if (!b) b = "";
			var tblBody = document.getElementById("tblbody");
			var newRow = document.createElement("tr");
			var colA = document.createElement("td");
			colA.innerText = a;
			var colB = document.createElement("td");
			colB.innerText = b;
			newRow.appendChild(colA);
			newRow.appendChild(colB);
			tblBody.appendChild(newRow);
			
			count += 1;
		},
		
		removeRow: function(index) {
			if (!index) index = 0;
			if (!validateIndex(index)) {
				throw "Index out of range: " + index;
				return;
			}
			var tblBody = document.getElementById("tblbody");
			var row = tblBody.childNodes[index];
			tblBody.removeChild(row);
			
			count -= 1;
		}
	};
})();
</pre><br />这种方法被称为块模式（Module Pattern）。最后的“()”会导致那个匿名函数立即执行，从而返回 return 块的对象。这个返回的对象被赋给了 tableObj。其中，count 为 tableObj 的私有成员变量，validateIndex() 函数为其私有成员函数。<br /><br />为了看看效果，将上面的代码放在 &lt;script> 标签之中。然后为“Insert A Row”按钮添加 onclick="insertARow()"，为“Remove A Row”按钮添加 onclick="removeARow()"。最后，在 &lt;script> 标签中再加入下面的两个函数，<br /><pre name="code" class="js">
function insertARow() {
	tableObj.addRow("hi", "hello");
}

function removeARow() {
	var index = document.getElementById("indexText").value;
	if (/^\d+$/.test(index)) {
		index = index / 1;
	} else {
		alert("Not a number");
		return;
	}
	try {
		tableObj.removeRow(index);
	} catch (err) {
		alert(err);
	}
}
</pre><br />这样，按钮的事件响应函数就添加完成了。现在您打开页面，应该就可以试验一下效果了。这种方法的优点是短平快，缺点是复用性较差。当然，这里指的不是 copy-paste 式的复用<img src="/images/smiles/icon_smile.gif"/><br /><br />假设有这样一个用例，还是这个页面，现在我需要再添加一个结构一样的表。难道要我们把上面的代码复制一遍吗？当然不。如果能支持以 new 的方法创建的话是最理想的。下面将介绍的方法基于类型，即构造函数。它是可以支持以 new 的方式创建对象的。<br /><br /><strong><span style="font-size: large">第二种，基于类型</span></strong><br /><br /><pre name="code" class="js">
var TableClass;
(function() {
	/* Private static members
	 */
	var _debug = function(src, msg) {
		if (window.console) {
			window.console.log("[TableClass] " + src + ": " + msg);
		}
	};

	// Constructor
	TableClass = function(tbodyId) {
		TableClass.instances.push(this);
		
		/* Private member fields
		 */
		var count = 0;
		
		/* Private member functions
		 */
		var validateIndex = function(index) {
			_debug("validateIndex()", "count: " + count);
			if (index >= 1 && index &lt;= count) return true;
			return false;
		};

		/* Initializer
		 */
		(function() {
			TableClass.instances.push(this);
		})();

		/* Public member funcitons
		 */
		this.addRow = function(a, b) {
			_debug("addRow()", "count: " + count);
			if (!a) a = "";
			if (!b) b = "";
			var tblBody = document.getElementById(tbodyId);
			var newRow = document.createElement("tr");
			var colA = document.createElement("td");
			colA.innerText = a;
			var colB = document.createElement("td");
			colB.innerText = b;
			newRow.appendChild(colA);
			newRow.appendChild(colB);
			tblBody.appendChild(newRow);
			
			count += 1;
		};
		
		this.removeRow = function(index) {
			_debug("removeRow()", "count: " + count);
			if (!index) index = 0;
			if (!validateIndex(index)) {
				throw "Index out of range: " + index;
				return;
			}
			var tblBody = document.getElementById(tbodyId);
			var row = tblBody.childNodes[index];
			tblBody.removeChild(row);
			
			count -= 1;
		}
	};
	
	/* Public static members
	 */
	TableClass.instances = [];
})();
</pre><br />这样的模式目前我还不知道是否有正式的名称。不过就目前我所知道的，网上各位作者仍然把类似这种基于类型的方法称为块模式。我认为，上面的模式就实现的功能来说是最优秀的。因为它能实现私有成员、私有静态、公有成员及公有静态。我将其称为类模式（Class Pattern）。<br /><br />注意，公有成员函数 addRow() 和 removeRow() 在代码中使用了一个私有成员变量 tbodyId。而只有 TableClass 的构造函数带一个 tbodyId 的参数。就是这个 tbodyId 充当了私有成员变量。如果您觉得这样不好看，也可以在构造函数中加上这样一句话，<br /><pre name="code" class="js">var _tbodyId = tbodyId;</pre><br />然后把那两处引用 tbodyId 的地方改成 _tbodyId。看您的喜好了。<br /><br />将第一个例子改造，添加一个结构相同的表。首先添加 HTML，<br /><pre name="code" class="html">
&lt;table class="tbl">
	&lt;thead>
		&lt;tr>
			&lt;td>Col A&lt;/td>
			&lt;td>Col B&lt;/td>
		&lt;/tr>
	&lt;/thead>
	&lt;tbody id="tblbody2">
	&lt;/tbody>
&lt;/table>
</pre><br />然后初始化两个表对象，<br /><pre name="code" class="js">
var tableObj = new TableClass("tblbody");
var table2Obj = new TableClass("tblbody2");
</pre><br />最后改造按钮的事件响应函数，<br /><pre name="code" class="js">
function insertARow() {
	tableObj.addRow("hi", "hello");
	table2Obj.addRow("hello", "hi"); // added this row.
}

function removeARow() {
	var index = document.getElementById("indexText").value;
	if (/^\d+$/.test(index)) {
		index = index / 1;
	} else {
		alert("Not a number");
		return;
	}
	try {
		tableObj.removeRow(index);
		table2Obj.removeRow(index); // added this row.
	} catch (err) {
		alert(err);
	}
}
</pre><br />OK。现在如果您点击“Insert A Row”应该可以看到两列内容相反但结构一致的表了。为了验证我们的公共静态成员 instances 是否有效，创建一个单独的按钮，<br /><pre name="code" class="js">&lt;input type="button" value="Count table instances" onclick="alert(TableClass.instances.length)" />&lt;br /></pre><br />点击“Count table instances”，结果会显示“2”。<br /><br /><strong><span style="font-size: large">题外话，命名空间</span></strong><br /><br />为了避免全局名字污染，通常我们写的控件都会放一个全局名称之下。像 YUI 的 YAHOO，jQuery 的 jQuery（$），DWR 的 dwr。比如我在 GE，写的控件可能就会以 ge. 开头。命名空间实际上就是借助对象的嵌套来实现，比如<br /><pre name="code" class="js">
if (!dwr) var dwr = {};
if (!dwr.util) dwr.util = {};

dwr.util.escapeHtml = function(...) { ... };
</pre><br /><br /><strong><span style="font-size: large">题外话，选项</span></strong><br /><br />通常一个函数有可选参数的时候，大家会习惯性地将其放在函数签名的末尾。但如果可选参数比较多就不好看了。可以通过这样的方式来提供可选参数，<br /><pre name="code" class="js">
function fun(param1, optionalParams) {
	if (!optionalParams) optionalParams = {};
	...
	if (optionalPrams.timeout) {
		...
	}
}
</pre><br />fun 函数带一个 param1 参数和一个 optionalParams 可选参数。这个 optionalParams 实际上代表了一个可选参数的集合。比如我可以这样调用，<br /><pre name="code" class="js">fun("param1", { timeout: 1000 });</pre><br />DWR 使用类似这样的方式来实现功能丰富的回调，而 jQuery 无疑是这方面最强大的库。结合 jQuery 的变量继承，可选参数的实现变得非常简单。因为通过继承，可选参数的默认值可以很容易地指定。<br /><br /><strong><span style="font-size: medium">参考</span></strong><br /><br /><ul><li><a href="http://yuiblog.com/blog/2007/06/12/module-pattern/" target="_blank">A JavaScript Module Pattern</a></li><li><a href="http://foohack.com/2007/08/yui-crockford-module-pattern-vs-prototypes-class-function/" target="_blank">YUI’s “Module Pattern” vs. Prototype’s Class Function</a></li><li><a href="http://blog.trendics.com/development/advantages-of-using-the-module-pattern-javascript-classes/" target="_blank">Advantages of using the Module Pattern to Structure Javascript Classes</a></li></ul>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248503" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 02 Oct 2008 07:06:20 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248503</link>
        <guid>http://www.javaeye.com/topic/248503</guid>
      </item>
          <item>
        <title>flex中的arrayCollection中的获得索引竟然是引用比较</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wzhxhj.javaeye.com">wzhxhj</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248271" style="color:red;">http://www.javaeye.com/topic/248271</a>&nbsp;
          发表时间: 2008年09月30日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在代码中，想得到arrayCollection中的一个值得索引，用了一个它的方法arrayCollection.getIndexAt(obj:Object);<br />原以为轻易搞定，没想到运行老出错，后来才发现不是简单的对象的值比较，是引用比较，感觉不怎么好用
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248271" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 30 Sep 2008 21:10:15 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248271</link>
        <guid>http://www.javaeye.com/topic/248271</guid>
      </item>
          <item>
        <title>免费使用天涯.只看楼主，一个小小的bookmarklet</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zjlovezj.javaeye.com">zjlovezj</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248223" style="color:red;">http://www.javaeye.com/topic/248223</a>&nbsp;
          发表时间: 2008年09月30日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在天涯上看帖，发现精华与水贴并存，每每被那些刷屏者弄的不甚其烦，又或者帖子太热，寻找作者的跟帖像大海捞针。。。。<br /><br />于是做了一个小小的bookmarklet，希望能为大家节省时间。<br /><br />版本： 0.1 @ 2008.9.30<br /><br />环境：<br />Firefox 3 (F2没有试过)<br />JQuery 1.2.6 (无需安装)<br />注：由于IE的bookmarklet能存的字符太少，通过引用url的方式为免太慢，所以未做IE的。<br /><br />需求：<br />//第一次点击：默认第一位是楼主：加粗，打上authorMark，加css("display","block")<br />//第二次空白点击：对非楼主进行隐藏<br />//第二次输入点击：删除以前的authorMark，再对非输入的隐藏或显示<br />//第三次空白点击：对非楼主进行显示（还原）<br />循环。。。<br /><br />使用：<br />请访问http://zjlovezj.javaeye.com/blog/248224<br />将页面上一个“天涯.只看楼主”的链接拖到bookmark工具栏，在天涯的帖子页面单击bookmark。<br />（不太会用帖子的url，好像用它做不了bookmarklet）<br /><br />代码：<br /><pre name="code" class="js">
先引入jQuery

if(jQuery("#seeThisUser").length == 0){
	jQuery("#firstAuthor td").eq(1).append("  &lt;font color='red'>只看此人:&lt;/font>&lt;input id='seeThisUser'>&lt;/input>");
	var iset = jQuery("#seeThisUser").offset();

	jQuery("#firstAuthor td").eq(1).append("&lt;select id='authorSelect' onclick='__ty_vip.fn_look_by_writer_focus(this)'  >&lt;/select>&lt;input type='button' onclick='jQuery.filterLouzhu()' value='确定'/>");

	//一下几行代码感谢：http://www.deeka.cn/read.php/193.htm
	var inputerId = 'authorSelect';
	jQuery("select[id='authorSelect']").width(jQuery('#seeThisUser').width() + 4 + "px");
	
	jQuery("select[id=" + inputerId + "]").css({position:"absolute",
			left:function(){return iset.left - 25;},
			top:function(){return jQuery.browser.msie?iset.top:iset.top + 2 +"px"},
			clip:"rect(1px " + (jQuery("select[id=" + inputerId + "]").width() + (jQuery.browser.msie?6:8) + "px") + " " + (jQuery("select[id=" + inputerId + "]").height() + (jQuery.browser.msie?1:2) + "px") + " " + (jQuery("select[id=" + inputerId + "]").width() - 15 + "px") + ")",
			"font-size":jQuery("#seeThisUser").css("font-size")
		});
		
	jQuery("select[id='authorSelect']").change(function(){
			var nameStr = jQuery("option:selected",this).html();
			nameStr = nameStr.replace(/\(.*\)/g, "");
			jQuery("input[id='seeThisUser']").val(nameStr);
		});


}	
var louzhu;
jQuery.extend({
	filterLouzhu: 
		function(){

			if(jQuery("#seeThisUser").val().trim() == '' || jQuery("#seeThisUser").val() == null){
				louzhu = jQuery("#firstAuthor a").text();
			}else{
				louzhu = jQuery("#seeThisUser").val().trim();
				jQuery("table").removeClass('authorMark');
				jQuery("#pContentDiv div.content table").css('display','block');
				jQuery("#pContentDiv div.content table").next().css('display','block');
			}
			
			jQuery("table:contains('"+louzhu+"')").addClass('authorMark');
			
			if(jQuery(".content").attr('modify') != "true" ){
				var contentStr = jQuery('.content').get(0).innerHTML;
				contentStr = "&lt;div>"+contentStr+"&lt;/div>";
				contentStr = contentStr.replace(/&lt;table/g,"&lt;/div>&lt;table");
				contentStr = contentStr.replace(/&lt;\/table>/g,"&lt;/table>&lt;div>");
				
				jQuery('.content').get(0).innerHTML = contentStr;
				jQuery('.content').attr('modify','true');
			}
			
			jQuery("#pContentDiv div.content table.authorMark").each(
				function(){
						jQuery(this).next().css('font-weight','bold');
				}		
			);
							
			jQuery("#pContentDiv div.content table:not(.authorMark)").each(
				function(){
						if(jQuery(this).css("display") == "block"){
							jQuery(this).next().css("display","none");
							jQuery(this).css("display","none");
						}else{
							jQuery(this).next().css("display","block");
							jQuery(this).css("display","block");
			  }
	 	  });

	 	  jQuery("#seeThisUser").focus();
	}
});

jQuery.filterLouzhu();
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248223" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 30 Sep 2008 15:08:02 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248223</link>
        <guid>http://www.javaeye.com/topic/248223</guid>
      </item>
          <item>
        <title>ExtJs 2.2 一个按钮可以添加多个click事件</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://badboy560.javaeye.com">badboy560</a>&nbsp;
                    链接：<a href="http://www.javaeye.com/topic/248194" style="color:red;">http://www.javaeye.com/topic/248194</a>&nbsp;
          发表时间: 2008年09月30日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="js">
grid.getSelectionModel().on('rowselect', function(sm, rowIdx, r) {
			var btnDel = Ext.getCmp('btn_admin_del');
			if (btnDel.disabled)
				btnDel.enable();			
			btnDel.on('click',function() { //当我单击数次GridPanel后，它会弹出你单击GridPanel次数的Window
				var name = r.get('adminName');
				var id = r.get('adminId');
				var fpAdminDel = new Ext.form.FormPanel({
					labelWidth : 75,					
					frame : true,
					bodyStyle : 'padding:5px 5px 0',
					width : 350,
					bodyStyle : 'padding:5px 5px 0',
					buttonAlign : 'center',
					defaults : {
						width : 230
					},
					defaultType : 'textfield',
					ctCls : 'font-size:12px',
					items : [{
								id : 'txt_admin_del',
								name : 'adminPass',
								fieldLabel : '密码',
								inputType : 'password',
								allowBlank : false,
								blankText : '请输入密码'
							}],
					buttons : [{
								text : '确定',
								handler : function() {
									if (fpAdminDel.getForm().isValid()) {
										fpAdminDel.form.doAction('submit', {
													url : '/drugstore/back/admin.do',
													waitTitle : '删除用户',
													waitMsg : '正在处理数据...',
													method : 'post',
													params : {
														action : 'del',
														adminId : id
													},
													success : function(form,
															action) {
														Ext.Msg.alert('消息',
																'删除用户成功！');
														adminWindowDel.close();
													},
													failure : function(form,
															action) {
														Ext.Msg.alert('消息',
																'密码错误！');
													}
												});
									}
								}
							}, {
								text : '取消',
								handler : function() {
									adminWindowDel.close();
								}
							}]
				});
				var adminWindowDel = new Ext.Window({
							title : '删除用户:' + name + '如果密码正确,在点击确认后删除',
							width : 350,
							collapsible : true,
							draggable : false,
							resizable : false,
							modal : true,
							border : false,
							items : [fpAdminDel]
						});
				adminWindowDel.render(document.body);
				adminWindowDel.show();
			});
		});
</pre><br />解决办法<br />把<pre name="code" class="js">btnDel.on('click',function() {})</pre><br />修改为<pre name="code" class="js">btnDel.setHandler(function(){})</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://www.javaeye.com/topic/248194" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 30 Sep 2008 12:29:00 +0800</pubDate>
        <link>http://www.javaeye.com/topic/248194</link>
        <guid>http://www.javaeye.com/topic/248194</guid>
      </item>
      </channel>
</rss>