随笔-60  评论-35  文章-15  trackbacks-0
 
探讨形式美的法则,是所有设计学科共通的课题,那么,它的意义何在呢?在日常生活中,美是每一个人追求的精神享受。当你接触任何一件有存在价值的事物时,它必定具备合乎逻辑的内容和形式。在现实生活中,由于人们所处经济地位、文化素质、思想习俗、生活理想、价值观念等不同而具有不同的审美观念。然而单从形式条件来评价某一事物或某一视觉形象时,对于美或丑的感觉在大多数人中间存在着一种基本相通的共识。这种共识是从人们长期生产、生活实践中积累的,它的依据就是客观存在的美的形式法则,我们称之为形式美法则。在我们的视觉经验中,高大的杉树、耸立的高楼大厦、巍峨的山峦尖峰等,它们的结构轮廓都是高耸的垂直线,因而垂直线在视觉形式上给人以上升、高大、威严等感受;而水平线则使人联系到地平线、一望无际的平原、风平浪静的大海等,因而产生开阔、徐缓、平静等感受…… 这些源于生活积累的共识,使我们逐渐发现了形式美的基本法则。在西方自古希腊时代就有一些学者与艺术家提出了美的形式法则的理论,时至今日,形式美法则已经成为现代设计的理论基础知识。在设计构图的实践上,更具有它的重要性。形式美法则主要有以下几条:
和谐
对比与统一
对称
均衡
比例
视觉重心
节奏与韵律
联想与意境

和谐

宇宙万物,尽管形态千变万化,但它们都各按照一定的规律而存在,大到日月运行、星球活动,小到原子结构的组成和运动,都有各自的规律。爱因斯坦指出:宇宙本身就是和谐的。和谐的广义解释是:判断两种以上的要素,或部分与部分的相互关系时,各部分所给我们的感受和意识是一种整体协调的关系。和谐的狭义解释是统一与对比两者之间不是乏味单调或杂乱无章。单独的一种颜色、单独的一根线条无所谓和谐,几种要素具有基本的共通性和溶合性才称为和谐。比如一组协调的色块,一些排列有序的近似图形等。和谐的组合也保持部分的差异性,但当差异性表现为强烈和显著时,和谐的格局就向对比的格局转化。

对比与统一

对比又称对照,把反差很大的两个视觉要素成功地配列于一起,虽然使人感受到鲜明强烈的感触而仍具有统一感的现象称为对比,它能使主题更加鲜明,视觉效果更加活跃。对比关系主要通过视觉形象色调的明暗、冷暖,色彩的饱和与不饱和,色相的迥异,形状的大小、粗细、长短、曲直、高矮、凹凸、宽窄、厚薄,方向的垂直、水平、倾斜,数量的多少,排列的疏密,位置的上下、左右、高低、远近,形态的虚实、黑白、轻重、动静、隐现、软硬、干湿等多方面的对立因素来达到的。它体现了哲学上矛盾统一的世界观。对比法则广泛应用在现代设计当中,具有很大的实用效果。


对称

自然界中到处可见对称的形式,如鸟类的羽翼、花木的叶子等。所以,对称的形态在视觉上有自然、安定、均匀、协调、整齐、典雅、庄重、完美的朴素美感,符合人们的视觉习惯。平面构图中的对称可分为点对称和轴对称。假定在某一图形的中央设一条直线,将图形划分为相等的两部分,如果两部分的形状完全相等,这个图形就是轴对称的图形,这条直线称为对称轴。假定针对某一图形,存在一个中心点,以此点为中心通过旋转得到相同的图形,即称为点对称。点对称又有向心的“求心对称”,离心的“发射对称”,旋转式的“旋转对称”,逆向组合的“逆对称”,以及自圆心逐层扩大的“同心圆对称”等等。在平面构图中运用对称法则要避免由于过分的绝对对称而产生单调、呆板的感觉,有的时候,在整体对称的格局中加入一些不对称的因素,反而能增加构图版面的生动性和美感,避免了单调和呆板。

均衡

在衡器上两端承受的重量由一个支点支持,当双方获得力学上的平衡状态时,称为平衡。在平面构成设计上的平衡并非实际重量×力矩的均等关系,而是根据形象的大小、轻重、色彩及其他视觉要素的分布作用于视觉判断的平衡。平面构图上通常以视觉中心(视觉冲击最强的地方的中点)为支点,各构成要素以此支点保持视觉意义上的力度平衡(如图。在实际生活中,平衡是动态的特征,如人体运动、鸟的飞翔、野兽的奔驰、风吹草动、流水激浪等都是平衡的形式,因而平衡的构成具有动态。r

比例

比例是部分与部分或部分与全体之间的数量关系。它是精确详密的比率概念。人们在长期的生产实践和生活活动中一直运用着比例关系,并以人体自身的尺度为中心,根据自身活动的方便总结出各种尺度标准,体现于衣食住行的器用和工具的制造中。比如早在古希腊就已被发现的至今为止全世界公认的黄金分割比1:1. 618正是人眼的高宽视域之比。恰当的比例则有一种谐调的美感,成为形式美法则的重要内容。美的比例是平面构图中一切视觉单位的大小,以及各单位间编排组合的重要因素。

视觉重心

重心在物理学上是指物体内部各部分所受重力的合力的作用点,对一般物体求重心的常用方法是:用线悬挂物体,平衡时,重心一定在悬挂线或悬挂线的延长线上;然后握悬挂线的另一点,平衡后,重心也必定在新悬挂线或新悬挂线的延长线上,前后两线的交点即物体的重心位置。在平面构图中,任何形体的重心位置都和视觉的安定有紧密的关系。人的视觉安定与造形的形式美的关系比较复杂,人的视线接触画面,视线常常迅速由左上角到左下角,再通过中心部分至右上角经右下角,然后回到以画面最吸引视线的中心视圈停留下来,这个中心点就是视觉的重心。但画面轮廓的变化,图形的聚散,色彩或明暗的分布等都可对视觉重心产生影响。因此,画面重心的处理是平面构图探讨的一个重要的方面。在平面广告设计中,一幅广告所要表达的主题或重要的内容信息往往不应偏离视觉重心太远。

节奏与韵律

节奏本是指音乐中音响节拍轻重缓急的变化和重复。节奏这个具有时间感的用语在构成设计上是指以同一视觉要素连续重复时所产生的运动感。
韵律原指音乐(诗歌)的声韵和节奏。诗歌中音的高低、轻重、长短的组合,匀称的间歇或停顿,一定地位上相同音色的反复及句末、行末利用同韵同调的音相加以加强诗歌的音乐性和节奏感,就是韵律的运用。平面构成中单纯的单元组合重复易于单调,由有规则变化的形象或色群间以数比、等比处理排列,使之产生音乐、诗歌的旋律感,称为韵律。有韵律的构成具有积极的生气,有加强魅力的能量。

联想与意境

平面构图的画面通过视觉传达而产生联想,达到某种意境。联想是思维的延伸,它由一种事物延伸到另外一种事物上。例如图形的色彩:红色使人感到温暖、热情、喜庆等;绿色则使人联想到大自然、生命、春天,从而使人产生平静感、生机感、春意等等。各种视觉形象及其要素都会产生不同的联想与意境,由此而产生的图形的象征意义作为一种视觉语义的表达方法被广泛地运用在平面设计构图中。
随着科技文化的发展,对美的形式法则的认识将不断深化。形式美法则不是僵死的教条,要灵活体会,灵活运用。
posted @ 2007-01-25 13:53 Q系列类、方法、变量…… 阅读(599) | 评论 (0)编辑 收藏
为了使界面设计有步奏,流程清晰明了. 所以对界面按系统设计划分层次. 界面设计时可分以下三个设计层次.

1 结构设计层:
产品的整体架构, 纸上完成的低保真原型.它主要是用来确定软件的结构,如:控件如何布局,窗体闲的如何切换。由设计师在纸上或一些工具上实现的不带数据流的简单界面原型.

2 视觉设计层:
根据结构层, 在原型的基础上,对影响用户视觉的界面元素层(负责显示信息,图片的层)以人机交互机制为依据进行进一步的设计.如:界面颜色,信息显示方式, 图标使用,字体大小颜色设定等.

3 交互设计层:
对届面中与影响用户操作的元素, 如操作反馈, 语言用法等,根据机制进行的设计。

为了设计者有规可循,根据用户界面设计的目标 ,制定了一些机制,可为开发人员的设计标准.
用户界面设计要以用户为中心,处处为用户设想。所以必须以用户为目标出发,从界面的元素,布局, 信息流,用户操作环境及人的心理生理特点出发,设立以下的机制。

1.界面布局机制
软件界面中人接触最多的,也是界面的基础。它与人的视觉, 记忆,手部操作都有关。
因此这机制的目标: 提高界面的可读性,舒适性,使操作时间最短

2.信息输出输入机制
界面与用户最基本的交流就是信息,因此需建立此机制。它与人的视觉, 记忆,手部操作都有关。
目标: 人性化,使用户明白系统所输入输出的信息, 减轻人脑和手的负担

3.防错机制
是人都会有错, 但是并不意味着让错误发生,尽量减少错误的发生,至少也不要增加不必要的错误。
目标: 尽量防止因人为或系统原因而产生错误

4.窗体闲切换机制
界面最常发生的是窗体切换, 也要考虑到对人得影响。
目标:使窗体闲切换更合理和方便

5.系统帮助机制
软件都少不了帮助系统, 因此也该考虑。
目标:减轻人脑和手的负担, 使系统更易用

6.系统反馈机制
反馈是系统与用户交互的基本元素之一, 也是常发生的 。所以也需为其定下机制。
目标:防止用户因不了解系统当前状态而犯错, 不耐烦, 不能及时处理工作

7.冗余机制
根据第二定律所设下的机制。
目标: 减少系统干扰用户, 加快执行速度

8.一致性机制
本来它是机制中的一个原则, 但是它却存在于各个机制中, 因此需另外提出以视强调~
posted @ 2007-01-25 13:50 Q系列类、方法、变量…… 阅读(173) | 评论 (0)编辑 收藏
1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键
<table border oncontextmenu=return(false)><td>no</table> 可用于Table
2. <body onselectstart="return false"> 取消选取、防止复制
3. onpaste="return false" 不准粘贴

4. oncopy="return false;" oncut="return false;" 防止复制

5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标

6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标

7. <input style="ime-mode:disabled"> 关闭输入法

8. 永远都会带着框架
<script language="javascript"><!--
if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页
// --></script>

9. 防止被人frame
<SCRIPT LANGUAGE=javascript><!--
if (top.location != self.location)top.location=self.location;
// --></SCRIPT>

10. <noscript><iframe src=*.html></iframe></noscript> 网页将不能被另存为

11. <input type=button value=查看网页源代码
onclick="window.location = 'view-source:'+ 'http://www.csdn.net/'">

12. 怎样通过asp的手段来检查来访者是否用了代理
<% if Request.ServerVariables("HTTP_X_FORWARDED_FOR")<>"" then
response.write "<font color=#FF0000>您通过了代理服务器,"& _
"真实的IP为"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")
end if
%>

13. 取得控件的绝对位置

//javascript
<script language="javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"nleft="+l);
}
</script>

//VBScript
<script language="VBScript"><!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
end function
--></script>

14. 光标是停在文本框文字的最后
<script language="javascript">
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart('character',e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">

15. 判断上一页的来源
asp:
request.servervariables("HTTP_REFERER")

javascript:
document.referrer

16. 最小化、最大化、关闭窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" value="Close"></OBJECT>

<input type=button value=最小化 onclick=hh1.Click()>
<input type=button value=最大化 onclick=hh2.Click()>
<input type=button value=关闭 onclick=hh3.Click()>
本例适用于IE

17.
<%
'定义数据库连接的一些常量
Const adOpenForwardOnly = 0 '游标只向前浏览记录,不支持分页、Recordset、BookMark
Const adOpenKeyset = 1 '键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark
Const adOpenDynamic = 2 '动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。
Const adOpenStatic = 3 '静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动

Const adLockReadOnly = 1 '锁定类型,默认的,只读,不能作任何修改
Const adLockPessimistic = 2 '当编辑时立即锁定记录,最安全的方式
Const adLockOptimistic = 3 '只有在调用update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等
Const adLockBatchOptimistic = 4 '当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的

Const adCmdText = &H0001
Const adCmdTable = &H0002
%>

18. 网页不会被缓存
HTM网页
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或者<META HTTP-EQUIV="expires" CONTENT="0">
ASP网页
Response.Expires = -1
Response.ExpiresAbsolute = Now() - 1
Response.cachecontrol = "no-cache"
PHP网页
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");

19. 检查一段字符串是否全由数字组成
<script language="javascript"><!--
function checkNum(str){return str.match(/D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>

20. 获得一个窗口的大小
document.body.clientWidth,document.body.clientHeight

21. 怎么判断是否是字符
if (/[^x00-xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");

22.TEXTAREA自适应文字行数的多少
<textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
</textarea>

23. 日期减去天数等于第二个日期
<script language=javascript>
function cc(dd,dadd)
{
//可以加上错误处理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
}
cc("12/23/2002",2)
</script>

24. 选择了哪一个Radio
<HTML><script language="vbscript">
function checkme()
for each ob in radio1
if ob.checked then window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="style" checked>Style
<INPUT name="radio1" type="radio" value="barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>

25.获得本页url的request.servervariables("")集合
Response.Write "<TABLE border=1><!-- Table Header --><TR><TD><B>Variables</B></TD><TD><B>value</B></TD></TR>"
for each ob in Request.ServerVariables
Response.Write "<TR><TD>"&ob&"</TD><TD>"&Request.ServerVariables(ob)&"</TD></TR>"
next
Response.Write "</TABLE>"

26.
本机ip<%=request.servervariables("remote_addr")%>
服务器名<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间<%=now%>
IIS版本<%=Request.ServerVariables"SERVER_SOFTWARE")%>
脚本超时时间<%=Server.ScriptTimeout%>
本文件路径<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎<%=ScriptEngine & "/"& ScriptEngineMajorVersion &"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统<%=Request.ServerVariables("OS")%>

27.ENTER键可以让光标移到下一个输入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">

28. 检测某个网站的链接速度:
把如下代码加入<body>区域中:
<script language=javascript>
tim=1
setInterval("tim++",100)
b=1

var autourl=new Array()
autourl[1]="http://www.njcatv.net/"
autourl[2]="javacool.3322.net"
autourl[3]="http://www.sina.com.cn/"
autourl[4]="www.nuaa.edu.cn"
autourl[5]="http://www.cctv.com/"

function butt(){
document.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO onclick=window.open(this.form.url"+i+".value)><br/>")
document.write("<input type=submit value=刷新></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="链接超时"}
else
{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}
b++
}
function run(){for(var i=1;i<autourl.length;i++)document.write("<img src=http://"+autourl[i]+"/"+Math.random()+" width=1 height=1 onerror=auto('http://"/;;;;;+autourl[i]+"')>")}
run()</script>

29. 各种样式的光标
auto :标准光标
default :标准箭头
hand :手形光标
wait :等待光标
text :I形光标
vertical-text :水平I形光标
no-drop :不可拖动光标
not-allowed :无效光标
help :?帮助光标
all-scroll :三角方向标
move :移动标
crosshair :十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize

1、 去掉IE的滚动条
有时候做好的网页明明没有超出窗口,可IE却偏偏给加上滚动条,这样看上去很不舒服,其实这也是可以通过一些小技巧避免的。具体如下:
<body style=”overflow-x:hidden”>…</body> //去掉X轴方向的滚动条
<body style=”overflow-y:hidden”>…</body> //去掉Y轴方向的滚动条
<body style=”overflow:hidden”>…</body> //去掉全部的滚动条
现在你看到的和你想像中的网页应该一样了吧,如果其中有什么不明白的地方可以参照注释中的说明。

2、 使网页中的复制无效
有方法防止网页被保存了(参见《你别看我的源代码》),可不可以也防止网页内容被复制呢?答案是当然可以。看看下面的例子你就会明白的。
<html>
<head>
<script language=”javascript”>
function nocopy() {
alert(“对不起,你不能非法复制本站内容”);
event.returnvalue=false;
}
</script>
</head>
<body oncopy=”nocopy()”>copyright by commander.</body>
</html>
这其实中是利用了document的一个oncopy事件,也就是说当发生复制事件时,弹出警告框,同时事件(event)的返回值为false使oncopy事件失效,从而达到防止复制的目的。

3、 用脚本控制浏览器
看到标题是不是有点不相信,那么试试下面的这几个例子吧!你一定会吃惊的。
在<body>和</body>之间加入如下代码:
<button onclick=”document.execCommand('open')”>打开</button>
<button onclick=”document.execCommand('saveas')”>另存为…</button>
<button onclick=”document.execCommand('print')”>打印</button>
上面其实都是利用了document.execCommand()这个内置的函数,其参数为相应的浏览器命令,还有很多命令就留给大家自己发现吧!

4、 IFrame也可以编辑文字
有没有想过除了表单(<form>)之外还有其它的网页元素可以编辑文字呢?只要使用IFrame的隐藏的一个属性就可以使IFrame成为一个文本编辑器。
<html>
<body onload=”editer.document.designMode='On'”>
<IFrame ID=”editer”></IFrame>
</body>
</html>
其中designMode属性表示IFrame的设计模式的状态(开/关),还在犹豫什么呢,快试试吧!
只要巧妙的利用这一特性就可以制作很多意想不到的效果。如果下面我们来做一个图片编辑器。
<html>
<body onload=”imgEditer.document.designMode='On';imgEditer.document.write('<img src=图片.gif>')”>
<IFrame id=”imgEditer”></IFrame>
</body>
</html>
用鼠标点击图片是不是有新的发现,其实大家只要利用自己的想象和充分利用这个属性一定能做出更多的花样来,别忘了到时候有什么新的东东,告诉我一声呀!(Email:BluePBoy@yesky.com)

5、 打开硬盘
这是打开硬盘的另一种方法,把它写出来只是想告诉大家,要达到同一个目的有很多种方法,这里就是利用了表单的Action属性达到的,其实打开硬盘有很多种方法,只是这种不太被人们注意,所以这里就选择了这种方法。
<form action=file ://c|><input type=”submit” value=”打开C盘”></form>
posted @ 2007-01-25 13:48 Q系列类、方法、变量…… 阅读(227) | 评论 (0)编辑 收藏
正度纸张:787×1092mm
开数(正度) 尺寸 单位(mm)
全开 781×1086
2开 530×760 3开 362×781
4开 390×543 6开 362×390
8开 271×390
16开 195×271
注:成品尺寸=纸张尺寸-修边尺寸

大度纸张:850*1168mm
开数(正度) 尺寸 单位(mm)
全开 844×1162
2开 581×844 3开 387×844
4开 422×581 6开 387×422
8开 290×422
注:成品尺寸=纸张尺寸-修边尺寸

常见开本尺寸(单位:mm)
开本尺寸:787 x 1092
对开:736 x 520
4开:520 x 368
8开:368 x 260
16开:260 x 184
32开:184 x 130

开本尺寸(大度):850 x 1168
对开:570 x 840
4开:420 x 570
8开:285 x 420
16开:210 x 285
32开:203 x 140

正度纸张:787×1092mm
开数(正度) 尺寸 单位(mm)
全开 781×1086
2开 530×760
3开 362×781
4开 390×543
6开 362×390
8开 271×390
16开 195×271
注:成品尺寸=纸张尺寸-修边尺寸

大度纸张:850*1168mm
开数(正度) 尺寸 单位(mm)
全开 844×1162
2开 581×844
3开 387×844
4开 422×581
6开 387×422
8开 290×422
注:成品尺寸=纸张尺寸-修边尺寸

16开 大度:210×285 正度:185×260
8开 大度:285×420 正度:260×370
4开 大度:420×570 正度:370×540
2开 大度:570×840 正度:540×740
全开 大:889×1194 小:787×1092

名片

横版:90*55mm<方角> 85*54mm<圆角>
竖版:50*90mm<方角> 54*85mm<圆角>
方版:90*90mm 90*95mm

IC卡  85x54MM

三折页广告
标准尺寸: (A4)210mm x 285mm

普通宣传册
标准尺寸: (A4)210mm x 285mm

文件封套
标准尺寸:220mm x 305mm

招贴画:
标准尺寸:540mm x 380mm

挂旗
标准尺寸:8开 376mm x 265mm

4开 540mm x 380mm

手提袋:
标准尺寸:400mm x 285mm x 80mm

信纸 便条:
标准尺寸:185mm x 260mm 210mm x 285mm~
posted @ 2007-01-25 13:47 Q系列类、方法、变量…… 阅读(152) | 评论 (0)编辑 收藏
通过基本色调生成10种不同灰度的相同色,并且能生成png文件。
http://slayeroffice.com/tools/color_palette/

4096 Color Wheel Version 2.1
非常漂亮的自然色抓取工具,用鼠标点取颜色,非常方便。
http://www.ficml.org/jemimap/style/color/wheel.html

technicolor
用鼠标拖动滑杆,再根据基色生成系统推荐的色调,最棒的是还能根据你选择的颜色生成标准的css文件。
http://www.themaninblue.com/experiment/Technicolor/

color scheme generator 2
这也许是至今为止最专业的调色板了。不但能根据选择的基色生成相关的配色方案,还有根据颜色的饱和度,明亮度等等只有在photoshop里看见的调节功能,系统还提供推荐方案,有专门为色盲和色弱者推荐的颜色方案。
http://wellstyled.com/tools/colorscheme/index-en.html

colr.org
从网站Url就能看出这也是一个专业的color site。color.org最酷的就是应用了tag,你可以输入forest(森林)这个词,系统自动根据你给出的词生成相关的颜色方案,输入love 后我得到的大多是粉红基色调,很准确吧!系统有11000多种颜色tag和20000种颜色方案、7000多个调色板。当然,这个tag。。这个tag不支持中文的...
http://colr.org/

color blender
这个也是一个很有特色的调色板。输入两种截然不同的颜色,系统根据这两种颜色生成渐变色带。
http://www.meyerweb.com/eric/tools/color-blend/

color schemer v2
这个是color scheme generator 2的另一个版本
http://www.colorschemer.com/online.html

visibone color lab
这是第一个根据网页安全色制作的调色板,使用简单,鼠标不停的点,直到碰上让你感觉满意的效果。
http://www.visibone.com/colorlab/

RGB color charts
基于RGB原理的,不过系统生成的颜色很舒服。
http://lodestone.org/people/maria/design/colors.html

full screen picker
这是一个基于浏览器的颜色拾取器,想必下,这种工具还是使用客户端的程序比较方便些。
http://milov.nl/iambald/24.html

colormixers
一边拉滑杆,一边看颜色的变化,相当方便。
http://colormixers.com/mixers/cmr/

以下也是一些color tools的相关链接:
http://www.colormatch.dk/
http://slayeroffice.com/tools/color_palette/
http://kohaistyle.com/scripts/quickcolor
http://www.easyrgb.com/harmonies.php
http://www.stcsig.org/usability/topics/colorblind.html
http://color.twysted.net
http://www.coolhomepages.com/cda/color
http://www.masternewmedia.org/2003/04/30/

http://dev.sessions.edu/ilu/ilu_1.htmlhttp://www.technetguru.com/design
http://www.mundidesign.com/webct
http://graphicdesign.about.com/library/color/blweb2.htm
http://www.pourpre.com/chromograf/en/
http://www.webwhirlers.com/colors/wizard.asp
http://www.colorcoordinator.com/colorCoordinator.php

当前最热门的十种颜色:
Moroccan blue :#081b55
Glazed ginger:#da4912
American beauty:#d31112
Ruby wine:#780e1a
Atmosphere:#c4a47b
Burnt olive:#565d10
Gloxinia:#530752
Rattan:#ffdc28
Moss:#a9a40c
Burnt orange:#fe690d
posted @ 2007-01-24 15:01 Q系列类、方法、变量…… 阅读(351) | 评论 (0)编辑 收藏
提高blog访问量的秘技与非秘技提高blog访问量的秘技与非秘技
注:这里的Blog主要指在Blog托管网站申请的个人Blog

1、尽早申请blog,早申请一天就多一天被点击。比如LoveBNU的blog,除了量大以外,能高居前列最关键是申请得早......ft,呵呵
2、记住,"参数设置"是一个好东西,你可以在任何时候,不需要更新文章,改动一个参数,你的blog就会被列入首页"最新更新"之中......半个小时或者一个小时以后,虽然你从最新更新表上落了下来,你可以将上面更改过的参数改回来。(不准砸我鸡蛋,老婆说不让我告诉大家的,呜呜,我可承受了压力才说出来的,可以比得上315晚会揭黑批劣的英雄啊)
3、你的内容还是要好。但其实好是骗人的,不好照样可以,那你得持续更新啊......比如不断更新,告诉大家你是一个正正经经的blogger,blog是你的"生活方式",所以你需要每天叫嚷一下,"我更新了"。

4、好酒不怕巷子深,真的,如果你没打算卖,只想留着自己喝。可是如果你打算兜售一下自己,而且有暴露癖好,那一定要去各大版面贴广告。这是一个持续的行为,要把握一切机会,在bbs的各个版面随时以各种方式提到自己的blog。方法如下:我的blog又更新了。大家看我的blog啊。其实你写的这篇文章我在blog里面讨论过了。......

5、把你的blog转载到版面吧,真的,可以全部转载,对于那些精彩的文章,这是为了打品牌。还有就是转载一部分或者写个简介,提起大家的兴趣,引诱大家点击你的blog链接观看。

6、你的签名档还没有改成blog的广告?ft,太落后了。我的个人说明档和昵称都是blog广告了。还可以持续性的更换广告词。你看过精彩广告词吗?比如说 "我blog,我暴露,我存在",或者"人类文明史上最好的blog"......

7、想让你的文章变成"热门话题"吗?很简单,发表blog以后立刻让自己的好友去re文,插科打诨均可,如果不好意思麻烦别人,可以调动自己隐藏的若干马甲re文,或者干脆用自己的id直接re好了。把一篇文章分三段写进去,或者在写完文章以后re文贴很多补充材料......哇哇哇,谁脸皮厚,谁自己 re文多,谁就能上热门话题。当然,如果有人re了你的文章,你一定要很很很好客地再re才成......最好两人在这聊天......

8、你还想上"点击排行",哈哈,这个太容易了。在telnet方式下进入你的blog该篇文章,反复阅读,你没有心脏病吧,不要被疯狂增长的数字吓坏......

9、每隔半个小时自己点击自己blog一次,积少成多。

10、你一定要串门,去人家blog里面看看,在别人的blog里面re文来做自己的广告......对了,你一定要re他三四天前的文章,这样不会帮助他增长他的"热门话题"。

11、其实最好的办法,是和windtear商量,让他把他很大访问量的网站里面的某些个内容直接链接到你的blog页面上,光当,不要被访问量打败,要镇定自若偷偷欢喜。不过,你可能需要报告他一次,那有何妨呢?反正,反正,访问量第一嘛......

12、原创会比转载让你得到更多的尊重!但是,如果转载一些黄色笑话,光当,或者转载一些标题醒目的话题,比如,比如,"泡mm绝对有效的十大法则","瘦身九大法宝"......本人郑重声明,严禁转载"提高blog访问量的秘技与非秘技"一文!!!

13、贴图吧,别老土了,都是看图时代了。随便贴几张图,ppmm效果最好,轻松超过那些写字写得累死的老土。

14、如果没有人引用你的blog怎么办?你可以去公众网申请一个blog,反反复复引用你自己在smth的blog,呵呵,反正引用通告是通用的......谁砸我,我跟你没完。

15、时不时地对blog发表一下看法,既然大家都在blog,所以都关心对blog的看法。如果你写了一个"我最喜欢的几个blog",肯定受人欢迎,而且你还可以将之分为上下篇,或者上中下,或者甲乙丙丁......

16、高级秘技:去各大黄色网站贴文,"保证喷鼻血的裸体mm",然后链接到你自己的blog......看吧,你终于认识到那些没人说话或者说话很少的黄色网站究竟有多么大的阅读量了。当你看到自己blog访问量狂增以后,你也许就放弃blog,投身伟大的黄色事业......

17、选择没有人选择的blog分类目录,这样会给你带来意外的好处,因为你自己的文章就有机会出现在"分类主题"里面。

完了,大家都知道了,我就没有可混的了,痛哭啊...
posted @ 2007-01-24 12:59 Q系列类、方法、变量…… 阅读(181) | 评论 (1)编辑 收藏
页面美工设计需要注意的几点

1、注意页面的分块,着手设计一个页面的时候,你必须根据所掌握的内容,以及其风格,对页面的整体进行分块。分块是一个非常必要且难以掌握的技巧。对于一般杂志来说,它们是有边的,这意味着杂志美工设计师有边可循,依靠边来形成立体感,依靠边来产生未尽的意韵;但是对于web页面,边的概念被淡化了,屏幕可以上下左右的拖动。所以此时分块显得非常必要,目的也就是产生边的效果。
  分块可以用不同着色的色块、框、细线、排列整齐的英文等等,还可以混合使用,但是注意不要过于醒目,因为页面的重点在内容,而不在其他。

2、色彩的平衡与呼应。
  1)色彩的平衡。色彩在页面中可以形成很多的效果,通过强烈的对比,可以突出页面的重点。还可以通过色彩调配,达到页面稳重度的改变。一般的情况下,页面上方的颜色总是很重,这样才能压住下面的颜色,如果不采取这种办法,整个页面将显得很不稳重,底下的文字图片,有飘出的意味。因此,要使整个页面显得很平衡,必须要有能镇住其他颜色的色彩。
  2)色彩的呼应。一种比较突出的色彩,如果很突兀地放在页面中,无论你是突出重点也好,还是logo图标,都给整个页面带来了副作用。为此,你必须在相对称的位置加上该色系(对于页面并不醒目)的色彩以呼应,这样可以弱化这种视觉的冲击。

3、精确到1个像素
  如果你是一个成功的页面设计者,你至少会在做出页面前已经把整个页面构思好了;如果你很宽容地对待图片中1个像素的差别,那说明你还不是很合格。
posted @ 2007-01-24 12:58 Q系列类、方法、变量…… 阅读(173) | 评论 (0)编辑 收藏
您的电子商务每天都在变,您的通信地址会变,您的电话号码会变,您的传真、手机、BB机号码会变,您的公司名称也会变、您的雇员也会变。。。
唯有一样东西不会变,您的网址!对于您的电子商务,您的网址是您最大的品牌。
用“有目共睹”来形容时下网站宣传不过分。天上飘的,地下踩的,空气中游的,到处弥漫着网址。现在连人们的听觉都不放过,不信?如果您在上海的人民广场地铁车站,您就能听到报站声中也有网址。
人的触觉、嗅觉不能感觉到网址。不然,网址可以溶解在水中沐浴您的皮肤,掺在空气中让您闻,调入饭菜里让您尝。
我们将所能见到的网站宣传大致分类如下,您看看什么适合您,最大程度宣传您的网址。
公众出没的地方:广告牌、汽车外表、商店或公司招牌、街路横幅、建筑物外墙、灌木与花草修剪图案、路边美化告示牌、招标牌、海报、集会向导牌、场馆记分牌、地铁站台地面、商业街路面、游艇、气球、空中飞机坠帘
媒体:电视台、电台、报纸、杂志、电影院广告片、网络本身
印刷品:黄页、海报、实用小册子、入场券、传单、帐单、优惠券、邮局通知单、票据、价格表、时刻表、地图、慈善事业发行物
公司对外联络:生意名片、公司信纸、信封、传真抬头、电子邮件、产品目录、支票、传单、公司或财务声明、感谢信、竞标书、文件夹、电话答录机
产品附件:书签、鼠标垫、坐垫、餐厅餐巾纸、纸杯、糖果包裹物、汽车垃圾袋、饮料杯、软件banner广告、浏览器收藏夹、屏保程序图形、电子贺卡
礼品:购物袋、T恤衫,汗衫、帽子、领带、雨伞、钥匙圈、记事簿、笔、手提袋、粘贴小磁物、图章、粘贴便条纸、画板、台历、挂历、拐杖、窗刷等清洁工具、牙刷剃须刀等工具
在合适的时间和场合,向合适的人宣传您的网址,让他人象背英语单词一样记住您的网址。
posted @ 2007-01-24 12:58 Q系列类、方法、变量…… 阅读(181) | 评论 (0)编辑 收藏
一. 什么是AJAX?

  这个名字代表了异步JavaScript+ XMLHTTPRequest,并且意味着你可以在基于浏览器的JavaScript和服务器之间建立套接字通讯。其实AJAX并不是一种新技术,而是已经成功地用于现代浏览器中的若干成功技术的可能性组合。所有的AJAX应用程序实现了一种“丰富的”UI——这是通过JavaScript操作HTML文档对象模型并且经由XMLHttpRequest实现的精确定位的数据检索来实现的。典型的示例AJAX应用程序是Google Labs( http://labs.google.com )的Google Maps和Google Suggest。这些应用程序现场监视用户输入并且提供实时的页面更新。最重要的是,在用户通过地图导航或输入一个查找字符串的同时,这些事件不需要刷新页面。

  事实上,支持这些令人感到惊讶的应用的技术已经出现一段时间了,尽管它们要求复杂的技能以及使用浏览器的技巧。一些专利产品就提供了相似的能力——如Macromedia Flash插件,Java Applets或.NET运行时——在达到实用上已经有一段时间了。把一种可与服务器通话的脚本组件引入到浏览器中的思想早在IE 5.0中就已经存在。Firefox和其它流行的浏览器也加入到浏览器大军中并以一种内置对象形式支持XMLHTTPRequest。随着跨平台浏览器的出现,这些技术得到了认可并在2004年3月一家称为Adaptive Path的公司中正式提出了AJAX。

  简而言之,由于来自于Google的支持和安装了一点可用的浏览器技术,加上为了一种"更好的用户体验",每个人都在把客户端技术添加到Web应用程序上。

  二. AJAX与传统应用程序的区别

  一个传统Web应用程序模型实际上是一种基本的事件——用户被迫提交表单以实现页面交换。也就是说,表单提交和页面传送无法得到保证:还有更坏的情形——用户需要再次点击。这与AJAX截然不同-——数据跨过线路而不是完整的HTML页面传输。这种数据交换是经由特定的浏览器对象:XMLHttpRequest实现的;再由适当的逻辑来处理每个数据请求的结果,页面的特定区域而不是完整的页面被更新。结果是更快的速度,更少的拥挤和更好的信息传送控制。

  传统型"click-refresh"Web应用程序强迫用户中断工作过程而等待页面的重装。通过引入AJAX技术,一个客户端脚本能够异步地与服务器通话,而用户仍能保持输入数据。除了对用户透明之外,这样的异步意味着服务器可以有更多时间来处理请求。

  传统Web应用程序把所有的处理代理到服务器并且强迫服务器进行状态管理。AJAX允许灵活划分应用程序逻辑以及客户和服务器之间的状态管理。这就消除了一种"click-refresh"依赖性并且提供更好的服务器可伸缩性。当该状态存储在客户端,你就不必跨越服务器来维持会话或保存/结束状态-其使用期限是由客户端来定义的。

  三. AJAX——分布式的MVC

  尽管AJAX应用程序依靠JavaScript来实现描述层,然而处理能力和知识库仍然存在于服务器上。此时,AJAX应用程序大量的与J2EE服务器通讯——把数据输入/输出Web服务和servlets。具有基于AJAX的描述层的J2EE应用程序和标准J2EE应用程序之间的区别首先在于,MVC是通过线路分布的。通过使用AJAX,视图是本地的,而模型和控制器是分布式的——这使得开发者能够灵活地决定哪些部件会是基于客户端的。具体地说,本地视图通过巧妙地操作HTML DOM而生成图形;控制器局部地处理用户输入并且根据开发者的判断扩展到服务器的处理——经由HTTP请求(Web服务,XML/RPC或其它)实现;模型的远程部分是根据客户端需要而下载的以达到实时更新客户端页面;并且状态是在客户端收集的。

  在以后的AJAX文章中,我们将比较深入地讨论这里的每一种组件并提供有关它们联合在一起进行应用的示例。现在,先不多说,让我们详细地分析一个简单的AJAX示例。

  四. 邮政区号校验和查询

  我们将创建一个包含三个INPUT字段(Zip,City和 State)的HTML页面。我们将保证,只要用户输入邮政区号的前三个数字,该页面上的字段就会用第一个匹配的状态值填充。一旦用户输入了所有五位邮政区号数,我们将立即决定和填充相应的城市。如果邮政区号无效(在服务器的数据库没有找到),那么我们将把邮政区号的边界设置为红色。这样的可视化线索有助于用户并且在现代浏览器中已经成为一种标准(作为一实例,当Firefox找到一个HTML页面中的匹配关键字时,它会高亮与你在浏览器查找域输入的内容一致的部分)。

  让我们首先创建一个简单的包含三个INPUT字段的 HTML:zip,city和state。请注意,一旦一个字符输入进邮政区号字段域中,即调用方法zipChanged()。JavaScript函数 zipChanged()(见下)在当zip长度为3时调用函数updateState(),而在当zip长度为5时调用函数up-dateCity ()。而updateCity()和updateState()把大部分的工作代理到另一个函数ask()。

Zip:<input id="zipcode" type="text" maxlength="5" onKeyUp="zipChanged()"
style="width:60"/>
City: <input id="city" disabled maxlength="32" style="width:160"/>
State:<input id="state" disabled maxlength="2" style="width:30"/>
<script src="xmlhttp.js"></script>
<script>
var zipField = null;
function zipChanged(){
zipField = document.getElementById("zipcode")
var zip = zipField.value;
zip.length == 3?updateState(zip):zip.length == 5?updateCity(zip):"";
}
function updateState(zip) {
 var stateField = document.getElementById("state");
 ask("resolveZip.jsp?lookupType=state&zip="+zip, stateField, zipField);
}
function updateCity(zip) {
 var cityField = document.getElementById("city");
 ask("resolveZip.jsp? lookupType=city&zip="+zip, cityField, zipField);
}
</script>


   函数ask()与服务器进行通讯并分配一个回调函数来处理服务器的响应(见下列代码)。后面,我们将分析具有双重特点的resolveZip.jsp的内容-它根据zip字段中的字符数查找city或state信息。重要的是,ask()使用了具有异步特点的XmlHttpRequest,这样填充 state和city字段或着色zip字段边界就可以不必减慢数据入口而得以实现。首先,我们调用request.open()-它用服务器打开套接字频道,使用一个HTTP动词(GET或POST)作为第一个参数并且以数据提供者的URL作为第二个参数。request.open()的最后一个参数被设置为true-它指示该请求的异步特性。注意,该请求还没有被提交。随着对request.send()的调用,开始提交-这可以为POST提供任何必要的有效载荷。在使用异步请求时,我们必须使用request.onreadystatechanged属性来分配请求的回调函数。(如果请求是同步的话,我们应该能够在调用request.send之后立即处理结果,但是我们也有可能阻断用户,直到该请求完成为止。)

HTTPRequest = function () {
 var xmlhttp=null;
 try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch (_e) {
  try {
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (_E) { }
 }
 if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
  try {
   xmlhttp = new XMLHttpRequest();
  } catch (e) {
   xmlhttp = false;
  }
 }
 return xmlhttp;
}

function ask(url, fieldToFill, lookupField) {
 var http = new HTTPRequest();
 http.open("GET", url, true);
 http.onreadystatechange = function (){ handleHttpResponse(http, fieldToFill,lookupField)};
 http.send(null);
}

function handleHttpResponse(http, fieldToFill, lookupField) {
 if (http.readyState == 4) {
  result = http.responseText;
  if ( -1 != result.search("null") ) {
   lookupField.style.borderColor = "red";
   fieldToFill.value = "";
  } else {
   lookupField.style.borderColor = "";
   fieldToFill.value = result;
  }
 }
}


  为ask()所使用的HttpRequest()函数(见上)是一跨浏览器的XMLHTTPRequest的一个实例的构造器;稍后我们将分析它。到目前为止,请注意对于handleResponse()的调用是如何用一匿名函数包装的-这个函数是function() {handleHttpResponse(http,fieldToFill, lookupField)}。

  该函数的代码是动态创建的并且在每次我们给http.onreadstatechange属性赋值时被编译。结果,JavaScript创建一个指向上下文(所有的变量都可以存取正在结束的方法-ask())的指针。这样以来,匿名函数和handleResponse()就能够被保证充分存取所有的上下文宿主的变量,直至到匿名函数的参考被垃圾回收站收集为止。换句话说,无论何时我们的匿名函数被调用,它都能无缝地参考request, fieldToFill和lookupField变量,就象它们是全局的一样。而且,每次ask()调用都将创建环境的一个独立拷贝,并且此时这些变量中保存有该函数将结束时的值。

  现在,让我们分析一下函数handleResponse()。既然它能够在请求处理的不同状态下激活,那么该函数将忽略所有的情形-除了该请求处理完成之外-这相应于request.readyState属性等于4("Completed")。此时,该函数读取服务器的响应文本。与它的名字所暗示的相反,XmlHttpRequest的输入和输出都不必限于XML格式。特别地,我们的resolveZip.jsp(见源码中的列表1)返回普通文本。如果返回值为"unknown",那么该函数将假定邮政区号是无效的并且把查找字段(zip)边界颜色置为红色。否则,返回值被用于填充字段state或 city,并且zip的边界被赋予一种缺省颜色。

XMLHttpRequest-传输对象

  让我们返回到我们的XMLHTTPRequest的跨浏览器实现。最后一个列表包含一个HttpRequest()函数-它向上兼容于IE5.0和 Mozilla 1.8/FireFox。为简化起见,我们只创建一个微软XMLHTTPRequest对象,而且如果创建失败,我们假定它是 Firefox/Mozilla。

  该函数的核心是XMLHTTPRequest-这是一个本机浏览器对象,它为包括HTTP协议的任何东西与服务器之间的通讯提供方便。它允许指定任何 HTTP动词,头部和有效载荷,并且能够以异步或同步方式工作。不需要下载也不需要安装任何插件-尽管在IE的情形下,XMLHTTPRequest是一个集成到浏览器内部的ActiveX。因而,"Run ActiveX Control and Plugins"默认IE权限应该正好适合使用它。

  最重要的是,XMLHTTPRequest允许一个到服务器的RPC风格的编程查询而不需要任何页面刷新。它以一种可预测的,可控制的方式来实现此-提供了到HTTP协议的所有细节的完整存取-包括头部和数据的任何定制格式。在以后的文章中,我们将向你展示其它一些业界协议-你可以在这些传输协议(如 Web服务和XML-RPC)之上运行-它们极大地简化大规模应用程序的开发和维护。

  五.服务器端逻辑

  最后,服务器端的resolveZip.jsp被从函数ask()中调用(见所附源码中的列表1)。这个resolveZip.jsp在两种由当前的邮政区号长度所区分的独立的场所下被调用(见zipChanged()函数)。请求参数lookupType的值或者是state或者是city。为简化起见,我们将假定,两个文件state.properties和city.properties都位于服务器中C驱动器的根目录下。 resolveZip.jsp逻辑负责用适当的预装载的文件返回查找值。

  我们的支持AJAX的页面现在已经准备好了。

  六.远程脚本技术-一种可选方法

  一些更旧的AJAX实现是基于所谓的远程脚本技术。这种思想是,用户的行为导致经由IFRAME对服务器进行查询,而服务器用JavaScript作出响应,该脚本一旦到达客户端立即被执行。这与XMLHttpRequest方法相比存在较大的区别,在后者情况下,服务器响应数据而客户端解释数据。其好处是这种解决方案支持更旧的浏览器。

  基于IFRAME示例的HTML部分(见所附源码中的列表2)与我们在XMLHTTPRequest场合下所用的极相似,但是这次我们将引入另外一个IFRAME元素-controller:

Zip:<input id="zipcode" type="text" maxlength="5" onKeyUp="zipChanged()"
style="width:60" size="20"/>
City: <input id="city" disabled maxlength="32" style="width:160" size="20"/>
State:<input id="state" disabled maxlength="2" style="width:30" size="20"/>
<iframe id="controller" style="visibility:hidden;width:0;height:0"></iframe>

  我们保持每次击键都调用zipChanged()一次,但是这一次,从zipChanged()中被调用的函数ask()(见所附源码中的列表3)负责设置IFRAME的src属性,而不是调用一个XMLHTTPRequest:

function ask(url, fieldToFill, lookupField){
 var controller = document.getElementById("controller");
 controller.src= url+"&field="+fieldToFill.id+"&zip="+lookupField.id;
}

  服务器端逻辑由一个粗略的resolveZip.jsp(见所附源码中的列表4)所描述。它与它的XMLHTTPRequest对应物相区别-它返回 JavaScript语句,这些语句设置变量字段lookup和city的全局值,而且一旦它到达浏览器即从全局窗口的执行上下文中调用函数 response()。

  函数response()是一修改版本的handleResponse()-这一函数可以免于处理未完成的请求(详见本文所附源码中的列表2)。

  七. 难题

  为简化起见,让我们"俯看"一下在我们的示例代码中的一些重要的问题:

  1.事实-XMLHTTPRequest对象实例和回调函数调用在被使用以后并没被破坏-在每次调用后这有可能导致内存泄漏。适当编写的代码应该破坏或重用对象池中的这些实例。而且,客户端必须使用与服务器软件相同的对象管理技术。

  2.在大多数情况下,错误往往得不到有效处理。例如,在方法ask()中对request.open()的调用可能引发一个异常,这是必须要捕获和处理的,即使在浏览器中没有设置JavaScript异常自动捕获功能。而handleResponse()函数又是另外一个例子。它必须要为可能的服务器端和通讯错误而检查headers和responseText值。在发生错误的情况下,它必须尽力恢复并/或者报告错误。正确开发的AJAX应用程序要尽可能避免"提交"松散的数据,因为往往存在线路断开和其它低级通讯的问题-所以这些程序必须建立一个强壮的和自恢复的框架为此提供支持。

  3.当前服务器端框架提供相当多的功能-它们可以与一种自由刷新方法和谐相处。例如,让我们考虑一个定制的在指定时间内的服务器端认证的问题。在这种情况下,我们必须拦截到XMLHTTPRequest调用的安全系统响应,显示登录屏幕,然后在用户被认证后重新发出请求。

  所有的这些问题只是一些典型的用低级API工作的任何应用程序代码,而且所有这些问题都能被解决。好消息是,解决这些问题所需要的技术十分相似于大多数Java开发技术,如Web服务,定制标签和XML/XSLT。唯一的区别在于,现在这些技术以下列形式用于客户端:

  ·Web服务-使用SOAP/REST/RPC等简单通讯标准

  ·客户端定制标签-打包丰富的客户端控件并集成AJAX功能

  ·数据操作-基于XML和基于XSLT技术

  八. 小结

  AJAX方法能够向人们提供一种与桌面应用程序相同的丰富的互联网体验。但是,我们必须有选择地使用AJAX技术,如当你仍在线购物时,你绝对不想让你的信用卡通过后台处理就悄悄地开始付款。AJAX会成为一种持续的动力吗?我们当然希望这样。在过去的五年时间内我们一直在努力开发AJAX应用程序并且能证明它是健全并且很有效的。然而,它要求一个开发者必须精通大量技术而不是在传统的"click-refresh"Web应用程序中所使用的那些。
posted @ 2007-01-24 12:56 Q系列类、方法、变量…… 阅读(177) | 评论 (0)编辑 收藏
功能齐全的发送PHP邮件类

PHP--下面这个类的功能则很强大,不但能发html格式的邮件,还可以发附件
<?php
class Email {
//---设置全局变量
var $mailTo = ""; // 收件人
var $mailCC = ""; // 抄送
var $mailBCC = ""; // 秘密抄送
var $mailFrom = ""; // 发件人
var $mailSubject = ""; // 主题
var $mailText = ""; // 文本格式的信件主体
var $mailHTML = ""; // html格式的信件主体
var $mailAttachments = ""; // 附件
/* 函数setTo($inAddress) :用于处理邮件的地址 参数 $inAddress
为包涵一个或多个字串,email地址变量,使用逗号来分割多个邮件地址
默认返回值为true
**********************************************************/
function setTo($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i++){ if($this->checkEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailTo = implode($addressArray, ",");
return true; }
/**************************************************
函数 setCC($inAddress) 设置抄送人邮件地址
参数 $inAddress 为包涵一个或多个邮件地址的字串,email地址变量,
使用逗号来分割多个邮件地址 默认返回值为true
**************************************************************/
function setCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i++){ if($this->checkEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailCC = implode($addressArray, ",");
return true; }
/***************************************************
函数setBCC($inAddress) 设置秘密抄送地址 参数 $inAddress 为包涵一个或多
个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址 默认返回值为
true
******************************************/
function setBCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i++)
{ if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入数组中
$this->mailBCC = implode($addressArray, ",");
return true;
}
/*****************************************************************
函数setFrom($inAddress):设置发件人地址 参数 $inAddress 为包涵邮件
地址的字串默认返回值为true
***************************************/
function setFrom($inAddress){
if($this->checkEmail($inAddress)){
$this->mailFrom = $inAddress;
return true;
} return false; }
/**********************
函数 setSubject($inSubject) 用于设置邮件主题参数$inSubject为字串,
默认返回的是true
*******************************************/
function setSubject($inSubject){
if(strlen(trim($inSubject)) > 0){
$this->mailSubject = ereg_replace( "n", "",$inSubject);
return true; }
return false; }
/****************************************************
函数setText($inText) 设置文本格式的邮件主体参数 $inText 为文本内容默
认返回值为true
****************************************/
function setText($inText){
if(strlen(trim($inText)) > 0){
$this->mailText = $inText;
return true; }
return false;
}
/**********************************
函数setHTML($inHTML) 设置html格式的邮件主体参数$inHTML为html格式,
默认返回值为true
************************************/
function setHTML($inHTML){
if(strlen(trim($inHTML)) > 0){
$this->mailHTML = $inHTML;
return true; }
return false; }
/**********************
函数 setAttachments($inAttachments) 设置邮件的附件 参数$inAttachments
为一个包涵目录的字串,也可以包涵多个文件用逗号进行分割 默认返回值为true
*******************************************/
function setAttachments($inAttachments){
if(strlen(trim($inAttachments)) > 0){
$this->mailAttachments = $inAttachments;
return true; }
return false; }
/*********************************
函数 checkEmail($inAddress) :这个函数我们前面已经调用过了,主要就是
用于检查email地址的合法性
*****************************************/
function checkEmail($inAddress){
return (ereg( "^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)$",$inAddress));
}
/*************************************************
函数loadTemplate($inFileLocation,$inHash,$inFormat) 读取临时文件并且
替换无用的信息参数$inFileLocation用于定位文件的目录
$inHash 由于存储临时的值 $inFormat 由于放置邮件主体
***********************************************************/
function loadTemplate($inFileLocation,$inHash,$inFormat){
/* 比如邮件内有如下内容: Dear ~!UserName~,
Your address is ~!UserAddress~ */
//--其中”~!”为起始标志”~”为结束标志
$templateDelim = "~";
$templateNameStart = "!";
//--找出这些地方并把他们替换掉
$templateLineOut = ""; //--打开临时文件
if($templateFile = fopen($inFileLocation, "r")){
while(!feof($templateFile)){
$templateLine = fgets($templateFile,1000);
$templateLineArray = explode($templateDelim,$templateLine);
for( $i=0; $i<count($templateLineArray);$i++){
//--寻找起始位置
if(strcspn($templateLineArray[$i],$templateNameStart)==0){
//--替换相应的值
$hashName = substr($templateLineArray[$i],1);
//--替换相应的值
$templateLineArray[$i] = ereg_replace($hashName,(string)$inHash[$hashName],$hashName);
}
}
//--输出字符数组并叠加
$templateLineOut .= implode($templateLineArray, "");
} //--关闭文件fclose($templateFile);
//--设置主体格式(文本或html)
if( strtoupper($inFormat)== "TEXT" )
return($this->setText($templateLineOut));
else if( strtoupper($inFormat)== "HTML" )
return($this->setHTML($templateLineOut));
} return false;
}
/*****************************************
函数 getRandomBoundary($offset) 返回一个随机的边界值
参数 $offset 为整数 – 用于多管道的调用 返回一个md5()编码的字串
****************************************/
function getRandomBoundary($offset = 0){
//--随机数生成
srand(time()+$offset);
//--返回 md5 编码的32位 字符长度的字串
return ( "----".(md5(rand()))); }
/********************************************
函数: getContentType($inFileName)用于判断附件的类型
**********************************************/
function getContentType($inFileName){
//--去除路径
$inFileName = basename($inFileName);
//--去除没有扩展名的文件
if(strrchr($inFileName, ".") == false){
return "application/octet-stream";
}
//--提区扩展名并进行判断
$extension = strrchr($inFileName, ".");
switch($extension){
case ".gif": return "image/gif";
case ".gz": return "application/x-gzip";
case ".htm": return "text/html";
case ".html": return "text/html";
case ".jpg": return "image/jpeg";
case ".tar": return "application/x-tar";
case ".txt": return "text/plain";
case ".zip": return "application/zip";
default: return "application/octet-stream";
}
return "application/octet-stream";
}
/**********************************************
函数formatTextHeader把文本内容加上text的文件头
*****************************************************/
function formatTextHeader(){ $outTextHeader = "";
$outTextHeader .= "Content-Type: text/plain;
charset=us-asciin";
$outTextHeader .= "Content-Transfer-Encoding: 7bitnn";
$outTextHeader .= $this->mailText. "n";
return $outTextHeader;
} /************************************************
函数formatHTMLHeader()把邮件主体内容加上html的文件头
******************************************/
function formatHTMLHeader(){
$outHTMLHeader = "";
$outHTMLHeader .= "Content-Type: text/html;
charset=us-asciin";
$outHTMLHeader .= "Content-Transfer-Encoding: 7bitnn";
$outHTMLHeader .= $this->mailHTML. "n";
return $outHTMLHeader;
}
/**********************************
函数 formatAttachmentHeader($inFileLocation) 把邮件中的附件标识出来
********************************/
function formatAttachmentHeader($inFileLocation){
$outAttachmentHeader = "";
//--用上面的函数getContentType($inFileLocation)得出附件类型
$contentType = $this->getContentType($inFileLocation);
//--如果附件是文本型则用标准的7位编码
if(ereg( "text",$contentType)){
$outAttachmentHeader .= "Content-Type: ".$contentType. ";n";
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n";
$outAttachmentHeader .= "Content-Transfer-Encoding: 7bitn";
$outAttachmentHeader .= "Content-Disposition: attachment;n";
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn";
$textFile = fopen($inFileLocation, "r");
while(!feof($textFile)){
$outAttachmentHeader .= fgets($textFile,1000);
}
//--关闭文件 fclose($textFile);
$outAttachmentHeader .= "n";
}
//--非文本格式则用64位进行编码
else{ $outAttachmentHeader .= "Content-Type: ".$contentType. ";n";
$outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "n";
$outAttachmentHeader .= "Content-Transfer-Encoding: base64n";
$outAttachmentHeader .= "Content-Disposition: attachment;n";
$outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "nn";
//--调用外部命令uuencode进行编码
exec( "uuencode -m $inFileLocation nothing_out",$returnArray);
for ($i = 1; $i<(count($returnArray)); $i++){
$outAttachmentHeader .= $returnArray[$i]. "n";
}
} return $outAttachmentHeader;
}
/******************************
函数 send()用于发送邮件,发送成功返回值为true
************************************/
function send(){
//--设置邮件头为空
$mailHeader = "";
//--添加抄送人
if($this->mailCC != "")
$mailHeader .= "CC: ".$this->mailCC. "n";
//--添加秘密抄送人
if($this->mailBCC != "")
$mailHeader .= "BCC: ".$this->mailBCC. "n";
//--添加发件人
if($this->mailFrom != "")
$mailHeader .= "FROM: ".$this->mailFrom. "n";
//---------------------------邮件格式------------------------------
//--文本格式
if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments == ""){
return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);
}
//--html或text格式
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments == ""){
$bodyBoundary = $this->getRandomBoundary();
$textHeader = $this->formatTextHeader();
$htmlHeader = $this->formatHTMLHeader();
//--设置 MIME-版本
$mailHeader .= "MIME-Version: 1.0n";
$mailHeader .= "Content-Type: multipart/alternative;n";
$mailHeader .= ' boundary="'.$bodyBoundary. '"';
$mailHeader .= "nnn";
//--添加邮件主体和边界
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $textHeader;
$mailHeader .= "--".$bodyBoundary. "n";
//--添加html标签
$mailHeader .= $htmlHeader;
$mailHeader .= "n--".$bodyBoundary. "--";
//--发送邮件
return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
}
//--文本加html加附件
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments != ""){
$attachmentBoundary = $this->getRandomBoundary();
$mailHeader .= "Content-Type: multipart/mixed;n";
$mailHeader .= ' boundary="'.$attachmentBoundary. '"'. "nn";
$mailHeader .= "This is a multi-part message in MIME format.n";
$mailHeader .= "--".$attachmentBoundary. "n";
$bodyBoundary = $this->getRandomBoundary(1);
$textHeader = $this->formatTextHeader();
$htmlHeader = $this->formatHTMLHeader();
$mailHeader .= "MIME-Version: 1.0n";
$mailHeader .= "Content-Type: multipart/alternative;n";
$mailHeader .= ' boundary="'.$bodyBoundary. '"';
$mailHeader .= "nnn";
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $textHeader;
$mailHeader .= "--".$bodyBoundary. "n";
$mailHeader .= $htmlHeader;
$mailHeader .= "n--".$bodyBoundary. "--";
//--获取附件值
$attachmentArray = explode( ",",$this->mailAttachments);
//--根据附件的个数进行循环
for($i=0;$i<count($attachmentArray);$i++){
//--分割 $mailHeader .= "n--".$attachmentBoundary. "n";
//--附件信息
$mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);
}
$mailHeader .= "--".$attachmentBoundary. "--";
return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
}
return false;
}
}
?>


使用方法:
<?
Include “email.class”

$mail->setTo("a@a.com"); //收件人
$mail-> setCC("b@b.com,c@c.com"); //抄送
$mail-> setCC("d@b.com,e@c.com"); //秘密抄送
$mail->setFrom(“f@f.com”);//发件人
$mail->setSubject(“主题”) ; //主题
$mail->setText(“文本格式”) ;//发送文本格式也可以是变量
$mail->setHTML(“html格式”) ;//发送html格式也可以是变量
$mail->setAttachments(“c:a.jpg”) ;//添加附件,需表明路径
$mail->send(); //发送邮件
posted @ 2007-01-24 12:56 Q系列类、方法、变量…… 阅读(167) | 评论 (0)编辑 收藏
仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页