Archive for the ‘Web技术’ Category

页面制作人员的修练之道(三)理解表现与内容相脱离

一月 18th, 2007

表现与内容相脱离,这应该算是web标准所提倡的核心了。按w3c提出的标准,将网页划分成了三大块,即结构层、表现层、行为层。下边我们还是以上一节中的效果图为例,来了解这三块内容。您可以在新窗口中打开这个页面

Html代码:从页面代码的角度上看,我们应该说只能看到这些东西:就是一个标题,以及一个详细列表。所以说在脑海中初步形成的代码应该是

<h4>标题</h4>
<ul>
	<li>列表项</li>
	<li>列表项</li>
	<li>列表项</li>
	<li>列表项</li>
	...
	<li>列表项</li>
</ul>

CSS代码:就是大家看到的视觉效果。通过更换css文件,我们可以在不修练html代码的基础上任意变换这个页面的视觉效果。所有的效果应该是与html内容本身没有关系的。因为视觉效果仅仅是为了让页面更漂亮、更容易让用户去接受。

Javascript:细心的朋友会发现,标题栏左侧有一个小三角形。通过点击这个图标,我们可以完成一个收缩功能,这就是行为,也是与页面内容无关的东西。

三种角色负责三个不同的分工,尽量不要去相互影响。

一个网页,应该以它的主体内容为根本,所以我主张。先编写html代码,在编写html代码时,我们尽量不去考虑为了迎合它的表现形式,这样才能写出结构化、语义化的页面代码。当然,在CSS实现以及行为脚本时,我们也允许最小程度的去修改现有的html代码,毕竟还有很多客观因素在制约着。但这绝不意味着像某些网站,纯粹为了通过w3c验证、为了实现某些不合理的效果图去写出类似于N个div嵌套、满页都是div的现象。时下所流行的一种叫法“div+css”让很多初学者对web标准产生了严重的误解,认为就是用div去代替以前的table,会产生“满页尽是div”的错误结论。
这种表现与内容相脱离的设计思想,对于页面制作人员而言,也同时提出了更高的要求:
1.抛弃"所见即所得"的网页编辑软件,改用手写。亲身去感受每一个html标签的真实意义。你会发现除了table标签,原来还有那么多有用而根本没有胜过的标签。
2.以前只用DW、FP等软件拉出无数个表格然后填充些东西进去就能保存为网页的时代过去了,你要懂每一个html标签它应该布置在网页的什么位置。
3.页面html代码不负责页面的效果,它只是告诉浏览器我这个页面的结构和内容,所以刚开始时,你会觉得符合标准的页面做出来都比较难看,那是因为你还没有学会CSS,就算学会了,你还没有经过多次的这种html代码与css代码分开编写的实践。
4.要尽量让页面上的每一个标签都有它的实际意义。不要让html代码为css而活着。

页面制作人员的修练之道(二)基于web标准的网页基本特征

一月 18th, 2007

从三年前开始接触网页到现在,我亲身经历了国内大多数网站的web标准重构。自己在不断的学习过程中也总结出了一点符合web标准的网页的一般特征,和大家一起分享一下。
1、页面代码容易读懂了
举一个简单的例子,按以前如果要实现一个页面的布局,一般是使用表格来划分整个页面。如:

<TABLE width="100%" cellpadding="5" cellspacing="1" bgcolor="blue">
<TR>
	<TD bgcolor="silver" colspan="2" align="center" align="right">
		<TABLE width="90%">
		<TR>
			<TD>首页</TD>
			<TD>栏目一</TD>
			<TD>栏目二</TD>
			<TD>栏目三</TD>
			<TD>栏目四</TD>
		</TR>
		</TABLE>
	</TD>
</TR>
<TR height="400">
	<TD width="25%" bgcolor="white">左侧内容</TD>
	<TD width="75%" bgcolor="white">右侧内容</TD>
</TR>
<TR>
	<TD colspan="2" bgcolor="#f8f8f8" align="center">尾部文字</TD>
</TR>
</TABLE>

而我们现在,一般会简化成这样:

<div id="header">
    <menu>
        <li>首页</li>
        <li>栏目一</li>
        <li>栏目二</li>
        <li>栏目三</li>
        <li>栏目四</li>
    </menu>
</div>
<div id="left">左侧内容</div>
<div id="right">右侧内容</div>
<div id="bottom">尾部内容</div>

然后再通过外部的CSS对页面上的元素进行布局以及美化效果,这样的代码相对于前一段应该说更精短,更易读懂。而且这个易读性,你还可以理解成搜索引擎也比较容易读懂你的内容、聋哑等有障碍人士也能通过一些特殊设备来读懂你的内容、用手机wap上网也能比较顺畅地访问你的页面。
2、页面变小了
同样的网页在新的标准下制作和以前的传统制作相比,代码一般能节约40%以上,当然这是由于以下原因造成的:
a.通常在符合标准的页面中,已经不再直接使用><td bgcolor="red" align="center" ….></td>这种方法直接去控制显示样式了,而是放在网页之外的CSS文件中去表现。
b.抛弃了表格用来布局的做法后,N个表格重复嵌套的冗余代码也就不再出现了。
c.页面上已经不再直接使用图片进行装饰了,而是采用在CSS中使用背景图去实现。当然,具有实际意义的图片还是应该存在的,比如网站的Logo图标、广告图片、新闻图片以及其它不是用来装饰页面效果的、是属于实际内容的一部分的那类图片。
d.大量的javascript代码也被移植到了网页外部,在页面中将精简成<script type="text/javascript" src="../js/**.js"></script>。

当然以上所谈的特征非常的表面化、也非常的局限,只是就页面代码方面描述了比较浅显的特征,针对于页面制作人员而言,也同时提出了更高的要求,会在后边的文章中做详细的讲解。
有兴趣的朋友可以照着下边的这个效果图去用传统的方法试着做一下,然后再查看这个页面的html代码,是不是觉得的确精短了很多?

到底如何去培养自己去编写精练的、有语义的、结构非常清晰的html代码呢。在下一节中我们来讨论如何将一个美工画出来的效果图拆分成结构层、表现层以及行为层,以及如何正确处理三者之间的关系。

页面制作人员的修炼之道(一):前言

一月 17th, 2007

[写本文的目的]:与您分享如何学习基于web标准的网页制作。
[本文适合人群]:网页制作初学者。有一定的页面制作基础,并想学或正在学习web标准的朋友们。
[文章内容摘要]:
1、前言-新形势下的网页制作以及职业定位。
2、基于web标准的网页有哪些基本特征。
3、如何理解结构层、表现层、行为层代码的脱离。
4、编写符合标准的(x)html代码的一般方法。
5、用CSS美化页面。
6、正确认识Javascript。
7、网页制作人员需要了解哪些知识。
8、我常用的工具软件介绍。
9、推荐的网站列表。
[备注]:
本文只是从理解以及概念上去分享网页制作的学习方法和步骤。力求通俗易懂,所以没有任何具体的代码、规范等内容,比如Xhtml的代码规范、CSS样式手册等具体内容我将会在文章的最后“推荐的资源列表”中将我所看到过或学习过的教程一一列出。

新形势下的网页制作以及职业定位。

随着网络的发展,前几年还只是国外网站以及国内少数个人网站才会去实施的web标准,现在已经是大行其道了。上至新浪、163等门户网站,下至刚从学校毕业的大学生们的个人网站。到处都是它的踪影。
网站建设的分工也从原来的一人承包(从效果到页面到程序代码)的模式也逐步转变成Web Designer + Page Builder + Programer 的项目组合作开发模式。正是由于web标准的兴起,“页面工程师”这个称谓也慢慢走上了舞台并担任起了相当重要的角色。
曾在蓝色经典上看到Aether帖出来的土豆网(tudou.com)的招聘信息,感觉这个招聘信息非常的有代表性,原文如下:[quote]
页面工程师,1人
技能要求:
1、对W3C网页标准(Web Standards)有较深理解;
·精通结构层代码(XHTML)和样式层代码(CSS)。
·对语义、结构与内容分离等有深刻理解;
·熟悉Javascript,并对行为层编程机理有一定理解,并了解后台程序制作流程。
2、有成熟作品,目前将主要从事代码方向工作;
3、精通Javascript优先。
工作内容:
配合页面架构(Web Architect,负责总体规划),完成页面制作(Page Builder)。
其上游是页面设计(Web Designer),下游是网站程序员(Programer)。
[/quote]
我非常的认同这种职业定位,所以转了过来。或许这将是未来比较流行的网站制作过程中的项目组分工合作的模式吧。

实现div可编辑的常见方法

一月 11th, 2007

功能:实现网页内容的即时编辑,增加页面的可用性、交互性。
方法1:直接通过textarea标签实现,请运行这个Demo

思路:将textarea通过CSS样式设计成让用户感觉不像是textarea的样子,通过onblur、oumouseout等属性进行ajax保存用户数据。

方法二:通过document.createElement的方法向页面增加input来实现。请运行这个Demo

思路:
1、当用户鼠标经过可编辑区域时,用背景色等方式提醒用户该区域可编辑。
2、当用户鼠标点击该区域时,也就是onclick事件时,先将原来的内容清掉,将临时创建出来一个输入框和一个输入按扭。
3、用户修改完后,点击“保存”按扭时通过ajax向数据库中写入新的数据。

PS:第二个方法的代码还有点问题,有空再来调试一下。

代替marquee的滚动字幕效果代码

一月 8th, 2007

由于marquee标签现在用得是越来越少了,所以滚动效果的做法大多也都改用javascript来实现了,至于不明白为什么不直接用marquee标签的朋友,不妨先阅读一下这篇文章
第一种方法:用javascript模拟marquee的做法。
出处:网易游戏

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>热点新闻</title>
<style type="text/css">
<!--
body {
    margin: 0px;
    font-size: 12px;
    color: #938C43;
    line-height: 150%;
    text-align:center;
}
a:link{color: #9D943A;font-size:12px;}
a:hover{color: #FF3300;font-size:12px;}
a:visited{color: #9D943A;font-size:12px;}
a.red:link{color: #ff0000;font-size:12px;}
a.red:hover{color: #ff0000;font-size:12px;}
a.red:visited{color: #ff0000;font-size:12px;}
#marqueeBox{background:#f7f7f7;border:1px solid silver;padding:1px;text-align:center;margin:0 auto;}
-->
</style>
</head>

<body>
<h4>滚动新闻</h4>
<script language="JavaScript" type="text/javascript">
var marqueeContent=new Array();
marqueeContent[0]="<a href=http://xyq.163.com/news/2006/11/2-2-20061102170913.html target=_blank>用“梦幻密保”快速取回帐号密码</a>";
marqueeContent[1]="<a href=http://ekey.163.com/ target=_blank>网易将军令官方网站</a>";
marqueeContent[2]="<a href=http://xyq.163.com/download/wallpaper.htm target=_blank>最新壁纸下载</a>";
marqueeContent[3]="<a href=http://xyq.163.com/download/around.htm target=_blank>最新屏保下载</a>";
var marqueeInterval=new Array();
var marqueeId=0;
var marqueeDelay=2000;
var marqueeHeight=20;
function initMarquee() {
    var str=marqueeContent[0];
    document.write('<div id="marqueeBox" style="overflow:hidden;width:250px;height:'+marqueeHeight+'px" onmouseover="clearInterval(marqueeInterval[0])" onmouseout="marqueeInterval[0]=setInterval(\'startMarquee()\',marqueeDelay)"><div>'+str+'</div></div>');
    marqueeId++;
    marqueeInterval[0]=setInterval("startMarquee()",marqueeDelay);
}
function startMarquee() {
    var str=marqueeContent[marqueeId];
    marqueeId++;
    if(marqueeId>=marqueeContent.length) marqueeId=0;
    if(document.getElementById("marqueeBox").childNodes.length==1) {
    var nextLine=document.createElement('DIV');
    nextLine.innerHTML=str;
    document.getElementById("marqueeBox").appendChild(nextLine);
    }
    else {
        document.getElementById("marqueeBox").childNodes[0].innerHTML=str;
        document.getElementById("marqueeBox").appendChild(document.getElementById("marqueeBox").childNodes[0]);
        document.getElementById("marqueeBox").scrollTop=0;
    }
    clearInterval(marqueeInterval[1]);
    marqueeInterval[1]=setInterval("scrollMarquee()",20);
}
function scrollMarquee() {
    document.getElementById("marqueeBox").scrollTop++;
    if(document.getElementById("marqueeBox").scrollTop%marqueeHeight==(marqueeHeight-1)){
    clearInterval(marqueeInterval[1]);
    }
}
initMarquee();
</script>

</body>
</html>

个人观点:从web可用性角度上讲,我们在采用这段代码的同时要考虑到noscript环境下的可用性,建议将内容还是以下边代码的形式出现在页面中。如:

<div id="newslist">
<ul>
<li><a href=http://xyq.163.com/news/2006/11/2-2-20061102170913.html target=_blank>用“梦幻密保”快速取回帐号密码</a></li>
<li><a href=http://ekey.163.com/ target=_blank>网易将军令官方网站</a></li>
<li><a href=http://xyq.163.com/download/wallpaper.htm target=_blank>最新壁纸下载</a></li>
<li><a href=http://xyq.163.com/download/around.htm target=_blank>最新屏保下载</a></li>
</ul>
</div>

然后用脚本去设置隐藏,将列表项读进javascript中定义的数组中。即可达到在noscript环境下也能正常看到内容列表。

第二种方法:这个更强,能自动根据内容自动进行左右滚动,解决了宽度太小造成的截取问题。
原文作者:风动人

<html>
<head>
<title> SCROLL </title>
<style type="text/css">
#infozone{font-size:12px;color:#aa6;overflow:hidden;width:100px;height:20px;}
#infozone div{height:20px;line-height:20px;white-space:nowrap;overflow:hidden;}
</style>
<script type="text/javascript">
var tc;
window.onload=function(){
    var o=document.getElementById('infozone');hscroll(o);
    window.setInterval(function(){window.clearTimeout(tc);o.firstChild.style.marginLeft='0px';scrollup(o,20,0);},10000);
}
function scrollup(o,d,c){
    if(d==c){
        var t=o.firstChild.cloneNode(true);
        o.removeChild(o.firstChild);o.appendChild(t);
        t.style.marginTop=o.firstChild.style.marginTop='0px';
        hscroll(o);
    }
    else{
        ch=false;var s=3,c=c+s,l=(c>=d?c-d:0);
        o.firstChild.style.marginTop=-c+l+'px';
        window.setTimeout(function(){scrollup(o,d,c-l)},50);
    }
}

function hscroll(o){
    var w1=o.firstChild.offsetWidth,w2=o.offsetWidth;
    if(w1<=w2)return;
    tc=window.setTimeout(function(){hs(o,w1-w2,0,w1-w2)},3500);
}

function hs(o,d,c,p){
    c++;var t=(c>0?-c:c);o.firstChild.style.marginLeft=t+'px';
    if(c==d){if(d==0){tc=window.setTimeout(function(){hs(o,p,0,p)},2500);}else tc=window.setTimeout(function(){hs(o,0,-p,p)},3500);}
    else tc=window.setTimeout(function(){hs(o,d,c,p)},5);
}
</script>
</head>

<body>
<div id="infozone"><div>温岚 - 屋顶(周杰伦 对唱版)</div><div>范玮琪 - 那些花儿</div><div>张韶涵 - 娃娃</div><div>孙楠&韩红 - 美丽的神话</div></div>
</body>
</html>

个人观点:从xhtml的语义化的角度看,页面内容中滥用div标签现象比较严重,可改成ul/li形式。

第三种是最精简的,代码非常少。
原文作者:cityvoice

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <style type="text/css">
    #newslist{
        background:#f7f7f7;border:1px solid silver;padding:1px;height:20px;line-height:20px;width:300px;
    }
    #contain{
        font-size:12px;overflow:hidden;list-style:none;width:300px;height:20px;margin:0px;padding:0;
    }
    #contain li{
        height:20px;line-height:20px;white-space:nowrap;overflow:hidden;
    }
</style>
</HEAD>

<BODY>
    <div id="newslist">
        <ul id="contain">
            <li><a href="http:/www.iwcn.net">温岚 - 屋顶(左右摆动)</a></li>
            <li><a href="http:/www.iwcn.net">范玮琪 - 那些花儿</a></li>
            <li><a href="http:/www.iwcn.net">张韶涵 - 娃娃</a></li>
            <li><a href="http:/www.iwcn.net">孙楠&韩红 - 美丽的神话</a></li>
            <li><a href="http:/www.iwcn.net">张信哲 - 白月光</a></li>
        </ul>
    </div>
<SCRIPT LANGUAGE="JavaScript">
function xx(){
var container=document.getElementById("contain");
container.appendChild(container.firstChild);
}
setInterval("xx()",3000);
</SCRIPT>
</BODY>
</HTML>

个人观点:太短小精干了,如果你喜欢简单的话,这个也可以考虑的。

[分享]CSS页码效果

十二月 24th, 2006


不知道网上有没有做成这样的,纯粹是不小心做出来的。
最终效果说明:
页面结构是这样的

<li><a href="#">1</a></li>

最终看到的彩色下划线是根据li的背景色显示出来的

li{background:#f60;}

而鼠标移上去的色彩变化是根据

a:hover{background:#f93}

当然关键的地方在于

li{width:20px;height:20px}

定义li的高度时由于没有定义line-height:20px,所以会造成a标签在显示时下方会留空几个像素。正在由于这个错误,无意中产生了这个效果

请运行下段代码看效果。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">
	<head>
		<title>代码基地博客站</title>
		<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
		<meta name="Keywords" content="CSS页码链接" />
		<meta name="Description" content="CSS制作的页码链接效果" />
		<meta name="Author" content="jxdawei,[email protected]" />
		<style type="text/css">
			body{
				font-size:62.5%;
			}
			h1{
				font-size:1.4em;
			}
			h2{
				clear:both;
				font-size:1.2em;
			}
			#pageClass{
				clear:both;
				font-size:1.2em;
			}
			#pageClass ul{
				list-style:none;
			}
			#pageClass li{
				float:left;
				width:20px;
				height:20px;
				line-height:20px;
				border:1px solid silver;
				margin:0 3px;
			}
			#pageClass a{
				display:block;
				text-align:center;
			}
			#pageClass a:link,#pageClass a:visited{
				background:white;
				text-decoration: none;
				color:gray;
			}
			#pageClass a:hover,#pageClass a:active{
				text-decoration: none;
				background:gray;
				color:white;
			}

		/*第二个效果*/
			#pageClass2{
				clear:both;
				font-size:1.2em;
			}
			#pageClass2 ul{
				list-style:none;
			}
			#pageClass2 li{
				float:left;
				width:20px;
				height:20px;
				border:1px solid silver;
				margin:0 3px;
			}
			#pageClass2 a{
				display:block;
				text-align:center;
			}
			#pageClass2 a:link,#pageClass2 a:visited{
				background:white;
				text-decoration: none;
				color:gray;
			}
			#pageClass2 a:hover,#pageClass2 a:active{
				text-decoration: none;
				background:gray;
				color:white;
				line-height:14px;
			}
		/*第三个效果*/
			#pageClass3{
				clear:both;
				font-size:1.2em;
			}
			#pageClass3 ul{
				list-style:none;
			}
			#pageClass3 li{
				float:left;
				width:20px;
				height:20px;
				border:1px solid silver;
				background:#f60;
				margin:0 3px;
			}
			#pageClass3 a{
				display:block;
				text-align:center;
				line-height:16px;
			}
			#pageClass3 a:link,#pageClass3 a:visited{
				background:white;
				text-decoration: none;
				color:gray;
			}
			#pageClass3 a:hover,#pageClass3 a:active{
				text-decoration: none;
				background:#f93;
				color:white;
				line-height:16px;
				}
		</style>
	</head>

	<body>
		<h1>页码效果</h1>
		<h2>这是我原本想要去做的效果</h2>
		<div id="pageClass">
			<ul>
				<li><a href="http://www.iwcn.net/default.asp?cateID=3">1</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=4">2</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=5">3</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=6">4</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=8">5</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=9">6</a></li>
				<li><a href="http://www.iwcn.net/default.asp">7</a></li>
			</ul>
		</div>
		<h2>做完之后成这样了</h2>
		<div id="pageClass2">
			<ul>
				<li><a href="http://www.iwcn.net/default.asp?cateID=3">1</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=4">2</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=5">3</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=6">4</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=8">5</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=9">6</a></li>
				<li><a href="http://www.iwcn.net/default.asp">7</a></li>
			</ul>
		</div>
		<h2>改了改成这样了</h2>
		<div id="pageClass3">
			<ul>
				<li><a href="http://www.iwcn.net/default.asp?cateID=3">1</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=4">2</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=5">3</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=6">4</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=8">5</a></li>
				<li><a href="http://www.iwcn.net/default.asp?cateID=9">6</a></li>
				<li><a href="http://www.iwcn.net/default.asp">7</a></li>
			</ul>
		</div>
	</body>
</HTML>

Asp.Net中读取QQWry.Dat进行IP查询的方法

十二月 16th, 2006

如何用QQ数据库(QQWry.Dat)制作在线IP查询功能

[开发环境]VS.Net 2003
[编程语言]VB.Net

1.为什么要使用QQWry.Dat做为数据源来开发IP查询功能?
由于QQWry.Dat数据准确,且时常更新,较为方便。

2.如何读取QQWry.Dat中的数据?
以Asp.Net为例,详细介绍步骤:
a.新建一个web项目。
b.将QQWry.Dat保存到database目录下(可自己更改别的目录)
在Google中查找最新的QQWry.Dat
c.将IPLocation.dll下载保存到Bin目录下。如下图:
点击下载IPLocation.dll

d.在项目中添加引用,引用IPLocation.dll。
e.在程序代码前添加一行:

Imports IPLocation.IPLocation

f.调用函数IPLocate进行IP查询。

IPLocate(Byval StrConn as string,Byval StrIp as string)
'StrConn 为数据库连接字符串,如:Server.MapPath("database/QQWry.Dat")
'StrIP      为查询IP

完整例子下载:SkyDrive存储

Asp.Net中对Cookie的基本操作

十二月 15th, 2006

语言:vb

Imports System.Web.HttpContext
Public Class CookieFramework
    '写入单个Cookie
    Public Shared Function WriteCookie(ByVal CookieName As String, ByVal CookieValue As String, ByVal ExpiresDate As Integer) As Boolean
        Dim aCookie As New HttpCookie(CookieName)
        aCookie.Value = CookieValue
        aCookie.Expires = DateTime.Now.AddDays(ExpiresDate)
        System.Web.HttpContext.Current.Response.Cookies.Add(aCookie)
    End Function

    '给Cookie集合添加子项
    Public Shared Function WriteCookies(ByVal CookieName As String, ByVal CookieItem As String, ByVal ItemValue As String, ByVal ExpiresDate As Integer) As Boolean
        Dim aCookie As HttpCookie
        If Current.Request.Cookies(CookieName) Is Nothing Then
            aCookie = New HttpCookie(CookieName)
        Else
            aCookie = Current.Request.Cookies(CookieName)
        End If
        aCookie.Values(CookieItem) = ItemValue
        aCookie.Expires = DateTime.Now.AddDays(ExpiresDate)
        System.Web.HttpContext.Current.Response.Cookies.Add(aCookie)
    End Function
    '读取单个Cookie
    Public Shared Function ReadCookie(ByVal CookieName As String) As String
        If Current.Request.Cookies(CookieName) Is Nothing Then
            Return Nothing
        Else
            Return Current.Request.Cookies(CookieName).Value
        End If
    End Function

    '读取Cookie集合中的子项内容
    Public Shared Function ReadCookies(ByVal CookieName As String, ByVal CookieItem As String) As String
        If Current.Request.Cookies(CookieName) Is Nothing Then
            Return Nothing
        Else
            If Current.Request.Cookies(CookieName).Values(CookieItem) Is Nothing Then
                Return Nothing
            Else
                Return Current.Request.Cookies(CookieName).Values(CookieItem)
            End If
        End If
    End Function
    '删除整个Cookie
    Public Shared Function DeleteCookie(ByVal CookieName As String) As Boolean
        Dim aCookie As New HttpCookie(CookieName)
        Dim i As Integer
        Dim limit As Integer = Current.Request.Cookies.Count - 1
        For i = 0 To limit
            aCookie = Current.Request.Cookies(i)
            aCookie.Expires = DateTime.Now.AddDays(-1)
            Current.Response.Cookies.Add(aCookie)
        Next
    End Function
    '删除Cookie集合中的子项
    Public Shared Function DeleteCookies(ByVal CookieName As String, ByVal ItemName As String) As Boolean
        Dim aCookie As HttpCookie = Current.Request.Cookies(CookieName)
        aCookie.Values.Remove(ItemName)
        aCookie.Expires = DateTime.Now.AddDays(1)
        Current.Response.Cookies.Add(aCookie)
    End Function
End Class

基于标准的web项目开发模式探讨

十二月 12th, 2006

本文讨论的是如果开发一个符合w3c标准的web站点,重点探讨在新的设计与开发模式下,web项目组中的美工/页面制作人员/后台程序员三者之间如何有效地配合。为了便于阅读,制作了一个微缩型的项目。大家可以先预览一下最终效果

本文适合于对web标准已经有了初步了解的同行共同研究。对此感兴趣的朋友欢迎在博客里发表您的评论。

项目内容:首页上的一个新闻列表。

项目人员:网站美工一名/页面制作人员一名/程序员一名。(有很多人是三者合一的,哈哈。)

美工主要负责出效果图,截图。如下图:

然后对该图进行提取,得到相应的背景图片,见项目img文件夹。

程序员的工作有几下几点:

  • 根据需求设计网站数据库结构。
  • 定义底层相应的对象,如:user/news等等。
  • 定义数据访问层,包括访问数据库、编写存储过程等。
  • 提供表现层读取数据的方法供调用。

我这里定义的程序员几乎可以不了解html代码/javascript脚本/css样式。相对比较独立。
项目中的程序员工作部分被我简化了,想了解的朋友可参考vs.Net2003中自带的几个例子,分层做得很有借鉴价值。

页面制作人员的工作:(PS:我给页面制作人员的定义可能有些超纲了。)
一:对美工的效果图进行初步的页面实现,如根据上边的效果图,初步可写成以下代码:

<h4>八卦新闻</h4>
<ul>
<li>大学生为啥争当农民</li>
<li>TVB制造8大极品女明星</li>
<li>上流社会秘密旅馆的真相</li>
<li>大学生洗鸳鸯浴被曝光</li>
<li>男明星性感阳刚露点</li>
<li>明星挖鼻抠脚丑态</li>
<li>陈好是怎样变成美女的</li>
<li>X光揭秘魔术师&#34;吞剑&#34;</li>
<li>西安一村“喝尿”强身</lil>
<li>汪明荃青春惊艳旧照片 </li>
</ul>

二:将需要动态生成的部分换成程序员提供的相应接口,如例子中的代码为:

<ul>
<%
Call LoadTopNews()
%>
</ul>

如果程序员对html代码不熟悉,表现层的很多程序代码也应该由页面制作人员来实现,如上边的LoadTopNews()中涉及到了html代码,此部分如页面制作人员完成不了,也应该与程序员共同协商。根据页面制作人员的需要写出相应的程序代码。

三:CSS的页面效果实现。(略)

四:Javascript脚本的编写。本例子中仅设计了新闻的折叠显示功能,详见项目中js/common.js。(略)

写得有点粗糙,欢迎同行一起探讨!

源代码下载:一个简单的基于标准的web项目。

改善用户体验之密码强度提示

十二月 7th, 2006

功能说明:在用户注册或更改密码时,根据用户输入进行检测并返回结果。能有效地提醒用户提高帐号的安全性。

类似效果:Live.com中的修改密码功能

简单预览:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>密码</title>
<style type="text/css">
body{
	font-size:12px;
	font-family: Arial, Helvetica, sans-serif;
	margin:0;
}
form{
	margin:2em;
}
#chkResult{margin-left:53px;height:15px;}
</style>
</head>

<body>
<form name="form1">
	<label for="pwd">用户密码</label>
	<input type="password" name="pwd" onblur="chkpwd(this)" />
	<div id="chkResult"></div>
	<label for="pwd2">重复密码</label>
	<input type="password" name="pwd2" />
</form>
<script type="text/javascript">
	function chkpwd(obj){
		var t=obj.value;
		var id=getResult(t);

		//定义对应的消息提示
		var msg=new Array(4);
		msg[0]="密码过短。";
		msg[1]="密码强度差。";
		msg[2]="密码强度良好。";
		msg[3]="密码强度高。";

		var sty=new Array(4);
		sty[0]=-45;
		sty[1]=-30;
		sty[2]=-15;
		sty[3]=0;

		var col=new Array(4);
		col[0]="gray";
		col[1]="red";
		col[2]="#ff6600";
		col[3]="Green";

		//设置显示效果
		var bImg="attachments/month_0612/v200612702136.gif";//一张显示用的图片
		var sWidth=300;
		var sHeight=15;
		var Bobj=document.getElementById("chkResult");

		Bobj.style.fontSize="12px";
		Bobj.style.color=col[id];
		Bobj.style.width=sWidth + "px";
		Bobj.style.height=sHeight + "px";
		Bobj.style.lineHeight=sHeight + "px";
		Bobj.style.background="url(" + bImg + ") no-repeat left " + sty[id] + "px";
		Bobj.style.textIndent="20px";
		Bobj.innerHTML="检测提示:" + msg[id];
	}

	//定义检测函数,返回0/1/2/3分别代表无效/差/一般/强
	function getResult(s){
		if(s.length < 4){
			return 0;
		}
		var ls = 0;
		if (s.match(/[a-z]/ig)){
			ls++;
		}
		if (s.match(/[0-9]/ig)){
			ls++;
		}
	 	if (s.match(/(.[^a-z0-9])/ig)){
			ls++;
		}
		if (s.length < 6 && ls > 0){
			ls--;
		}
		return ls
	}
</script>
</body>

</html>

使用方法:
第一步:保存图片
第二步:根据您的需要修改js文件中该图片地址。如下所示:

var bImg="pwdlen.gif";//一张显示用的图片

第三步:在需要检测的页面中引用这个脚本文件,如下所示:

<script type="text/javascript" src="chkpwd.js"></script>

第四步:在网页的表单中,找到密码输入框添加onblur事件驱动,然后添加一个Div,如下所示:

<input type="password" name="pwd" onblur="chkpwd(this)" />
<div id="chkResult">强度检测</div>

第五步:根据您页面的需要通过样式表CSS重新定义#chkResult的摆放位置,以合适您网页的整体布局。

完整效果预览:点击这里

脚本文件chkpwd.js 下载:点击下载此文件