Twitter盈利模式

2009-5-8 评论(1) 分类:互联网 Tags:

200732821440960

Twitter是当今互联网最热门的应用,并且热度还在不断攀升,从google trends可以看出Twitter的上升趋势几乎成J字型

Twitter目前用户数约2000万,并以月增长近100%的速度疯长,而且用户粘性很高。虽然持续热门,用户数众多,但事实上,Twitter还没收入过一分钱,所有的资金都来自风险投资。

Twitter赚不了钱吗?事实上,外界不断在为这个互联网新宠出盈利的点子,许多是可行的,但Twitter迟迟不见其盈利模式。个人觉得原因有下:

1.首要任务是搞好底层服务,让Twitter稳定运行。因为Twitter之前不断出现当机,一直被人所诟病,现在在国内访问Twitter速度也是比较慢,首要解决的是这些问题。

2.做好实时搜索,Twitter是关于数据的网站,如何整合处理这些数据是网站的核心问题,搜索就是处理这个核心问题的主要工具。google想收购Twitter也是为了它的实时搜索。实时搜索做好了,可以挖掘出潜在的盈利模式。

3.Twitter正处于疯长期间,开始实施盈利模式可能会放缓增长速度。先全力争取用户数量,用户数是衡量Twitter价值的标准之一,有了大量的用户,才能有盈利的保证。

4.没有完美的盈利模式,还需研究和试验

所以,Twitter暂时不会推出盈利模式,而它的投资者也说了,对Twitter有足够的耐心,就目前来看,Twitter并不缺乏盈利方法。

就投放广告而言,有以下几种:

1.侧边栏广告

Twitter侧边栏有一个推荐第三方应用的方框,如果把这个方框换成广告,或者再增加一个方框放置广告,估计所有的用户都不会有意见。

侧边栏的广告可以像google adsense,对页面出现的文字进行分析再投放相应的广告。

这会比google adsense 更有成效,因为Twitter页面上的文字都是自己和好友发送的信息,用户更有兴趣。例如好友发送了一条关于kindle阅读器的消息,这时你刚好看到侧边栏出现了关于kindle介绍和购买的连接,很可能就会去点击。

但这个的问题是,很多Twitter用户并没有上Twitter.com网站,而是用各种第三方工具如TweetDeck发送和接收消息,这些人就看不到广告。

2.插播广告

在你或你的好友发送一条有特殊关键字的消息,比如iphone,可以让系统自动向你广播另一条带有Iphone的广告。

这与上面说的侧边栏成效差不多,不同的是,所有用Twitter第三方应用接受和发送信息的用户都可以看到这条广告。

不过这可能会引起用户的厌烦,使用的可能性不大,若真做,需要控制好发送的频率。

3.搜索嵌入广告

Twitter搜索具有跟GOOGLE不一样的价值,例如在火箭和湖人的比赛中,想知道大家对这场比赛的反应,那么在twitter搜索Rocket, Laker, Kobe等会出现大家对这场比赛实时的评论,因为搜索的即时性,在很多方面,twitter的搜索比google的搜索更有用。

随着Twitter用户数量的增多,用Twitter进行搜索的人数量不少,所以可以在搜索里嵌入广告。形式可以跟google等搜索引擎相同,即与搜索关键词相关联。

非广告的盈利模式,可行的比较少。

1.增值服务

类似QQ,在提供基本的聊天功能之外提供如QQ秀这样的增值服务,Twitter可以为收费的用户提供更好的个人页面,或者提供其他更多的功能。但似乎美国人对个人页面的外观并不感冒,可行性并不怎么好。

2.向第三方应用收费

第三方应用也有盈利的可能,对盈利的应用,Twitter可以向其收取一定的费用,但操作起来很困难,开发者也会有意见。

3.出售数据分析

对想利用Twitter进行营销的人/公司提供有用的数据,分析哪些用户是目标对象,让营销者可以批量follow这些用户。

4.付费follow

如下图,付费$x才能加其为好友,但需要这个人的Twitter十分有价值,才会有人愿意买。同时这也破坏了Twitter的信息免费共享的原则,不太可能实现。

fry-part

所能想到盈利模式就只有以上几点。Twitter最终有可能没有出现任何商业模式,而是被其他公司收购,最近就传苹果会以7亿美元收购Twitter,似乎被收购的可能性,还是挺大的。

这是我的Twitter页面,欢迎follow

10点

2009-5-2 评论(1) 分类:生活 Tags:

1.感觉医院是在治好病的情况下,把利益最大化,特别是私人医院。医生给病人开处方,都能拿到其中N%的收入。铜臭味浓重。
2.有事进医院的时候,才会感受到医疗保险的重要。
3.又爆发流感,猪流感,甲型H1N1,香港已有,与其同机的乘客也来了广州,希望不会蔓延到广东,希望不会像SARS那样严重。
4.瘟疫、病毒摧残人类似乎没停止过,不知什么时候,医学在这方面才能有突破。
5.生活中最难的题目是选择题,因为选错了,你会不断懊悔没有选择更好的一个。
6.我又想起以前写的忧虑层次的问题,我们还是生活在最低层次的忧患上,珍惜幸福。
7.两个人感情的事,似乎别人是无法完全理解的。
8.社会的不公平到处存在,要适应。普通人工作辛苦,国家单位的人轻松享受,怎么有点集体的剥削与被剥削的味道
9.无形的价值一直都会被忽略,对一些事情不应该也不可能计算得准确,不要计较。
10.活着,live for now

使用javascript验证、发送饭否信息

2009-5-2 评论(1) 分类:技术文章 Tags:

想做点东西练练javascript,于是打算为饭否AIR客户端爱饭加上额外的功能,例如上传图片等,先尝试了使用javascript验证和发送饭否消息,仅这个就花了不少时间,很多时间花在了去除低级错误上,例如jquery ajax的type:”post”被我写成了method:”post”,花了很多时间才找出来。

先放上主要代码,使用jquery框架以及jquer.base64插件:

var name = "yourname";
var pass = "yourpassword";
$.ajax({
    url: "http://api.fanfou.com/statuses/update.xml",
    type:"POST",
    data: "status=信息内容",
    beforeSend: function(xhr){
    xhr.setRequestHeader('Authorization', 'Basic ' + $.base64.encode(name + ':' + pass));
  },
  success: function(data, textStatus){
    alert(data);
  }
});

有两个主要问题:

1.验证用户

饭否API验证方式为 HTTP Basic 验证,需要对“用户名:密码”进行base64编码,添加进ajax请求的http头信息。
XMLHttpRequest.setRequestHeader(‘Authorization’, ‘Basic ‘ + $.base64.encode(name + ‘:’ + pass));
使用饭否需要验证的API(例如读取私信、发送消息)时,都要在请求前加上这一条HTTP头信息。

爱饭使用YUI框架,可以通过YAHOO.util.Connect.initHeader设置每次ajax请求的默认HTTP头信息,
initHeader(‘Authorization’, ‘Basic ‘ + Base64.encode(name + ‘:’ + pass), true);
最后一个参数”true”代表设为默认http头信息。
设置之后每次使用YAHOO.util.Connect.asyncRequest进行ajax请求都不需要再添加验证。

2.跨域问题

使用ajax请求资源总有跨域问题,即请求只能发生在相同的域内。
以上那段代码请求的域为api.fanfou.com,如果放在网上,除非放在饭否服务器,有相同的域,否则无法运行。
对本地网页,在跨域上,不同浏览器有不同规则,IE允许跨域访问,firefox与chorme都不行。以上代码放在本地,用IE打开,就可以运行,用firefox打开,会出现Access to restricted URI denied” code: “1012。

使用IE可以通过设置可信任站点实现跨域获取内容,其他跨域方法网上很多,还未细究,但都是要在客户端设定或者两站互相配合。

所以,使用javascript发送饭否消息只适合运用在AIR程序上,AIR有自己特定的安全沙箱,允许跨域请求。

另,饭否与Twitter的API几乎一样,可直接套用。

P.S 早上起来,发现已经有人对爱饭扩展,做了查看上传的图片的功能,他还在做上传图片的功能,我也没必要再做这部分功能了。开源的好处之一,就是有很多人帮忙完善这个程序啊~

又是一篇没主题的日志

2009-4-30 评论(0) 分类:生活 Tags:

除了做PHP的兼职,最近似乎又回到无所事事的状态了,在网上看看博客,看看教程,在当当网买了本书,《ajax设计模式与最佳实践》,三天了还没到,这本书电脑里有英文版,但太晦涩了,看它讲的内容我也不懂,就买了。很多javascript、php的书来来去去讲的都是那些,基本上都没什么用,入门靠书,提高应该就是靠实践了。

我之前想,专注学习php和javascript,以后找工作就找跟这两个有关的职位,专才能精,精才能找到工作,最近发现这个想法并不怎么正确,JAVA这航空母舰,还是有必要了解它的,怎么说也是学计算机的,总不能停留在应用层,底层的一些原理有必要了解,也有兴趣去了解。但底层到像《计算机组成原理》那样,我就没兴趣去了解了。

这学期的课程虽然多又重要,但似乎上的课一学期比一学期少,班里大部分人也没什么激情去上课了,相当颓,花费在课程上的时间应该不到1/5,包括上课的时间。

刚开学时就跟一个人在说做一个小型服装系统的事,我写了分粗略的计划给他,三四个星期前他来华师跟我面谈了,来了才知道他是以前教信的师兄,本以为人都来了,这个项目就确定做了,前一两个星期也想好了数据库,打算用ThinkPHP框架做,顺便学下MVC模式,不料原来他们公司还找了其他几个团队同样写系统策划,谁好谁便宜就叫谁做,让我改好策划方案给他。嗯,前两天交给他了,但这个项目接手的希望不大。

对这个服装系统花了挺多时间的,数据库的设计想了很久,主要是储存编码和编码的属性,要根据编码提取出相关的属性,最后想出来了,在脑袋中是可以运行,实际会碰到什么问题就不知道了,还没进行实践。其他如尝试ThinkPHP,了解需求,写策划都花了不少时间,我觉得就算接不了项目,这些时间花得还是值得的。那次他来华师聊了一点企业相关的事情,对我还是有挺大影响的,至少视野应该扩大了一点点,不会整天闷在一堆代码里。了解用户需求、写软件策划书,都是第一次,虽然写得并不正式,但自我感觉还是不错的。

各人有各人的烦恼,就算我现在活得很好,有时还是会有些小烦恼,甚至会迷茫,要干啥呀。不知道。

多久没有好好看一部电影了,这学期以来似乎就没看过,都忘记看电影是什么感觉了。急躁了,无法静下来,无法安静地在电脑前坐2个小时。确实急躁了。

越发觉得,人的惯性是很强的,无论一个人得到多少,就算是当了皇帝,中了头彩N千万,在开头的适应期过后,很快会习惯所拥有的东西,然后忽视它,继续渴望那些没有拥有的东西,渴望的东西得不到,烦恼就开始了。所以如果人不知足,就永远会有烦恼。以前提倡创新作文的时候,看到有个小伙子写“不知足常乐”,理由当然是不知足就有动力去追求更多的东西从而得到更大的快乐。对吗?某种情况下也许是对的,前提是追求的过程是快乐的。是不是不断地追求,得到更多的东西,就能“常乐”?根据刚才说的,当然不是。“知足常乐”才是真理。

瞥见日历,原来是4月最后一天了,五一快来了。给我的感觉还是:放不放假一个样。

Just Write Down

2009-4-15 评论(2) 分类:生活

Recently, I’m living  in  ordinary days. I felt nothing special, just staying in school, attending class, skipping class, and sitting in front of the computer. Saturday and Sunday are the same as other days in my mind, nothing difference.  I didn’t  have so much pressure,  and lack of enthusiasm.

Previously, I just wanted to learn the skill of website development for I can find a good job after graduate. Of course, I’m interested in it too. Afterwards, I found that society is farer away than that. maybe I have just seen the tip of an iceberg. I realize what kind of skill is useful in society. They are like communication and flexible mind. unfortunately, I’m not good at this kind of skill.

Many people told me that personal network is important。one  should try to be friends  with more and all kinds of people. But I haven’t do that frequenly. I seldom make friends initiatively. Those guys who I had contacted with before are not so  familiar. while time passed, we just became stangers.

In this few days, sometimes I feel lazy to coding and  just browse website and blog, and didn’t know what should I do and  feeling wasting of time.  But what’s wasting of time? Is studing all days, working all days, improving ourselves, preparing for the future, that is  so  called “I haven’t wasted  of time”? I don’t know, I think that living is just living.  hard learning is always right, but sometimes considering too much about future is unnecessery。The  future is  full of uncertain  things. It’s hard to prepare. We should just live for nowadays instead of living for future.

Writing in English is hard for me, but it seems that I should learn writing and chating in English, not just reading.

[翻译]改善你的jquery—25条jquery实用技巧<二>

2009-4-12 评论(3) 分类:技术文章 Tags:

上一篇: 改善你的jquery—25条jquery实用技巧<一>

11.适当地使用动画效果

我第一次使用jQuery的时候就喜欢上了像slideDown()、fadeIn()等这些预定义的动画函数,使用它们可以很简单地做出很酷的动画效果。jQuery的animate()函数的强大和易用让人很容易进一步实现更好的效果,事实上,如果你看了jquery的源代码你会发现fadeIn()、slideDown()等这些函数的内部都使用了animate()函数,它们只是让animated()更易使用。

slideDown: function(speed,callback){
return this.animate({height: &quot;show&quot;}, speed, callback);
},

fadeIn: function(speed, callback){
return this.animate({opacity: &quot;show&quot;}, speed, callback);
}

animate()函数只是简单地接收所有的CSS属性,平滑地把属性从一个值转换到另一个值,形成动画。你可以使用它平滑地改变任何你想改变的属性,如width, height, opacity, background-color, top, left, margin, color, font-size等等。

下面这段简单的代码实现了当鼠标放在菜单上时菜单上所有列表元素的高度都平滑地改变到100px。

$('#myList li').mouseover(function() {
$(this).animate({&quot;height&quot;: 100}, &quot;slow&quot;);
});

animation函数不像jquery的其他函数,它是自动队列的,即如果你想在一个效果执行完后接着执行另一个效果,只需要连续使用两次animate函数,无需任何回调。

$('#myBox').mouseover(function() {
$(this).animate({ &quot;width&quot;: 200 }, &quot;slow&quot;);
$(this).animate({&quot;height&quot;: 200}, &quot;slow&quot;);
});

如果你想让两个动画同时执行,把参数放在一个object里,调用一次即可:

$('#myBox').mouseover(function() {
$(this).animate({ &quot;width&quot;: 200, &quot;height&quot;: 200 }, &quot;slow&quot;);
});

你可以传入值是数字的属性形成动画,如果要传入非数字的属性,那就要使用插件,例如平滑过渡颜色效果的插件:Color Animations

12.学习事件委托

使用jQuery可以很容易地为DOM元素绑定事件,但如果绑定太多事件会让程序效率降低,事件委托可以让你可以让你绑定更少的事件但达到同样的效果,解释事件委托最好的办法是通过例子:

$('#myTable TD').click(function(){
$(this).css('background', 'red');
});

这是一个简单的函数,为表格的所有单元格绑定事件,当鼠标点击单元格即变红色,假设表格有50行10列,那么总共绑定了500个事件。如果我们能值为table绑定一个事件,让事件处理函数找出所点击的单元格,再让它变成红色,那是再好不过的了。事实上,这就是事件委托,也是我们接下来要做的:

$('#myTable').click(function(e) {
var clicked = $(e.target);
clicked.css('background', 'red');
});

参数”e”包含了所有关于event信息,包括了实际接收鼠标点击的元素,我们所需要做的就是检查鼠标点击的是哪个单元格,非常简洁。

事件委派还有一个好处。当你为一个块(表格、列表或div块等)里所有的元素绑定事件,当增加元素到这个块里,新增加的元素并不会自动绑定事件,如果使用事件委托,事件绑定后即使新增加元素也可以正常工作。

13.用class保存状态

这是html块保存状态最基本的方法,jQuery擅长通过class操纵元素,因此如果你想储存状态信息,为什么不创建一个额外的的class去保存它呢?

这是一个例子,我们想创建一个可展开的菜单,点击按钮时如果面板是关闭的,则调用slideDown(),如果是打开着则调用slideUp(),先看看HTML:

&lt;div class=&quot;menuItem expanded&quot;&gt;
   &lt;div class=&quot;button&quot;&gt;
        click me
    &lt;/div&gt;
    &lt;div class=&quot;panel&quot;&gt;
        &lt;ul&gt;
            &lt;li&gt;Menu item 1&lt;/li&gt;
            &lt;li&gt;Menu item 2&lt;/li&gt;
            &lt;li&gt;Menu item 3&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/div&gt;
&lt;/div&gt;

很简单,我们添加一个额外的class属性,目的只是为了说明元素现在的状态。添加后,我们要做的只是添加鼠标点击时执行slideUp()和slideDown()的事件处理函数。

$('.button').click(function() {

var menuItem = $(this).parent();
var panel = menuItem.find('.panel');

if (menuItem.hasClass(&quot;expanded&quot;)) {
menuItem.removeClass('expanded').addClass('collapsed');
panel.slideUp();
}
else if (menuItem.hasClass(&quot;collapsed&quot;)) {
menuItem.removeClass('collapsed').addClass('expanded');
panel.slideDown();
}
});

这是个很简单的例子,只作演示用,通过添加额外的class,你可以储存各种各样的值在HTML元素里。

然而,大多数情况下,使用下一条技巧里的方法更好。

14.使用jQuery的内部函数data()储存状态

jQuery有个内部函数data()可以用来在任何DOM元素上储存键/值形式的数据,因为一些原因,这个函数并没有很好的文档说明。储存数据就像下面写的这样简单:

$('#myDiv').data('currentState', 'off');

我们可以改良上一个例子的程序,我们仍然使用同样的HTML(但去掉class”expanded”),使用data()储存状态:

$('.button').click(function() {

var menuItem = $(this).parent();
var panel = menuItem.find('.panel');

if (menuItem.data('collapsed')) {
menuItem.data('collapsed', false);
panel.slideDown();
}
else {
menuItem.data('collapsed', true);
panel.slideUp();
}
});

我想你会同意,这样写比之前更简洁。要了解更多关于data()与removeData(),看这里:jQuery internals

15.创建自定义选择器

jQuery有很多内置的选择器可以通过id、class、标签、属性等查找元素,但如果你想通过其他jQuery里没有的方式查找元素,该怎么做?

或许可以在选择之前为元素添加一个class属性再进行选择,但其实扩展jQuery写新的选择器并不难。下面我们通过例子来说明:

$.extend($.expr[':'], {
over100pixels: function(a) {
return $(a).height() &amp;gt; 100;
}
});

$('.box:over100pixels').click(function() {
alert('The element you clicked is over 100 pixels high');
});

第一部分代码创建了一个新的选择器,用来查找高度大于100像素的元素。第二部分代码使用这个新选择器为所有符合条件的元素添加click事件。

关于自定义选择器在这里就不多说了,你可以上google搜索“custom jquery selector”,肯定能找到很多很好的例子。

16.合理化你的HTML,并在页面载入的时候修改它

这个标题看起来似乎没什么意义,但实际上这个技巧不仅可以让你的代码变得整洁,还可以减少页面的大小,对SEO也有帮助。看看下面的HTML:

&lt;div class=&quot;fieldOuter&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
        &lt;div class=&quot;field&quot;&gt;This is field number 1&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;errorBar&quot;&gt;
        &lt;div class=&quot;icon&quot;&gt;&lt;img src=&quot;icon.png&quot; alt=&quot;icon&quot; /&gt;&lt;/div&gt;
        &lt;div class=&quot;message&quot;&gt;&lt;span&gt;This is an error message&lt;/span&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;fieldOuter&quot;&gt;
    &lt;div class=&quot;inner&quot;&gt;
        &lt;div class=&quot;field&quot;&gt;This is field number 2&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;errorBar&quot;&gt;
        &lt;div class=&quot;icon&quot;&gt;&lt;img src=&quot;icon.png&quot; alt=&quot;icon&quot; /&gt;&lt;/div&gt;
        &lt;div class=&quot;message&quot;&gt;&lt;span&gt;This is an error message&lt;/span&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

上面是一个表可能的结构,为了作为例子稍微做了下修改,我想你一定会觉得上面这段代码十分难看,如果表里有很长的内容,页面将会很长,重复元素也很多。如果只是放下面这段代码到你的页面,会更好:

&lt;div class=&quot;field&quot;&gt;This is field 1&lt;/div&gt;
&lt;div class=&quot;field&quot;&gt;This is field 2&lt;/div&gt;
&lt;div class=&quot;field&quot;&gt;This is field 3&lt;/div&gt;
&lt;div class=&quot;field&quot;&gt;This is field 4&lt;/div&gt;
&lt;div class=&quot;field&quot;&gt;This is field 5&lt;/div&gt;

我们需要做的只是使用jQuery做一点点处理,把之前那些需要重复的的HTML代码加进来,像这样:

$(document).ready(function() {
    $('.field').before('&lt;div class=&quot;fieldOuter&quot;&gt;&lt;div class=&quot;inner&quot;&gt;');
    $('.field').after('&lt;/div&gt;&lt;div class=&quot;errorBar&quot;&gt;&lt;div class=&quot;icon&quot;&gt;
        &lt;img src=&quot;icon.png&quot; alt=&quot;icon&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;message&quot;&gt;
        &lt;span&gt;This is an error message&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;');
});

不建议经常使用这个技巧,使用了它,在页面载入时会有闪烁的现象,但在有很多重复的HTML元素的情况下,这个技巧能有效地减小你页面的大小,对SEO也有好处,因为除去了很多重复无关的元素。

译者注:如果要考虑向后兼容,即考虑没有javascript的浏览器,任何情况下都不应该这样使用。

17.通过延迟加载内容提高速度和SEO友好度

还有另一个方法,可以加快页面载入,使爬虫蜘蛛抓取的页面更整洁,就是在页面其他部分载入完成后,再用AJAX载入内容。用户能看到正常的一面,爬虫蜘蛛也能只抓取到你想让它抓取的内容。

我们已经在自己的网站上使用这个技巧了,上面那些紫色的按钮能打开3个表单,一个导航和一个google map,这些都会让页面大小加倍,所以,我们把上面那些全部放在一个静态的HTML文件里,当页面读取完毕时再使用load()读取这个文件获得这部分元素,像这样:

$('#forms').load('content/headerForms.html', function() {
// 内容读取完毕时执行这里的代码,只执行一次
// 把所有事件处理程序都放这里
});

我不会到处使用这个技巧,你应该考虑它的优缺点,它会增加对服务器的请求,你的页面刚打开时载入的部分不能马上使用,但如果能正确地使用,它会是一个很好的优化技巧。

18.使用jQuery里的工具函数

jQuery里有很多实用的函数,填补了javascript的空白。

函数API见这里

特别地,浏览器对javascript里一些数组函数的支持并不好(IE7甚至不支持indexOf()),jQuery有迭代、筛选、复制、合并和去除重复元素这一系列针对数组的函数。

其他在javascript很难实现的功能,像获取下拉列表的值,在传统javascript里,必须使用getElementById获取<select>元素,再获取它所有的子元素,迭代检查它们有没有selected,十分繁琐。而使用jQuery很容易就能获取:

$('#selectList').val();

很值得花一点时间仔细看看jQuery文档,探索那些相对少人知道的函数。

19.同时使用多个框架时,用noconflict重命名jQuery对象

大部分javascript框架使用符号$作为记号,当页面上使用了超过一个框架时,这会产生冲突。幸运的是有一个很简单的解决方法,nofonflict()函数让你能自定义jQuery的名字:

var $j = jQuery.noConflict();
$j('#myDiv').hide();

20.怎样提示图片已经加载完毕

这个问题似乎没有怎么被提及到,但这在做相册的时候是很常见的问题,其实这个问题很简单。

你需要做的只是在<img>标签上使用.load()函数,给它一个回调函数。下面的例子改变了<img>标签的”src”属性,载入一张新的图片,并为它加了一个简单的load()函数。

$('#myImage').attr('src', 'image.jpg').load(function() {
alert('Image Loaded');
});

你会发现图片载入完毕时提示框会弹出。

21.总是使用最新版本

jQuery一直在改进,它的创建者John Resig一直在寻找方法改进jQuery性能。

jQuery现在的版本是1.2.6(翻译时已经是1.3.2),但john透露它在开发一个新选择器引擎:Sizzle 。它能提升选择器的效率,在firefox里能达到4倍。所以,应该使用最新版本以获得更好的性能。

译者注:sizzle引擎已经开发完成,jquery1.3已经使用此引擎,sizzle主页:http://sizzlejs.com/

22.怎样检查元素存在

在你操纵一个元素前你不需要检查那个元素是否存在,因为如果你选择的元素不在DOM里jQuery不会做任何事。但如果你需要检查是否有元素被选择了,或者检查有多少个元素被选择,你可以使用length属性。

if ($('#myDiv).length) {
// 你的代码
}

很简单,但并不易见。

23.用js向HTML标签添加一个class属性

我是从Karl Swedberg的两本书 (1) (2) 里学到这招。

他在我最近的一片文章的评论里提到这个技巧,它的原理是这样的:

首先,jQuery加载完成后用它为<HTML>标签增加一个名为”JS”的class属性:

$('HTML').addClass('JS');

因为这只会在javascript可用的情况下发生,所以你可以利用它添加只有javascript可用时才有的css属性,像这样:

.JS #myDiv{display:none;}

这意味着,当javascript可用时我们可以隐藏一些内容,再在需要时用jQuery让它显现,而javascript不可用时(以及搜索引擎抓取页面时),内容并没有隐藏,用户能正常看到那些内容。我会在以后经常使用这个技巧。

可以来这里读取Karl Swedberg关于这个例子的全文:

24.返回”false”阻止默认行为

这可能是显而易见的,但有时候却不是,如果你习惯这样做:

&lt;a href=&quot;#&quot; class=&quot;popup&quot;&gt;Click me!&lt;/a&gt;

然后给它绑定一个事件,像这样:

$('popup').click(function(){
// Launch popup code
});

它会很好的工作,直到你在一个长页面使用它,才会发现问题,你会发现”#”使鼠标点击它时自动返回页面顶部。

你需要做的是阻止它的默认行为,在事件处理函数里添加”return false”可以阻止任何事件的任何默认行为:

$('popup').click(function(){
// Launch popup code
return false;
});

25.缩写ready事件

这是个很小的技巧,可以通过缩写函数$(document).ready为你腾出几个字节的空间。

可以把

$(document).ready(function (){
// your code
});

缩写成这样:

$(function (){
// your code
});

后话

终于翻译完了,好长的文章,真佩服他这么有耐性写这么长的文章。似乎我耐心还是不够,一口气是翻译不了那么长的,分了好几个次。第二部分代码还没排版,没有缩进,以后再修改。

[翻译]改善你的jquery—25条jquery实用技巧<一>

2009-4-8 评论(2) 分类:技术文章 Tags:

原文链接:Improve your jQuery – 25 excellent tips

jquery是令人惊叹的框架,我已经使用它一年多了,我发觉使用它的时间越长,就会越喜欢它,也越理解它内部的工作原理。

我不是一个jquery专家,我也不奢求成为专家,所以如果这篇文章里出现一些错误我非常乐意接受大家的批评和改正。

我常常称自己为jquery中级使用者,我一年以来学到的、总结出来的技巧和技术,应该可以让一些人从中获益。

1.从google code载入jquery

Google挺久以前就开始提供各种javascript库供使用者载入,从google载入javascript框架相对于直接从自己的服务器载入有许多优势,首先它节省了自己服务器的带宽,从google载入也十分快,最重要的是如果用户之前已经访问过其他从google载入javascript库的网站,再访问你的网站时直接从缓存里取出即可,无需再次请求,会大大加快载入速度。

这很有意义,有多少网站储存着同一个版本的jquery呢,它们都没有被缓存。从google载入jquery是很容易做到的:

&lt;script src=”http://www.google.com/jsapi”&gt;&lt;/script&gt;
&lt;script type=”text/javascript”&gt;

    // 载入jQuery
    google.load(”jquery”, “1.2.6″);

    google.setOnLoadCallback(function() {
    //代码放这里
    });

&lt;/script&gt;

或者,你也可以直接包含jquery对应的网址,像这样:

&lt;script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js” type=”text/javascript”&gt;&lt;/script&gt;

完整的说明在这里

2.使用参考表(cheat sheet)

这不仅仅是个关于jquery的建议,对于很多语言,都有相应的很好的参考表,它很方便地把所有函数都列在可打印的A4格式的文档上,对于jquery1.2,下面这两个网址给出了两个很好的参考表:

http://www.gscottolson.com/weblog/2008/01/11/jquery-cheat-sheet/
http://colorcharge.com/jquery/

3.组合你所有的代码并压缩它们

嗯,这本来是一个普遍的javascript的建议,但任何使用jquery的大项目通常都会使用很多插件,所以这条建议也适用于jquery。

现在的浏览器不能同时载入几个脚本,这意味着如果你一次载入很多个脚本,会减慢载入网页的速度,所以,如果你的脚本需要载入到所有页面上,就可以考虑把你所有的代码放在一起,然后压缩它们。

有一些插件脚本已经被压缩过,你要考虑的是那些没有被压缩过的脚本。压缩脚本需要花费的时间很少,个人来说,推荐Dean Edwards制作的Packer这个工具。

4.使用firebug的控制台记录工具

如果你还没有安装firebug,那应该立即去下载。它除了提供其他一些常用的功能例如检查http传输和查找CSS错误外,还有优秀的控制台记录命令让你能轻易地检测脚本里的错误。

这里有这个功能的详细介绍

我个人喜欢的功能是“console.info”,它能输出信息或变量,代替了弹出窗口的alert,还有“console.time”让你轻易地在一段代码间设置一个计时器,得出执行这段代码所用的时间。这些console命令都很容易使用:

console.time('create list');

for (i = 0; i &amp;lt; 1000; i++) {
var myList = $('.myList');
myList.append('This is list item ' + i);
}

console.timeEnd('create list');

这个例子我故意写了一些效率很低的代码,在接下来几条技巧/建议里,我会说明如何使用这个计时器展示代码的改进。

5.通过暂存减少选择器的使用

jquery选择器让人赞叹,它以难以置信的简单方式选择页面上任何元素,但在其内部,选择器需要做大量的工作,所以如果大量使用选择器,你会发现程序开始变得很慢。

如果你多次地选择同一个元素(例如在一个循环里),你可以只选择它一次并赋给一个变量,再在你的核心代码里使用它。下面这个例子我们通过循环添加元素到一个无序列表里。

for (i = 0; i &amp;lt; 1000; i++) {
var myList = $('.myList');更能描述问题
myList.append('This is list item ' + i);
//译者注:我觉得直接用$('.myList').append('This is list item ' + i),去掉myList更能说明问题
}

这在我的电脑里用firefox3花费了1066毫秒(想象下如果是IE6将会是多长时间!),这在javascript来说是很慢的。现在我们看看下面的代码,只使用选择器一次:

var myList = $('.myList');

for (i = 0; i &amp;lt; 1000; i++) {
myList.append('This is list item ' + i);
}

只花费了224毫秒,快了4倍多,只是移动了一行代码。

6.减少DOM处理

通过减少插入DOM的次数,我们可以让刚才那个例子运行得更快。DOM插入操作像.append().prepend().after()和.wrap()都相对地更耗费资源,如果运行很多DOM插入处理会让网页变得很慢。

我们需要做的是使用字符串连接建立列表,然后使用函数把列表一次性添加到无需列表上,使用.html()会更快,看看下面的例子:

var myList = $('#myList');

for (i=0; i&amp;lt;1000; i++){
myList.append('This is list item ' + i);
}

在我的电脑里运行需要216毫秒,差不多1/5秒,但如果我们先建立一个字符串,再使用.html()插入,像这样:

var myList = $('.myList');
var myListItems = '';

for (i = 0; i &amp;lt; 1000; i++) {
myListItems += '&amp;lt;li&amp;gt;This is list item ' + i + '&amp;lt;/li&amp;gt;';
}

myList.html(myListItems);

用了185毫秒,虽然没有快多少,但还是节省了31毫秒。

7.插入DOM时包含所有内容在单个元素里

嗯,别问我为什么这样做(我一定会有更有经验的程序员可以解释)

上一个例子中我们通过.html()函数插入1000个元素到一个无序列表里。如果我们在插入前将它包含在一个UL标签里,然后将整个UL插入到另外一个标签(一个DIV)里,这样就只插入了一个标签,而不是1000个,这会让程序块很多,像这样:

var myList = $('.myList');
var myListItems = '&amp;lt;ul&amp;gt;';

for (i = 0; i &amp;lt; 1000; i++) {
myListItems += '&amp;lt;li&amp;gt;This is list item ' + i + '&amp;lt;/li&amp;gt;';
}

myListItems += '&amp;lt;/ul&amp;gt;';

myList.html(myListItems);

只花费了19毫秒的时间,巨大的改进,比第一个例子快了50倍。

8.尽可能使用ID而不是class

jquery优秀的选择器使通过Class选择元素变得跟通过ID选择元素一样简单,让人比以前更放心大胆地使用class。但事实上最好还是使用ID而不是class,因为使用ID获取元素时,jquery使用了浏览器默认的方法(getElementByID)获取元素,这无需经过遍历元素即可找到所需要的元素,比通过class查找元素更快。有多快?让我们来看看。

我使用了前面的例子,并对它进行小小的改动,让每一个li元素都有class属性,然后通过循环选择每一个元素。

// 创建list
var myList = $('.myList');
var myListItems = '&amp;lt;ul&amp;gt;';

for (i = 0; i &amp;lt; 1000; i++) {
myListItems += '&amp;lt;li class=&quot;listItem' + i + '&quot;&amp;gt;This is a list item&amp;lt;/li&amp;gt;';
}

myListItems += '&amp;lt;/ul&amp;gt;';
myList.html(myListItems);

// 每一个元素都选择一次

for (i = 0; i &amp;lt; 1000; i++) {
var selectedItem = $('.listItem' + i);
}

跟我想的差不多,我的浏览器卡住了,它使用了5066毫秒(超过5秒)。现在修改一下代码,给每一个元素一个ID代替class,然后做同样的事:

// 创建list
var myList = $('.myList');
var myListItems = '&amp;lt;ul&amp;gt;';

for (i = 0; i &amp;lt; 1000; i++) {
myListItems += '&amp;lt;li id=&quot;listItem' + i + '&quot;&amp;gt;This is a list item&amp;lt;/li&amp;gt;';
}

myListItems += '&amp;lt;/ul&amp;gt;';
myList.html(myListItems);

// 每一个元素都选择一次
for (i = 0; i &amp;lt; 1000; i++) {
var selectedItem = $('#listItem' + i);
}

这段代码只需要61毫秒的时间,差不多快了100倍!

9.给你的选择器定一个范围

默认地,当你像#(“.myDiv”)这样使用一个选择器,页面上所有的DOM元素将会被遍历,去查找符合条件的元素,这将会十分耗资源。

jquery的选择函数提供了第二个参数:

jQuery( expression, context )

通过提供一个上下文参数给选择器,可以让选择的范围缩小在所提供的元素内,不需要遍历整个页面。

为了演示,让我们引用上一个例子的代码,创建1000个元素的无序列表,每个li标签都有class属性,循环选择每一个元素,像上一个例子所看到的,将会花费超过5秒的时间运行这段代码。

var selectedItem = $('#listItem' + i);

然后我为选择器增加了一个上下文参数,让它只在.myList元素里遍历,像这样:

var selectedItem = $('#listItem' + i, $('.myList'));

它仍然使用了3818毫秒的时间,因为选择class还是一个效率低的做法。但这已经比之前快了25%,而且只为选择器添加了一个上下文参数而已。

译者注:我想如果把上面的代码放在一个大页面里执行,效果会很明显。

10.使用jquery链

jquery最酷的特性之一就是它能把函数调用连接在一起,例如,如果你想转换某个元素的class,可以这样写:

$('myDiv').removeClass('off').addClass('on');

如果你像我的话,会在学习jquery的前5分钟就知道这个特性,但jquery链不仅仅是这样。
首先,它可以跨行运行(因为jquery=JavaScript),这意味着你可以像这样简洁地写代码:

$('#mypanel')
.find('TABLE .firstCol')
.removeClass('.firstCol')
.css('background' : 'red')
.append('&amp;lt;span&amp;gt;This cell is now red&amp;lt;/span&amp;gt;');

养成使用jquery链的习惯可以减少选择器的使用。

假设你想在某一个元素上执行几个函数,但其中有一个函数通过某种途径改变了元素本身,像这样:

$('#myTable').find('.firstColumn').css('background','red');

上面的代码首先选择了一个table,然后选择table里class为”firstColumn”的单元格填充红色。

假设我们现在想把所有class为”lastColumn”的单元格都填上蓝色。因为我们之前已经用find()函数把所有class不是”firstColumn”的单元格排除了,所以我们要再次使用选择器获取table元素,所以我们就不能使用jquery链了,是不是?其实不是,jquery还有一个end()函数可以让链恢复到未被改变的时的状态,这样就可以继续链接下去,像这样:

$('#myTable')
.find('.firstColumn')
.css('background','red')
.end()
.find('.lastColumn')
.css('background','blue');

创建一个有链接功能的jquery函数比你想象中的还要简单,需要做的只是在函数里修改完元素后返回它:

$.fn.makeRed = function() {
return $(this).css('background', 'red');
}

$('#myTable').find('.firstColumn').makeRed().append('hello');

简单不?

继续阅读:改善你的jquery—25条jquery实用技巧<二>

关于翻译与jquery

2009-4-8 评论(0) 分类:生活 Tags:

昨天心血来潮,想试着翻译一篇技术文章,刚好近几天在用jquery做个小小的功能页面,又看到了Improve your jQuery – 25 excellent tips这篇很好的文章,似乎也没人翻译(可能有我没找到),就试着做了。

jquery实在是个很讨人喜欢的javascript框架,之前有下过dojo、YUI等框架玩玩,一开始就不喜欢了,那么大的框架,载入得需要多长时间啊,学起来又不容易,jquery小巧功能又强大,写法简洁,还有众多扩展,又容易上手,轻量级前台应用的首选啊~~用jquery感觉非常好。P.S jquery min版写着只有19K,但我下载的都是50K左右的,为啥?

这篇文章有25点,但我翻译到第10点时行数已经超过200行,虽然是包括了换行和代码的结果,但还是让人感叹,怎么这么长啊,外国佬真有耐心啊,排版都要排半天,25点要是放在一篇文章里,实在太长了,还是分开发布吧,我也没那耐心一口气就写那么多。

虽然那些英语很简单,但第一次翻译,过程还是有碰到困难的,有些句子不知怎么翻译,就蒙混过关,意思对就行了,还是挺多次不知道怎么翻译的,例如tips应该是小贴士,还是技巧,还是建议呢?第二点的cheat sheet我是搜索了一下才知道它是啥意思,但照网上说的翻译成“说明书”“步骤说明书”“小抄”又不合适,我照它原物的功能说成“参考表”了,不知正规应该怎么说。

翻译过程中偶尔也会加一点自己的意见~但不多~

At last, just for fun.

空间 圈子

2009-4-5 评论(2) 分类:生活 Tags:

从2日起这个博客就打不开了,收到email原来Host2ez正受到多IP、大流量的DDos攻击,就是分布式拒绝服务攻击,还以为不用多久就可以恢复,结果一直瘫痪着,4日发布消息,host2ez死了,让用户去办理相关退款手续,晕,这么倒霉,买个空间才用了10天就没了,后来在群上了解到,host2ez是个口碑很高的服务商,群上办理合租的“组长”告诉我,国外的,一般便宜、速度不错的主机,被其他IDC嫉妒,所以经常被攻击,所以就不稳定。一般贵的IDC,没市场竞争力,没人去攻击,所以稳定。国内的一般不会受攻击,因为大家都在中国这个和谐的地方,攻击了被抓到是要坐牢的。险恶啊,好的便宜的都会被打压,留下的都是不怎样又贵的。现在使用的韩国主机,也是速度快又便宜的,不知能支持多久?虽然这个买了一年,但并不看好……

为啥不买国内的空间呢?今年中国互联网刚出了个规定,每个网站都必须备案,否则杀无赦,诸多麻烦,备一个案要20个工作日,一个月的时间,觉得备案也不过就点开网站看几秒,再点一下鼠标的功夫,但公务员的效率就是这么高,没办法,不想折腾这个,国内空间价格也不菲,自己玩玩做做实践的空间,没必要花费那么多~~

虽说专注于互联网,但看起来我所了解到的互联网只是一小部分,十分局限,之前某一个时间想到,世界、人生就是一个个圈子,从这个圈子跳到那个圈子,圈子有大有小,有高雅有低俗,混来混去,也不过是在那圈子里打转,在高考的圈子打转,在社团的圈子打转,在工作在单位的圈子打转,就是这样,互联网上,也是有一个个圈子,黑客圈,电子商务圈,WEB2.0圈,技术圈,seo圈……应该还有很多,觉得我也就在web2.0圈子里观望观望,在瞄瞄技术圈,就没了,其他圈子所知甚少~~

另外最近发现如果没有外界环境驱动,我在电脑前就不会去学什么东西编程实践什么的都十分懒得去做,只会看看网页,聊聊天,或者玩玩小游戏,时间就过了~十分浪费,某个时期我挺怕浪费时间的,在外面没事做的时候,总想找本书看看才觉得不会浪费时间,在电脑前要看看博客写写程序才不会浪费时间,搞到自己挺累,最近就放松下来了,虽然还有事做,但生活还算悠闲~~

迁移

2009-3-26 评论(0) 分类:生活 Tags:

博客搬家了,https://blog.cnbang.net

使用闪吧博客3年多了,真是够长的,说实话我是一直想从闪吧里搬走的,因为太多限制了,而且博客冷门,不知道什么时候会给停了,但也因为太冷门了,几乎找不到任何博客搬家工具,要搬只能文章一篇篇的copy,所以一直以来只有念头没动手。

我本身是准备以后从事互联网行业的,最近又在学PHP,所以独立博客wordpress是最好的选择,我不想搬到其他博客提供商去,要搬只搬到独立博客,不仅仅是为了搬博客,也是为了折腾下wordpress,这也是学PHP的途径之一。另一个是,独立博客的自由是我一直所垂涎的,在上面想放啥就放啥,这放啥不是说内容,而是整个博客,像之前刚用饭否的时候,就对某些博客把饭否、twitter整合到博客里感到羡慕。

之前一直没有机会搬,因为要购买域名购买空间,最好还要熟悉一点php,最近条件都有了,刚好放秘饭的免费空间又出问题了,就索性弄了,也可以放秘饭。

说起为什么要在闪吧弄博客,是因为当时我在学FLASH,在闪吧论坛混,偶然看到闪吧的新东西-博客,就注册了一个试试,一试就几年过去了。当时Q空间处于起步阶段,没现在这么火,新浪博客出了没也不知道,网易百度什么的都还没出博客,不然说不定我会在其他地方混迹。

回看我在这里的第一篇日志,06年1月14日的,

很久没上闪吧,今天一上就见到新鲜东西。。闪吧改变了不少,随便申请了个BLOG试试。这个BLOG还真没得说,功能齐全,模版又不错,速度又快~~不过。。估计以我的性格。。是很少会在这里发表文章的了。。。拭目以待吧。。。

第一次用的时候,是没有想到我会一直在这里发表日志持续3年多的时间的。闪吧博客刚开始的时候是相对比较自由的,只有博客的功能,模板自定义,可以定义得很简洁,当时我用的模板就是很简洁的,挺喜欢,但后来升级了,变成了X-SPACE,多出了许多无用的功能,变得臃肿,页面也是繁杂,十分不喜欢,但还是继续用下去了。

忘记从啥时候开始,闪吧社区首页http://space.flash8.net的推荐空间栏里,有我的一席之地,大概是认真在闪吧博客上写日志的人少吧。因为这个有段时间带来了挺多流量,每天都有挺多人光顾的,说实话,虽然说写是为了记录自己的生活和想法,别人看不看无所谓,但有人看还是比没人看好。又不知道从什么时候开始,人流少了很多,大概闪吧也衰退了吧,一两年来都没怎么更新,博客这块大概更是放任不管了。

x-space和闪吧博客的冷门让搬家无法借助任何工具,只能人工复制粘贴,200多篇文章,还是大工程来着,迁移的过程中,偶尔有扫视了以前写的日志,感觉现在写的跟以前是有所不同,但具体说不出来,呵~~一些习惯也变了,像第一篇日志,那么多个句号,忘记当时用它表现什么情绪了,反正跟现在是大不一样~~现在感觉它是很特殊的符号,挺什么的~~以前我也会发很短的文章上来,现在发的都是长篇大论了,因为短的都直接发到饭否了~~

挺想写一个技术类博客的,但似乎水平还没到家,胸无点墨写不了,有时间再试试~

最后,截张图,缅怀一下用了这么久的博客:

flash8blog

P.S 好像这么久以来我一直是用这个主题。