Javascript Widget入门解析

收到Erica的来信,希望知道采麦的Widget是怎么做出来的,突然想起当年我第一次写widget代码的时候,也是满世界找不到一个简明实用的教程。于是做个总结,也许更多人可以用得到。

复习一下两个js函数:

js可以动态生成网页代码,比如:

document.write(’<div id=”photo”>123</div>’);

这段代码可以让网页里显示出一个叫photo的层,里面还有数字123。

此外,js可以动态改变网页内容,比如这段代码:

document.getElementById(’photo’).innerHTML=’abc’;

就可以让这个photo层里显示abc,而不是原来的123了

别看这么一段小代码,其实这就是整个widget的核心了

技术原理:

widget有3个重要部分组成:数据、外壳、脚本。

  • 数据:就是你希望显示出来的内容,比如你要显示flickr上最近的照片,那么照片就是数据;
  • 外壳:就是容纳数据的容器,比如上述照片,你把他们包裹到一个叫photo的div里,那么这个div就是外壳。
  • 脚本:脚本的作用是生成外壳,并把数据填充到外壳里,主要就是js代码,当然也可以带一些css

所以,理论上,一个原始的widget代码应该是这样的:

<script type=”text/javascript”>//调用js脚本

document.write(’<div id=”photo”></div>’); //js脚本生成外壳photo

document.getElementById(’photo’).innerHTML=’abc’; //js脚本把数据abc填充到外壳photo

</script>

是不是很简单?是很简单,可惜太长了,于是把上面四行代码的中间两行提取出来,复制放到一个wjs.js文件里:

document.write(’<div id=”photo”></div>’); //js脚本生成外壳photo

document.getElementById(’photo’).innerHTML=’abc’; //js脚本把数据abc填充到外壳photo

这样只需要调用一下就可以使用widget了:

<script type=”text/javascript” src=”wjs.js”></script>

好了,到这里你已经学会了最简单的widget制作,快去实验一下吧。

基础进阶:

那么,如果数据不是abc怎么办呢? 很简单,把数据独立出来就可以了。我们改造一下wjs.js代码:

document.write(’<div id=”photo”></div>’);   //利用js建立photo层,生成外壳
document.write(’<script type=”text/javascript” src=”widget.js”></script>’); //js填充数据

数据就在widget.js里,我们分析一下其代码,只有一句:

document.getElementById(’photo’).innerHTML=’xxx’;

这样的话,要改变数据,只需要把widget.js里的xxx换成任何内容即可,而无需改动wjs.js

中级进阶:

如果要自动动态改变数据xxx,只需要把widget.js也做成动态的,以php为例,首先把wjs.js修改一下:

document.write(’<div id=”photo”></div>’);   //利用js建立photo层,生成外壳

document.write(’<script type=”text/javascript” src=”widget.php?user=howard></script>’); //js填充数据

注意里面的widget.js换成了widget.php,后面还跟了一串变量,这样就可以显示为howard量身定制的数据了,看看widget.php的代码:

<?php
Header( “Content-type: text/javascript”); //声明文件类型为js

$user=$_GET['user']; //读取user变量 (howard)

echo “document.getElementById(’photo’).innerHTML=’hi, my name is $user’; “;

//输出动态内容(hi, my name is howard)

?>

到这里,我们已经可以根据不同变量来自动显示不同的数据了。后面就很简单了,把widget.php任意改造,读取数据库,可以输出各种各样关于howard的数据。

实战应用:

事实上,实际应用中,wjs.js也被改造成了动态文件,比如wsj.php,这样你的用户howard只需要在其blog里插入以下代码,就可以真正实现个性数据调用:

<script type=”text/javascript” src=”http://domain.com/wjs.php?user=howard”> </script>

wjs.php的内部代码是这样的:

<?php
Header( “Content-type: text/javascript”); //声明文件类型为js

$user=$_GET['user']; //读取user变量 (howard)

echo “document.write(’<div id=”photo”></div>’);”   //利用js建立photo层,生成外壳

echo “document.write(’<script type=\”text/javascript\” src=\”widget.php?user=$user\></script>); “; //动态调用widget.php

?>

这样,widget.php收到了user变量之后,就能显示出howard的个性数据。

先写到这,大家可以先回去测试一下。真正能用的widget,代码和上面有很大区别,但是原理是相同的。

如何在24小时内完成一个可用的网站

9月下旬,Roy过来找我说想在3个月内做出一个在线销售珠宝的网站。我的第一个反应是:为什么要3个月,而不是7天?

Roy感到很意外,7天也太短了吧。前期想花2个礼拜做市场分析,然后花2个礼拜做系统架构和主机租用,再一个月编写代码,再两周集成支付系统,最后两周用来调试。。。。。3个月已经很快了呀。。。。

我还是坚持“7天之内必须做出来”。Roy说“十一正好要结婚,还要忙准备工作呢”。“那好,除去结婚的7天,14天后必须上线。今晚回去就上GoDaddy把域名注册了,去mediatemple租个主机,几分钟后就能开通。利用5天写代码,花1天集成Paypal,最后1天做调试和部署。”

14天后,Roy的网站Bypoo真的上线了,而且真的可以卖了。

===================================================

10月初,阿宏过来找我,说想在2个月内上线一个家居设计销售网站。我的第一个反应依然是:为什么要2个月,而不是7天?

阿宏说“我有很远大的计划,我的网站将成为一个跟和淘宝一样复杂的家居交易平台”。。。。“打住!不管你将来计划多大,先给我上线,卖出第一套家具再说。这个周末去联系好10种存货,花5天写代码,7天后上线开卖。” 阿宏终究没有7天上线,最大原因是他一开始就建立了一个不小的团队,而团队成员却分散在各地,7天时间不够协作。

===================================================

互联网创造奇迹的地方有很多,其中一个很大的方面是:你可以在24小时内完成一个网站并开始做生意。互联网的硬件和软件成本已经低到了难以想象的地步,除去营销费用,一个网站只需要100块钱加上几天时间就能架起来。这是多么美妙的事情啊。

但是,很多人都被混蛋的MBA思维给套住了,什么市场分析,战略定位,用户调研,架构设计。。。。。都是Bullshit,这个时代什么都缺,就是MBA太多了,危害青少年健康。当你有一个想法的时候,就应该在几个小时候内把商业模式和系统逻辑想清楚了,然后7天内做出一个雏形(或者说比Beta版更Beta的版本),推出这个雏形之后,才去跟大家讨论,获取建议、想法,并改进成真正的Beta版,然后每天迭代开发,不断改进,直到成为一个完善的网站。绝对不要想着上线的第一个版本就能用上一年。事实上,第一个版本甚至连1个月后的情况能否应对都不是关键。

很建议有MBA思维的人士去读一读37Signals专门为网络startup定制的初创指导书“Getting Real”,看看这家成功的互联网公司是踢开MBA套路,直捣创业核心的。对网络创业犹豫的朋友,建议去看看美国的Startupweekend是如何每个周末纠集一小帮人、让他们在周六、周日两天之内搞出n个新网站来run的。

===================================================

前天,我突然发现,一个非常好的朋友,到现在还是单身。我想给他找个女友、我想到了互联网、我去搜索了一大堆交友网站,我立即无数枯燥的交友网站给淹没了,我感到我进入了很多生猪卖场,我发现一切都标准化了,我发现我在按照猪的体重、三维、价格来给我朋友挑选一头母猪。。。。。

我想给我的好友找一个女友,可是没有一个我看得上的交友网站。

你不是号称7天内就能做出一个新网站么?为什么不干脆自己做一个?

我也是这么想的。

这次我把目标定为了24小时(包括睡眠时间)。

首先确定网站的核心诉求:每个人身边都有单身的好男孩或好女孩,却由于各种原因而单身。那么,请你来向大家推荐你的单身好友,并从别人推荐的朋友里选择可能适合TA的对象。

从昨晚7点开始,花了5分钟从已有的空余域名里挑了一个,Zircy.com,然后花了10分钟想名字,叫“择悉”,和Zircy谐音,反正名字可以随时改的,先这样吧。

功能目标:

1、注册和登录

2、能提交自己的好友信息,包括姓名、性别、地区和照片

3、能够看别人推荐的好友,如果觉得某人不错,就可以点击按钮发送“感兴趣”的信息,促成对方的朋友和自己的朋友来约会

花了5个小时,用php+mysql把代码编好(没有用框架,但从以前网站里借用了一些常用函数),实现了上述基本功能,但bug一大堆,而且完全没有考虑美工、UI设计什么的,不管如何,5小时后的凌晨,Zircy.com就公开上线了。

然后花了8个小时睡觉。

今天上午醒来,开始修正了一些大bug,然后花了一个下午调整CSS、美化布局。所有用到的图片、网站介绍、用户协议、隐私政策等都是从我以前的网站里搬过来,或者在网上现找的,其实这些东西不要也没关系。到下午6点搞定。

最后花了1个小时用photoshop设计了Zircy的logo和一些图片按钮,还做了一下初步的SEO,填充了一些原始数据(首页里可真的都是我的好朋友啊。。。。真是对不住哥几位了。。。)

大功告成。

现在大家看到的Zircy.com,就是花了24小时做出来的。有兴趣的话,可以去注册玩玩。邀请码是ZircyRocks

===================================================

后记,对于一个技术高手来说,24小时做出一个网站根本不是问题。这篇博文也不是为了炫耀什么,只是想表达一个看法,一个对创业的看法:如果你相信自己的点子,请不要拖,尽快把它做出来,只有尽快做出来,才能prove你的点子是否可行。如果蒙头做半年才上线,很有可能出来的玩意儿已经一文不值了。

创业不是一件简单的事情,但也不是很艰难的事情。

一种新型、有效、合法的DDOS攻击方法

今天下午吐司网的服务器出现了明显了受攻击病状

结果查了log之后,发现访问均来自天涯的一个帖子,那个帖子里从吐司链接了一百来张图片,最郁闷的是,这个帖子居然还上了天涯的首页

情况可想而知,apache的线程高达285个,濒临崩溃。

虽然发帖人是自己人,但这个倒是提供了一种高明的攻击方法

服务器租用、域名注册必须注意的几点

1、一定要支持远程ssh,不然备份的时候你会郁闷死

2、一定要有独立IP,不然跟你同ip的非法网站会把你一起拖下水

3、一定要支持fsockopen()函数,不然你的Email系统将会处于最原始最落后的状态

4、一定要支持mod_rewrite,原因我就不说了

5、一定不能用大陆的虚拟主机(虚拟空间),我的亲身经历,受够了

6、绝对不要注册.cn域名,.cn域名是中国人管的,只要是中国人管的东西,什么出问题那就欲哭无泪了。当年还比较出名的牛博网(bullog.cn)被关,域名被强制指向一个低俗透顶的垃圾网站,谁干的? 万网干的,为什么万网有能力这么干?因为它是.cn。参考文章:《警告——不要在国内注册和使用CN域名》

7、绝对不要用大陆的域名注册商。 即使是.com,只要你在国内注册,就有你的好看。 .com域名一夜之间改变了所有人和ip指向的事情,已经不是一次两次了,而且这种事情只有中国可以发生。

据我所知,同时满足1、2、3、4条件的服务器,国内只有独立主机才会有(租金大概5000~10000之间/年),独立主机的速度一般不错,可以考虑。

再次强调:大陆的虚拟主机千万不要用,年轻的时候几乎用遍了国内的每一个知名的虚拟主机,包括中国频道,中资源,万网。。。。。。没有一个不是垃圾。国外3000G的空间才卖60美金一年,万网200M的垃圾空间要卖5000元。国外的mysql数据库免费无限量,国内的50M数据库就要另加400元一年,无耻到极点。更不用说ssh,独立IP等了。

顺便点评一下国外比较流行的两个公司:IXWebhostingMediaTemple

IXWebhosting:免费赠送8个独立IP,可以放很多个网站(而且可以直接用IP访问),这点很牛。我用过一年时间,有两个大问题:1、不支持SSH,备份和转移非常麻烦;2、经常出现无法上传的问题,查了之后发现是“out of disk space”,明显是服务器配置错误,联系在线客服之后,10分钟左右就解决好了。但是经过连续4次同样的问题之后,我彻底失去耐心了。于是换到了大名鼎鼎的MediaTemple

MediaTemple: IT知名博客TechCrunch就是用MediaTemple,其界面UI设计堪称完美,可以说是主机界的苹果电脑。价格偏高,但功能强大,口碑甚好,可谓物有所值。提供ssh,一个独立IP,Lamp很强大,可自由切换php4和php5,数据库支持mysql和postgres,还支持crond计划任务。说说大家最关心的网速:我在国内的下载速度可以达到1.2M/s,居然远远超过国内的独立主机。不得不服。已经使用了四个月,非常满意。唯一的美中不足是,大部分软件都没有权限安装。

最后,注册域名千万别用国内的注册商,理由如下:

1、国外只需要7美金一个.com域名,换算一下也不到50元;而国内要卖100~150元

2、在国内,你花了钱注册了域名,管理权却并不真正属于你。注册商里的任何一个员工都可以轻易的把你的域名所属权搞成别人的

3、在国内,你注册了域名,如果某一天想更换注册商,可谓比登天还难,因为更换的时候需要向国内的注册商请求一个“转移密码”才能完成,而这个转移密码,他们是不愿意告诉你的

4、国外的域名解析措施更加完整方便 ,可以指定多个子域名,自由设置A记录、CNAME、MX记录等,国内却限制多多

国外的域名注册商建议用godaddy.com,最保险。国外也有很多垃圾注册商 ,小心为妙。

Firefox和IE的CSS兼容性问题漫谈

先从设置最小高度:min-height说起吧

对于某些内容可变的层(比如用户评论),我们希望它有个最小的高度(比如30px),这样的话,即使内容只有一行字,也不会太难看;同时又希望在内容比较多的时候,层的高度能自动撑开,也就是要求height: auto。这时候就可以设置css的min-height属性。min-height在Firefox里有效,但IE无法识别。可以使用下面这个解决方案:

.div_class{min-height:30px;height:auto !important;height:30px;}

第一行设置 min-height:30px;对Firefox有效;第二行height:auto !important;也对Firefox有效,后面紧跟的“!important”是Firefox专用的一个标记,带有这个标记的设置具有最高优先级,之后的设置都无效。所以第三行的height:30px对Firefox无效了;同时,由于IE无法识别min-height和“! important”,所以只有第三行有效,由于IE默认就是高度自适应的,所以即使设置了30px的高度,只要内容很多,也会自动撑开,不需要设置 height:auto。最后,上述代码产生如下效果:

对于Firefox,等同于:

.div_class{min-height:30px;height:auto;}

对于IE,等同于:

.div_class{height:30px;}

“!important” 是个非常好用的东西,如果你写过几个月的跨浏览器的CSS代码,就很容易被Firefox和IE之间的差别而感到恼火。比如padding属性就是一个例子。

假设这样一个层:

.div_name {width:100px;padding:10px;}

在IE里面,层的宽度是100px,四周的余空为10px;但是对于Firefox,层的宽度变成了100px+10px+10px=120px,对于宽度敏感的设计来说,整个就混乱了。怎么办呢?还是求助于“!important”吧。只要这样写就可以了:

.div_name {width:80px !important;width:100px;padding:10px;}
因为80+10+10=100。正好让宽度 变成100px。

有时候,我们给一个层加上边框 ,在Firefox里面也会出现宽度增加的情况,比如:

.div_name {width:100px;padding:10px;border:2px solid #ccc;}

上面这个层,在Firefox里面的实际宽度等于100+10+10+2+2=124px,因为边框也会增加宽度。怎么办呢,还是靠“!important”,这样写就可以了:

.div_name {width:76px !important;width:100px;padding:10px;border:2px solid #ccc;}

写CSS经常要做这样的计算,还要写很多!important,苦了设计师们,什么时候IE和Firefox的CSS标准统一就好了。

Mysql数据转移编码问题

MySql的字符集是越来越严格了,涉及到好几个层面的编码。

实用的来说,我们一般就用gb2312或者utf8两种编码(个人严重推荐utf8) ,下面以utf8为例说一下:

1、转移数据的时候,在Create table后面注明字符集为 utf8,数据库校验(collation)字符集为utf8_unicode_ci,比如:

CREATE TABLE `member` (
`id` int(7) NOT NULL auto_increment,
`account` varchar(50) default NULL,
`password` varchar(100) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

2、客户端读写数据的时候,在select database前面加上SET NAMES ‘utf8′这个语句,这是为了告诉MySql连接校验(connection collation)的字符集也是utf8,比如:

$mysql->host=”localhost”;
$mysql->user=”foor”;
$mysql->pass=”bar”;
$mysql->db=”db”;
$mysql->connect();
mysql_query(”SET NAMES ‘utf8′”);
$mysql->select_db();

这样就搞定了,gb2312也是类似的修改这两层就可以了