2008 年 04 月

浏览模式: 标准 | 列表 | 图文
javascipt的{}中逗号带来的困扰

javascipt的{}中逗号带来的困扰

随便javascript 第5版的书出来,JS的写法也就越来越多了,以前定义一个对象,还得写var o = new Object();现在好了,直接var o = {};

可是这样带来的问题不少(其实是IE和FF的兼容性问题)

下面是一个朋友痛苦的经历:

最近把YUI()引入到了现在做的项目当中,感觉做ajax非常顺手

由于firefox下有firebug这个插件,所以开发的时候都是以ie为准
稍微在ie下做些测试,一般都没有问题。

这次被一个逗号搞得非常辛苦。

var send_email_callback =
{
success:handleSuccess,
failure:handleFailure,
};
这段代码在firefox和ie下都不会报错
firefox运行正常,ie下导致整个脚本失效

调试都是用alert来调试,但是ie下alert的功能也失效了,无论alert放在文件的那个位置,都不会有弹框出来
整个js文件代码长达300行,找的好辛苦。。。
正确的应为: var send_email_callback =
{
success:handleSuccess,
failure:handleFailure
}; 唉,一个逗号引发的辛苦啊。。

这个错误应该是受到php里面array写法的影响
经常在定义array时为了给array添加新值方便,一般都是会再加一个逗号。。。

另外,还有个地方也会导致脚本在ie下失效
_div_sending.className = 'mail_sending';
//_div_sending.class = 'mail_sending';
其中第二行会导致脚本不能运行,也不会报错,同样无论什么地方放一个alert都不会有反应
额,以前看一本书上说,给控件加class的值,这样好像会做到多个浏览器兼容。。。faint,或许是我记错了吧。。
解决的办法,注释掉,或者用yui自带的添加的class的方法
这段代码是几个星期前写的,那个时候还没有看到yui给控件加class的方法
YAHOO.util.Dom.addClass(_div_sending, 'mail_sending');
希望有人可以告诉我,ie下调试js简单的方法
额,我的js的水平也太臭了。。。额。。。。

确实,在"}"前的最后一个","非常害人。在IE下死活会报错,而且FF下面又完全正常。现在我一看报错,就立马检查是否多了这个",",PHP的ARRAY习惯害人啊……总是担心可能会往配置数组里加东西,所以,每行最后都习惯性的加上逗号,现在……不太敢了。

听说。。。

听说。。。

本文内容来自网上,听说是真,羡慕一下

Bill Joy, 前任Sun的首席科学家,当年在Berkeley时主持开发了最早版本的BSD。他还是vi和csh的作者。当然,Csh Programming Considered Harmful 是另一个话题乐。据说他想看看自己能不能写个操作系统,就在三天里写了个自己的Unix, 也就是BSD的前身。当然是传说了,但足见他的功力。另一个传说是,1980年初的时候,DARPA让BBN在Berkley Unix里加上BBN开发的TCP/IP代码。但当时还是研究生的B伯伯怒了,拒绝把BBN TCP/IP加入BSD,因为他觉得BBN的TCP/IP写得不好。于是B伯伯出手了,端的是一箭封喉,很快就写出了高性能的伯克利版TCP/IP。当时 BBN和DARPA签了巨额合同开发TCP/IP Stack,谁知他们的代码还不如一个研究生的好。于是他们开会。只见当时B伯伯穿个T-shirt出现在会议室(当时穿T-shirt不象现在,还是相当散漫的哈)。只见BBN问:你怎么写出来的?而B伯伯答:简单,你读协议,然后编程就行了。最令偶晕倒的是,B伯伯硕士毕业后决定到工业界发展,于是就到了当时只有一间办公室的Sun, 然后他就把Sparc设计出来乐。。。象这种软硬通吃的牛人,想不佩服都不行的说。据Bill Joy的同事说,一般开会的时候B伯伯总是拿一堆杂志漫不经心地读。但往往在关键之处,B伯伯发言,直切要害,提出漂亮的构想,让同事们彻底崩溃。对了,他还是Java Spec和JINI的主要作者之一。

jQuery的一些图片库展示效果[3in1]

jQuery lightBox plugin

simple jQuery Gallery

jCarousel Lite

在新的项目里,把商品的图片采用了这三个插件来处理,其中,simple jQueryGallery并不能算是一个插件,但相对还是比较有作用的。主要是在处理lightBox和carousel的兼容上存在了一些复杂度。

因为时间不够充分,所以,并没有改动原来的代码。也因此在实际的HTML代码里多了很多废代码,好在这些JS插件都不算大,加上废代码也没有多少。这些问题就暂时忽略不计了。

附上几张图片。。。

全图:点击下面的小图,在大图片框里会显示大图片,点击左边和右边的箭头,可以使下面的小图框循环滚动。点击大图片框里的图片,会出现lightBox效果

da1cb23d67e1dc1191e6e35782a31011

lightBox效果:2e02c6385bf966bf431504401664321e

小图片循环效果:turf_080426.rar

[转载]超强大的jquery formValidator

jQuery formValidator表单验证插件开源了!!含API帮助、源码、示例

升级记录


2.0
这次又做了一次比较大的调整:增加了FunctionValidator这种校验方式,现在你可以调用外部函数了;调整了内部部分算法;
你打开下载压缩包里的index.html,将会看到全新的演示。
1、增加FunctionValidator校验方式。作用:你可以用外部函数对表单元素进行校验和处理,返回true/false表示校验是否成功;返回字符串表示自定义错误信息,校验失败;如果没有返回值表示处理过程,校验成功。范例代码如下:
$("#sfzh").formValidator({onshow:"请输入15或18位的身份证",onfocus:"输入15或18位的身份证",oncorrect:"输入正确"}).FunctionValidator({fun:isCardID});
fun这个参数给你的函数传递了2个参数(该表单元素的值,表单元素element) 。具体情况,请看API帮助文档
2、当你调用PageIsValid的时候,如果未校验通过,则给onError传递2个参数(第一个校验没通过元素的错误信息,第一个校验没通过元素element)。范例代码如下:
$.formValidator.initConfig({onError:function(msg){alert(msg)}});
3、AjaxValidator校验方式增加一个配置参数buttons(你点提交的按钮(组)jQuery对象)。作用:当你触发了ajax校验,buttons里对应的按钮(组)就会灰掉,一直等待服务器返回数据为止。范例代码如下:
$("#test1").formValidator({...}).InputValidator({...}).AjaxValidator({
url : "Default.aspx",
datatype : "json",
success : function(data){...},
buttons: $("#button_id"),
error: function(){alert("服务器没有返回数据,可能服务器忙,请重试");},
onerror : "该用户名不可用,请更换用户名重新",
onwait : "正在对用户名进行合法性校验,请稍候..."
});
4、由于增加了自定义错误信息的功能,为了跟FunctionValidator校验方式里"fun"函数返回意义统一,更改了formValidator里的onvalid参数返回的意义,给大家带来不便请谅解。返回true/false表示校验是否成功;返回字符串表示自定义错误信息,校验失败;如果没有返回值表示处理过程,校验成功。


1.3
由于工作忙,网友提了很多珍贵的意见,到现在才更新插件,真的对不住!这次修改了几处不合理的地方。
特别增加了DefaultPassed函数,并且调整了表单元素校验的顺序。
1、增加DefaultPassed函数,作用:如果你的表单元素有默认值,而且是合法的,你可以通过这个,设置默认校验通过,示例代码如下:
$("#sex").formValidator({onshow:"请选择你的性别",onfocus:"没有第三种性别了,你选一个吧",oncorrect:"输入正确",defaultvalue:"1"}).InputValidator({min:1,max:1,onerror:"性别忘记选了,请确认"}).DefaultPassed();
2、修正了showalert模式下,只有值发生改变的时候才触发校验
3、修改了表单提交的时候,表单元素校验的顺序,现在按照表单元素的流顺序进行校验
4、demo1里集成了datatimemask插件,具体应用,请见“出生日期”的代码
5、避免了插件与别的javascript类库的$符号的冲突
6、修改了api帮助文档


1.2.1
修复表单元素额外校验失败还会提交得bug,即formValidator里的onvalid属性

1.2.0
这个版本,内部函数做了比较大的调整,开放了更多的函数提供给大家使用,使插件灵活性更大
特别申明:请保留插件的版权申明,谢谢
1、修改插件文件名为:formValidator.js ; 对应的正则表达式的库也被命名为formValidatorRegex.js。
2、SelectValidator被合并到InputValidtor中去,请大家赶紧修改,语法兼容,只要替换名称即可。
3、因为InputValidtor合并了SelectValidator,所以API帮助里列举了InputValidtor各属性能起作用的各种表单类型
4、开放3个公共函数,这些函数跟你的配置相关:
SetFailState function("tipid","显示的信息"),在showword模式下,如果你的额外校验没有通过,你可以通过它来设置成失败信息和状态。
IsOneValid function("表单元素id"),主要来判断单个表单元素是否验证通过。
GetLength function("表单元素id"),判断表单元素的选择长度(个数)。
checkbox或radiobutton表示(同组)选择的个数。
select表示选择的selectedIndex值。
其它的表示字符长度。
5、formValidator里的onvalid属性,增加了返回值,即插件校验成功后,你还可以额外校验。例子请参见demo1里的【额外校验】
return true表示这个表单元素校验成功
return false表示这个表单元素校验失败
错误信息,你可以通过SetFailState函数要写
6、修复在firefox下,长度验证出错的bug。发现jQuery1.2不支持这么写:$("#textarea").attr("type")


1.1.2
1、为AjaxValidator添加一个addidvalue属性(是否自动添加id和值到url参数后面)
为了修复AjaxValidator在配置信息的时候,取不到运行时候值的bug
插件将自动在url后面自动添加,形式为"id=value"的网页参数
在服务器端,你可以通过Request.querystring["id"]来取值
具体演示请看demo1里的用户名输入和Default.aspx


1.1.1版本
1、紧急修复AjaxValidator校验状态出错,以及显示状态的bug
2、调整了内部OneIsValid和formValidator函数的算法,使判断更加合理、有效

1.1 功能比较全的一个版本.
1、开放AjaxValidator表单验证,主要对$.ajax()的调用,具体演示请看demo1里的用户名输入和Default.aspx
用户名在服务器端的校验,我是用了随机数取模,但是每次运行返回要么都是偶数要么都是奇数(不知道什么问题)。
先是长度校验,再是格式校验,最后才是服务器端校验
2、修正AjaxValidator校验状态出错,以及显示状态的问题bug。
3、修正对AjaxValidator的api帮助。
4、修正内部几个函数的一些bug。
5、未了适应AjaxValidator,调整formValidator初始化的一部分功能。

1.0.3
1、把InputValidator的属性defaultvalue移到formValidator下。
目前defaultvalue属性只支持input和select两种tag
2、增加demo1里的范例内容,增加了性别的选择和默认值的设置(性别、学历、爱国、国家区号、你的描述)。
3、增加RegexValidator的一个属性:datatype,支持外置正则表达式的枚举类型,具体请见demo3.html
你可以额外包含这个js文件,定义一个数据类型,你可以自由的修改里面的名称和对应的值
var regexEnum =
{
intege:"^([+-]?)\\d+$" //整数
}
如何调用范例:$("#zs").formValidator({onshow:"请输入整数",oncorrect:"谢谢你的合作,你的整数正确"}).RegexValidator({regexp:"intege",datatype:"enum",onerror:"整数格式不正确"});
4、修正自动纠错的一个bug
5、修正了api帮助文档


1.0.2版本
1、为formValidator增加tipid属性。
主要为了解决多个表单元素共用一个TIP的问题,提示错误的原则:后面的成功或失败信息都不覆盖前面的失败信息
针对这个属性,已经更新了demo1和源码,具体请看范例
2、修正了部分bug和api说明文档疏漏的地方


1.0.1版本
1、修改formValidator下的属性onvalid
增加2个参数,参数1:对象本身 参数2:值。主要是校验通过后,你还希望执行一些操作,你可以方便的取到对象和值
2、去掉InputValidator、SelectValidator、CompareValidator、RegexValidator、AjaxValidator下的onvalid属性
写文档的时候太过匆忙,所以属性加多了,帮助文档和源码都已经修正
3、为formValidator增加属性:automodify,默认值:false。
这个属性只要针对,如果你输入的是非法的,离开焦点的时候将自动恢复上次的值,并且先都有提示,showword模式的提示变成onshow状态
4、为formValidator增加onfocusevent和onblurevent
因为jQuery的事件注册是覆盖的,不是attachEvent追加的,所以再托管出这两个被插件霸占住的事件onfocus和onblur
onfocusevent:获得焦点的时候,处理系统自动处理的代码后,继续你希望再执行的代码
onblurevent:失去焦点的时候,处理系统自动处理的代码后,继续你希望再执行的代码
5、提交验证过程中,如果没有验证通过,则第一个出错的获得焦点
6、申明一点:RegexValidator采用的是显式构造函数new RegExp("pattern"[,"flags"]); 由于Javascript 中'\' 被用作转义字符,所以在使用显示构造函数构造实例对象的时候,需要使用'\\' 代替'\'

1、插件应用效果图浏览

效果图1:


效果2:



2、jQuery pageValidator插件主要功能

1、2种错误提示模式:文字提示、窗口提示
2、呈现时的提示
3、可以为空,空时的提示
4、获得焦点提示
5、发生不同种错误,给出不同的提示
6、可以为空,不为空时要检验控制
7、长度控制、值比较
8、范围控制
9、2个对象比较控制
10、选择个数控制
11、Ajax读取数据
12、正则表达式控制
13、同个页面,你可以划分多个校验组,每个组的校验都是互不影响的
14、单个对象或者整个校验组验证完成、或者出错,有额外的回调函数提供




下载 http://www.cnblogs.com/Files/wzmaodong/formValidator2.0.rar



5、示例代码

<script type="text/javascript">
$(document).ready(function(){
$.formValidator.initConfig({onError:function(){alert("校验没有通过,具体错误请看错误提示")}});
$("#test1").formValidator({onshow:"请输入用户名",onfocus:"用户名至少6个字符,最多10个字符",oncorrect:"恭喜你,你输对了"}).InputValidator({min:6,max:10,onerror:"你输入的用户名非法,请确认"});
$("#test2").formValidator({onshow:"请选择你的兴趣爱好(至少选择3个,最多选择5个)",onfocus:"你至少选择3个,最多选择5个",oncorrect:"恭喜你,你选对了"}).InputValidator({min:3,max:5,onerror:"你选的个数不对(至少选择3个,最多选择5个)"});
$("#test3").formValidator({onshow:"请选择你的兴趣爱好(至少选一个)",onfocus:"你至少选择1个",oncorrect:"恭喜你,你选对了"}).InputValidator({min:1,onerror:"你选的个数不对"});
$("#xueli").formValidator({onshow:"请选择你的学历",onfocus:"学历必须选择",oncorrect:"谢谢你的配合"}).SelectValidator({onerror: "你是不是忘记选择学历了!"});
$("#password1").formValidator({onshow:"请输入密码",onfocus:"两次密码必须一致哦",oncorrect:"密码一致"}).InputValidator({min:1,onerror:"密码不能为空,请确认"}).CompareValidator({desID:"password2",operateor:"=",onerror:"2次密码不一致,请确认"});
$("#nl").formValidator({onshow:"请输入的年龄(1-99岁之间)",onfocus:"只能输入1-99之间的数字哦",oncorrect:"恭喜你,你输对了"}).InputValidator({min:1,max:99,type:"value",onerror:"年龄必须在1-99之间,请确认"});
$("#aiguo").formValidator({onshow:"爱国的人一定要选哦",onfocus:"你得认真思考哦",oncorrect:"不知道你爱不爱,反正你是选了"}).InputValidator({min:1,max:1,onerror:"难道你不爱国?你给我选!!!!"});
$("#shouji").formValidator({empty:true,onshow:"请输入你的手机号码,可以为空哦",onfocus:"你要是输入了,必须输入正确",oncorrect:"谢谢你的合作",onempty:"你真的不想留手机号码啊?"}).InputValidator({min:11,max:11,onerror:"手机号码必须是11位的,请确认"}).RegexValidator({regexp:"^[1][0-9]{10}$",onerror:"你输入的手机格式不正确"});
$("#lxdh").formValidator({empty:true,onshow:"请输入你的联系电话,可以为空哦",onfocus:"你要是输入了,必须输入正确,格式例如:0577-88069620",oncorrect:"谢谢你的合作",onempty:"你真的不想留联系电话了吗?"}).RegexValidator({regexp:"^[[0-9]{3}-|\[0-9]{4}-]?(\[0-9]{8}|[0-9]{7})?$",onerror:"你输入的联系电话格式不正确"});
$("#ms").formValidator({onshow:"请输入你的描述",onfocus:"描述至少要输入10个汉字或20个字符",oncorrect:"恭喜你,你输对了"}).InputValidator({min:20,onerror:"你输入的描述长度不正确,请确认"});
});
</script>


6、特别说明

如果你在使用过程中碰到什么问题请给我留言,发现bug请不要自行修改,也请留言,达到完善插件的目的,真正服务每个程序开发人员
.
请保留插件的版权申明,谢谢
引用地址:http://www.cnblogs.com/wzmaodong/archive/2008/02/04/1034901.html

3、jQuery pageValidator插件 API帮助文档

目前支持4种大的校验方式,分别是:InputValidator(针对input、textarea、select控件的字符长度、值范围、选择个数的控制)、CompareValidator(提供2个对象的比较,目前可以比较字符串和数值型)、AjaxValidator(通过ajax到服务器上做数据校验)、RegexValidator(提供可扩展的正则表达式库) 、FunctionValidator (提供可扩展函数库来做校验)

每种格式支持的控件类型如下:

input textarea select
校验方式 text radio checkbox file password textarea select-one
InputValidator √ √ √ √ √ √ √
CompareValidator √ √ √ √
AjaxValidator √ √ √ √ √
RegexValidator √ √ √ √
FunctionValidator √ √ √ √ √ √ √
如果你用了不支持的校验功能,插件将忽略这个校验功能。

插件目前提示错误,有两种模式:showword和showalert,即文字提示和窗口提示,下面的4大验证方式,针对showalert这种方式不是都必须的,有些配置是没有作用的
下面分别罗列全局初始化和5种校验方式公开的属性
formValidator: 用来做初始化的类型,必须先执行。("√"为showalert可用参数)
属性 属性名称 默认值 showalert 详细解释
validatorGroup 校验组 "1" √ 一个页面的控件可以分成多个组,分开校验
empty 是否可以为空 false √
automodify 输入错误离开焦点的时候,自动修复错误 false √ 先给出提示然后,自动修复,目前只支持text、file、textarea三种类型
onempty 空时候的提示 "输入内容为空" 可以为空,为空时候的提示
onshow 显示时候的提示 "请输入内容"
onfocus 获得焦点的提示 "请输入内容"
oncorrect 输入正确后的提示 "输入正确" 当你焦点离开控件的时候,如果输入正确将出现该提示
onvalid 校验通过后的回调函数 null √ 参数1:对象本身
参数2:值
校验通过后,你还希望执行一些操作,你可以通过这个属性来执行。
返回值的意义:
true/false 校验成功/失败
字符串 校验失败,返回值当作自定义错误
无 处理过程
onfocusevent 获得焦点后要追加的回调函数 null √ 参数1:对象本身
onblurevent 失去焦点后要追加的回调函数 null √ 参数1:对象本身
tipid 显示错误的容器ID 表单ID+"Tip"
defaultvalue 默认值 null √ 所有input和select表单。如果你不设置就保持原值,一旦设置就设为默认值。
InputValidator:
属性 属性名称 默认值 详细解释
type 比较类型 "size" (对select无效)"size":表示比较长度 "value":比较值。
min 最小长度/值 0 (对select无效)
max 最大长度/值 99999999999999 (对select无效)
onerror 发生错误的提示 "输入错误"
defaultvalue 默认值 null 能满足预设默认值的需求
CompareValidator:
属性 属性名称 默认值 详细解释
desID 要比较控件的ID "" 要跟源目标进行比较的目标ID
operateor 比较符号 "=" 一共有如下几种类型:=、!=、>、>=、<、<=
datatype 数据类型 "string" 目前只支持2种:"string"、"number"
onerror 发生错误的提示 "输入错误"
RegexValidator:
属性 属性名称 默认值 详细解释
regexp 正则表达式 "" 采用的是显式构造函数new RegExp("pattern"[,"flags"]); 由于Javascript 中'\' 被用作转义字符,所以在使用显示构造函数构造实例对象的时候,需要使用'\\' 代替'\'
param 附加参数 "i" g:代表可以进行全局匹配。
i:代表不区分大小写匹配。
m:代表可以进行多行匹配。
可以任意组合,当然也可以不加参数
datatype 数据类型 "string" "string":自己写的表达式,"enum":枚举名。具体请见demo3.htm,你可以自己修改附加pageValidatorRegex.js里的枚举项目名和表达式。
onerror: 发生错误的提示 "输入错误"
AjaxValidator: 几乎所有的属性跟$.ajax()的属性一样,请参考$.ajax()函数的帮助
属性 属性名称 默认值 详细解释
type 请求的类型 "GET" "POST" 或 "GET"
url 发送到的URL地址 ""
datatype 返回的数据类型 "html" xml、html、script、json
data 数据 ""
async 是否以异步的方式发送 true
success 当请求成功时调用的函数 null
processdata 自动处理返回的数据为字符串 true 在默认的情况下,如果data选项传进的数据是一个对象而不是字符串,将会自动地被处理和转换成一个查询字符串
complete 当请求完成时调用的函数 null
beforesend 当请求前时调用的函数 null
buttons 你点提交的按钮(组)jQuery对象 null 当你触发了ajax校验,buttons里对应的按钮(组)就会灰掉,一直等待服务器返回数据为止
error 当请求失败时调用的函数 "请求失败" 你可以自己定义这个错误,在error里自动打出
FunctionValidator
属性 属性名称 默认值 返回值的解释
fun 外部函数名 默认当作处理过程
true/false 校验成功/失败
字符串 校验失败,返回值当作自定义错误
无 处理过程
公共函数: 主要是设置全局参数和判断是否通过校验
函数名 函数说明
$.formValidator.initConfig 参数:配置类型
属性 默认值 说明
validatorGroup "1" 你要针对哪个组进行配置
alertMessage false 是否弹出窗口
onSuccess null 该组校验通过后的回调函数,返回false,阻止表单的提交
submitOnce false 校验通过后,是否灰掉所有的提交按钮
onError null 该组校验失败后的回调函数, 有两个参数
第一个 一个校验没有通过的错误信息
第二个 一个校验没有通过的元素对象
$.formValidator.PageIsValid 一个参数: 不是配置类型
validatorGroup "1" 你要针对哪个组进行验证
$.formValidator.IsOneValid 一个参数: 当时设置验证的表单元素ID。
返回是否校验成功的信息。
$.formValidator.SetFailState function("tipid","显示的信息")
在showword模式下,如果你的额外校验没有通过,你可以通过它来设置成失败信息和状态
$.formValidator.GetLength function("表单元素id")
判断表单元素的选择长度(个数)
checkbox或radiobutton表示选择的个数。
select表示选择的selectedIndex值。
其它的表示字符长度。



4、下载API帮助、源码、示例

下载
2.9版本发现一个逻辑bug,正在修复当中,现停止下载

http://www.cnblogs.com/Files/wzmaodong/formValidator2.9.rar
http://www.cnblogs.com/Files/wzmaodong/formValidator2.4.rar



5、示例代码

<script type="text/javascript">
$(document).ready(function(){
$.formValidator.initConfig({onError:function(){alert("校验没有通过,具体错误请看错误提示")}});
$("#test1").formValidator({onshow:"请输入用户名",onfocus:"用户名至少6个字符,最多10个字符",oncorrect:"恭喜你,你输对了"}).InputValidator({min:6,max:10,onerror:"你输入的用户名非法,请确认"});

$("#test2").formValidator({onshow:"请选择你的兴趣爱好(至少选择3个,最多选择5个)",onfocus:"你至少选择3个,最多选择5个",oncorrect:"恭喜你,你选对了"}).InputValidator({min:3,max:5,onerror:"你选的个数不对(至少选择3个,最多选择5个)"});

$("#test3").formValidator({onshow:"请选择你的兴趣爱好(至少选一个)",onfocus:"你至少选择1个",oncorrect:"恭喜你,你选对了"}).InputValidator({min:1,onerror:"你选的个数不对"});

$("#xueli").formValidator({onshow:"请选择你的学历",onfocus:"学历必须选择",oncorrect:"谢谢你的配合"}).SelectValidator({onerror: "你是不是忘记选择学历了!"});

$("#password1").formValidator({onshow:"请输入密码",onfocus:"两次密码必须一致哦",oncorrect:"密码一致"}).InputValidator({min:1,onerror:"密码不能为空,请确认"}).CompareValidator({desID:"password2",operateor:"=",onerror:"2次密码不一致,请确认"});

$("#nl").formValidator({onshow:"请输入的年龄(1-99岁之间)",onfocus:"只能输入1-99之间的数字哦",oncorrect:"恭喜你,你输对了"}).InputValidator({min:1,max:99,type:"value",onerror:"年龄必须在1-99之间,请确认"});

$("#aiguo").formValidator({onshow:"爱国的人一定要选哦",onfocus:"你得认真思考哦",oncorrect:"不知道你爱不爱,反正你是选了"}).InputValidator({min:1,max:1,onerror:"难道你不爱国?你给我选!!!!"});

$("#shouji").formValidator({empty:true,onshow:"请输入你的手机号码,可以为空哦",onfocus:"你要是输入了,必须输入正确",oncorrect:"谢谢你的合作",onempty:"你真的不想留手机号码啊?"}).InputValidator({min:11,max:11,onerror:"手机号码必须是11位的,请确认"}).RegexValidator({regexp:"^[1][0-9]{10}$",onerror:"你输入的手机格式不正确"});

$("#lxdh").formValidator({empty:true,onshow:"请输入你的联系电话,可以为空哦",onfocus:"你要是输入了,必须输入正确,格式例如:0577-88069620",oncorrect:"谢谢你的合作",onempty:"你真的不想留联系电话了吗?"}).RegexValidator({regexp:"^[[0-9]{3}-|\[0-9]{4}-]?(\[0-9]{8}|[0-9]{7})?$",onerror:"你输入的联系电话格式不正确"});

$("#ms").formValidator({onshow:"请输入你的描述",onfocus:"描述至少要输入10个汉字或20个字符",oncorrect:"恭喜你,你输对了"}).InputValidator({min:20,onerror:"你输入的描述长度不正确,请确认"});
});
</script>



6、特别说明

如果你在使用过程中碰到什么问题请给我留言,发现bug请不要自行修改,也请留言,达到完善插件的目的,真正服务每个程序开发人员
.
请保留插件的版权申明,谢谢

为ThinkPHP开发自定义标签几个注意事顶

为ThinkPHP开发自定义标签几个注意事顶

ThinkPHP的模版引擎强大就强大在于它可以使用XML标签来为TP模版引擎进行扩展,因此TP的标签功能就成了TP模版的亮点所在。要想让TP的模版功能更加强大,你就得学会扩展TP的标签功能,即:自定义标签

开发自定义标签功能的时候,有几个注意的地方,
1、文件名的规范性,这个当然是不用多解释了,TagLibInput.class.php
(TagLib加是你定义的标签名,首字符大写,这样你的文件名中的Input就会自动认为你的XML文件名)
2、目录所在:目前暂时还是存放到THINKPHP的核心类库里,目录为:/THINKPHP/Lib/Think/Template
主程序文件放到:/THINKPHP/Lib/Think/Template/TagLib/ 目录下
自定义的XML文件放到:/THINKPHP/Lib/Think/Template/Tags/ 目录下

(自定义的文件是小写的标签名,即刚才类名中的Input的小写)

注意事顶:
如果你发现你自定义的标签没有被解析,请按如下方法进行检查(以input标签为例)
1、查看文件开始的地方是否加载了<tagLib name="cx,html,input" />,同时,请检查是否符合XML规范,如:标签一定要闭合。例:<br />,否则会出现XML解析错误
2、检查文件是否都为UTF-8编码,因为在解析XML的时候,都是采用UTF8编码,如果不是UTF8编码,会出现一些奇怪的解析错误,很多时候都会出现simpleXml解析器错误,如果出现这种错误,请检查文件编码,如果是UTF8编码的文件,请同时检查文件头是否存在BOM标记。
3、自定义的标签中,是否忘了双引号。由于在写HTML的时候,很容易忽略双引号,比如<input type=text name=name>,如果是这样,在被当成XML解析的时候,肯定会报错的,正确的写法应该是:<input type="text" name="name" value="value" />(标签要闭合),如果是自己自定义的标签,则应该这样写:<input:text name="" value="" />

解决使用ThinkPHP框架自带模版程序处理<??>出现的问题

解决使用ThinkPHP框架自带模版程序处理<??>出现的问题

使用ThinkPHP自带的模版引擎处理模版问题时,一般情况下不会有什么问题。

但是,在处理一些XHTML模版时,可能会遇到以下问题,比如,模版作者在制作模版时,为了规范页面,往往在文件头部加上<?xml version="1.0" encoding="utf-8"?>,表明文件是属于XML规范,所有的标签都必须遵循XML的相关规定。

然而,默认的ThinkPHP模版引擎在处理的时候会出现错误,处理这个错误的情况有以下几种办法。

第一种方法:你尝试关闭PHP的短标签功能
第二种方法:试着用<literal></literal>标签把XML的标签包含起来,即
<literal><?xml version="1.0" encoding="utf-8"?></literal>

第三种方法:修改ThinkPHP/Lib/Think/Template/ThinkTemplate.class.php的compiler函数,在函数的最后一行return $templContent;前加入

// 将<?标签用echo方式输出
$tmplContent = preg_replace('/(<?(?!php|=|$))/i', '<?php echo '\1'; ?>'."n", $tmplContent );

任何一种方法理论上都可以,第一种第二种方法实在不行的时候,再用第三种,毕竟第三种方法是改动核心的,如果以后更新核心库,可能会不当心就覆盖掉了。

不过,流年说过了,他已经更新了模板引擎的解析类,并且专门判断了是否开启了短标签,如果开启的话会自动用第三种方法解析。更新下SVN的ThinkTemplate.class.php 文件就可以了(可能压缩包还没有同步更新[2008-04-22])。

MySQL各存储引擎(INNODB,MyISAM等)的区别及其启动方法

MySQL各存储引擎(INNODB,MyISAM等)的区别及其启动方法

存储引擎是什么?

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

  这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,我们仅需要修改我们使用的存储引擎就可以了。

在这篇文章中,我们不准备集中讨论不同的存储引擎的技术方面的问题(尽管我们不可避免地要研究这些因素的某些方面),相反,我们将集中介绍这些不同的引擎分别最适应哪种需求和如何启用不同的存储引擎。为了实现这个目的,在介绍每一个存储引擎的具体情况之前,我们必须要了解一些基本的问题。

如何确定有哪些存储引擎可用

你可以在MySQL(假设是MySQL服务器4.1.2以上版本)中使用显示引擎的命令得到一个可用引擎的列表。

mysql> show engines;
+------------+---------+----------------------------------------------------+
| Engine | Support | Comment |
+------------+---------+-----------------------------------------------------+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
| HEAP | YES | Alias for MEMORY |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| MERGE | YES | Collection of identical MyISAM tables |
| MRG_MYISAM | YES | Alias for MERGE |
| ISAM | NO | Obsolete storage engine, now replaced by MyISAM |
| MRG_ISAM | NO | Obsolete storage engine, now replaced by MERGE |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys |
| INNOBASE | YES | Alias for INNODB |
| BDB | NO | Supports transactions and page-level locking |
| BERKELEYDB | NO | Alias for BDB |
| NDBCLUSTER | NO | Clustered, fault-tolerant, memory-based tables |
| NDB | NO | Alias for NDBCLUSTER |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | NO | Archive storage engine |
| CSV | NO | CSV storage engine |
+------------+---------+-------------------------------------------------------+

16 rows in set (0.01 sec)

这个表格显示了可用的数据库引擎的全部名单以及在当前的数据库服务器中是否支持这些引擎。

对于MySQL 4.1.2以前版本,可以使用mysql> show variables like "have_%"(显示类似“have_%”的变量):

mysql> show variables like "have_%"; 
+------------------+----------+ 
| Variable_name | Value | 
+------------------+----------+ 
| have_bdb | YES | 
| have_crypt | YES | 
| have_innodb | DISABLED | 
| have_isam | YES | 
| have_raid | YES | 
| have_symlink | YES | 
| have_openssl | YES | 
| have_query_cache | YES | 
+------------------+----------+ 
8 rows in set (0.01 sec) 

你可以通过修改设置脚本中的选项来设置在MySQL安装软件中可用的引擎。如果你在使用一个预先包装好的MySQL二进制发布版软件,那么,这个软件就包含了常用的引擎。然而,需要指出的是,如果你要使用某些不常用的引擎,特别是CSV、RCHIVE(存档)和BLACKHOLE(黑洞)引擎,你就需要手工重新编译MySQL源码 。

使用一个指定的存储引擎

你可以使用很多方法指定一个要使用的存储引擎。最简单的方法是,如果你喜欢一种能满足你的大多数数据库需求的存储引擎,你可以在MySQL设置文件中设置一个默认的引擎类型(使用storage_engine 选项)或者在启动数据库服务器时在命令行后面加上--default-storage-engine或--default-table-type选项 。

更灵活的方式是在随MySQL服务器发布同时提供的MySQL客户端时指定使用的存储引擎。最直接的方式是在创建表时指定存储引擎的类型,向下面这样:

  CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB

你还可以改变现有的表使用的存储引擎,用以下语句:

  ALTER TABLE mytable ENGINE = MyISAM 

然而,你在以这种方式修改表格类型的时候需要非常仔细,因为对不支持同样的索引、字段类型或者表大小的一个类型进行修改可能使你丢失数据。如果你指定一个在你的当前的数据库中不存在的一个存储引擎,那么就会创建一个MyISAM(默认的)类型的表。

各存储引擎之间的区别

为了做出选择哪一个存储引擎的决定,我们首先需要考虑每一个存储引擎提供了哪些不同的核心功能。这种功能使我们能够把不同的存储引擎区别开来。我们一般把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。一些引擎具有能过促使你做出决定的独特的功能,我们一会儿再仔细研究这些具体问题。

字段和数据类型

虽然所有这些引擎都支持通用的数据类型,例如整型、实型和字符型等,但是,并不是所有的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。其它引擎也许仅支持有限的字符宽度和数据大小。

这些局限性可能直接影响到你可以存储的数据,同时也可能会对你实施的搜索的类型或者你对那些信息创建的索引产生间接的影响。这些区别能够影响你的应用程序的性能和功能,因为你必须要根据你要存储的数据类型选择对需要的存储引擎的功能做出决策。

锁定

数据库引擎中的锁定功能决定了如何管理信息的访问和更新。当数据库中的一个对象为信息更新锁定了,在更新完成之前,其它处理不能修改这个数据(在某些情况下还不允许读这种数据)。

锁定不仅影响许多不同的应用程序如何更新数据库中的信息,而且还影响对那个数据的查询。这是因为查询可能要访问正在被修改或者更新的数据。总的来说,这种延迟是很小的。大多数锁定机制主要是为了防止多个处理更新同一个数据。由于向数据中插入信息和更新信息这两种情况都需要锁定,你可以想象,多个应用程序使用同一个数据库可能会有很大的影响。

不同的存储引擎在不同的对象级别支持锁定,而且这些级别将影响可以同时访问的信息。得到支持的级别有三种:表锁定、块锁定和行锁定。支持最多的是表锁定,这种锁定是在MyISAM中提供的。在数据更新时,它锁定了整个表。这就防止了许多应用程序同时更新一个具体的表。这对应用很多的多用户数据库有很大的影响,因为它延迟了更新的过程。

页级锁定使用Berkeley DB引擎,并且根据上载的信息页(8KB)锁定数据。当在数据库的很多地方进行更新的时候,这种锁定不会出现什么问题。但是,由于增加几行信息就要锁定数据结构的最后8KB,当需要增加大量的行,也别是大量的小型数据,就会带来问题。

行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着很多应用程序能够更新同一个表中的不同行的数据,而不会引起锁定的问题。只有InnoDB存储引擎支持行级锁定。

建立索引

建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能。不同的存储引擎提供不同的制作索引的技术。有些技术也许会更适合你存储的数据类型。

有些存储引擎根本就不支持索引,其原因可能是它们使用基本表索引(如MERGE引擎)或者是因为数据存储的方式不允许索引(例如FEDERATED或者BLACKHOLE引擎)。

事务处理

事务处理功能通过提供在向表中更新和插入信息期间的可靠性。这种可靠性是通过如下方法实现的,它允许你更新表中的数据,但仅当应用的应用程序的所有相关操作完全完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改,你需要要使用事务处理功能保证对借方科目和贷方科目的数据更改都顺利完成,才接受所做的修改。如果任一项操作失败了,你都可以取消这个事务处理,这些修改就不存在了。如果这个事务处理过程完成了,我们可以通过允许这个修改来确认这个操作。

简单的说,MYISAM和INNODB有以下区别

MyIASM是IASM表的新版本,有如下扩展:
二进制层次的可移植性。

NULL
列索引。

对变长行比ISAM表有更少的碎片。

支持大文件。

更好的索引压缩。

更好的键吗统计分布。

更好和更快的auto_increment处理。

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB
中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3.
对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table
时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER
操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势.

手动配置windows下面amp

手动配置windows下面amp

软件版本
apache: apache_2.0.59-win32-x86-no_ssl.msi
php : php-5.2.2-Win32
mysql : mysql-noinstall-4.0.27-win32

具体的软件我就不提供下载了,自己去找吧。。。呵呵

本来自己装的时候,一直失败,在 vampire 同志的指导下装的,才成功。。。以前一直是用集成包的,难得手工装一次,上一次手动安装已经是4、5年前的事情了(感觉很奇怪,第一次装的时候,都成功了……只是现在反而都不行了,呵呵)。

步骤开始: 我的目录 一般是在 d:/usr/local/ 下面(因为这样这个目录可以直接被我拷走到任何机器上就可以直接运行了)。
1、安装apache2,直接下一步下一步就结束了,安装好之后 apachemonitor 会自动启动,先关闭apache 。安装好的目录是:d:/usr/local/Apache2/
2、解压缩到 d:/usr/local/php目录下(如果怕偷懒,可以将几个DLL拷到c:/windows/system32目录下,当然也可以用apache的conf来LOAD)
3、修改 apache2/conf/httpd.conf,
因为我默认的 WEB 目录在 local 目录下,为 public_html ,因此我搜索 d:/usr/local/Apache2/htdocs 替换成 d:/usr/local/public_html
然后添加以下代码:(由于是在本机调试用,当然可以直接这样操作,因为让APACHE在加载的时候一次性加入这些多的DLL,还是会降低效率的。)
# PHP的配置

PHPIniDir "d:/usr/local/php"

LoadFile d:/usr/local/php/php5ts.dll
LoadFile d:/usr/local/php/libmysql.dll
LoadFile d:/usr/local/php/libmcrypt.dll
LoadFile d:/usr/local/php/libmhash.dll
LoadFile d:/usr/local/php/libeay32.dll
LoadFile d:/usr/local/php/ssleay32.dll

LoadModule php5_module "d:/usr/local/php/php5apache2.dll"
AddType application/x-httpd-php .php

DirectoryIndex index.php index.html index.htm

注意:如果是php4那么就
LoadModule php4_module "d:/usr/local/php/php4apache2.dll"
php4apache2.dll 好象不在PHP的根目录下,好象在isapi目录下,切记拷到根目录下。
上面的loadFile 好象不在根目录下(实在没有PHP4了。自己配置一下吧)

4、修改 php.ini ,如果是本机测试,那么只需要改几处就行了。
把默认的 ;extension_dir = "./ext" 改为 extension_dir = "d:/usr/local/php/ext"
然后把一些扩展打开:
extension=php_mbstring.dll
extension=php_exif.dll
extension=php_curl.dll
extension=php_mhash.dll
extension=php_mcrypt.dll
extension=php_gd2.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll

切记,php_mbstring.dll 要放在最前面,因为有部份DLL在加载的时候,要求先加载mbstring的,例如exif,当然具体开几个扩展,自己看自己的需求情况吧。
再然后,修改一下upload_max_filesize = 2M ,这个是默认的,如果有需要,可以改大一点,一般不要超过8M
再修改一下 session.save_path = "d:/usr/local/sessions" (前提是先建好这个目录)

5、解压缩mysql的压缩文件到 d:/usr/local/mysql目录,在目录下建一个bat文件,里面放上一句
copy my-huge.cnf my.ini
如果还有内容修改,可以参照网上的一些my.ini配置来进行修改
再到bin目录下建一个bat文件,名字是:installMysql.bat
内容为:
mysqld-nt --install mysql --default-file="d:/usr/local/mysql/my.ini"
net start mysql
这样的话,安装后的服务名为 mysql ,默认读取的文件是 my.ini ,可以避免将my.ini拷到C盘根目录下,方便下次重装系统后使用

6、现在再利用apache monitor打开apache,到public_html目录下建一个 phpinfo.php,内容为
<?php
phpinfo();
?>
到浏览器里看一下,是不是mysql,gd都加载好了?


7、如果你还需要zend的扩展,那么到我这里下载吧。。。(点击下载)
步骤:先停掉apache,修改php.ini,在最后加上
[zend]
zend_extension_ts="d:/usr/local/zend/optimizer/ZendExtensionManager.dll"
zend_extension_manager.optimizer_ts="d:/usr/local/zend/optimizer/lib"
当然了,下载的压缩文件是解压到d:/usr/local/zend目录下(我提供的只支持php 5.2.x)如果你有特别需要,可以到zend的网站上下载,然后安装好之后,COPY 过来并卸载掉zend optimizer。

MSN掀起签名热 红心连成片表爱国热情

MSN掀起签名热 红心连成片表爱国热情

“msn名字前面请加(L)CHINA,让全世界看看华人的团结。请转发您的msn朋友。”4月16日,这则简短的信息在MSN用户间迅速传递,网友们通过这种方式来表达爱国热情。

新民网记者了解到,按照上述信息的指示,在MSN名字前加上(L)CHINA后,“(L)”就会显示为一颗红心。网友苏小姐向新民网称,她吃完午饭后回到电脑桌前,发现MSN上已经是一片红心了,身在海外的朋友们也加入到了这一行列中。还有不少网友将红心后面的文字做了修改,加上了如“One world one dream”等口号。

网友苏小姐说,她的朋友在转发信息时还特地叮嘱她,要将MSN上朋友的备注调整成统一格式,让一颗颗炽热的红心连成一片,以展现中华民族强大的凝聚力和中国人民炽烈的爱国心。

新闻来源:新民网

这个贴子来自于cnBeta.com。

不过。留言更有意思。。。

mephisto 发表于 2008-04-16 15:43:16
每当一个国家的ZZ 、经济出现重大危机的时候,爱国主义的破旗就又散发出臭味来。
——列宁(苏维埃的缔造者)
回复 支持(424) 反对(79) 举报
匿名人士 发表于 2008-04-16 15:45:20
love China not party
回复 支持(340) 反对(27) 举报
匿名人士 发表于 2008-04-16 16:02:29
第一,MSN不是国产的软件;
第二,有多少老外能看到你的MSN?
第三,一个老外的MSN上能有几个中国人?
回复 支持(235) 反对(48) 举报
匿名人士 发表于 2008-04-16 15:47:21
抵制美国的你就不要用微软啊苹果啊 MSN啊!~ 恶心
回复 支持(187) 反对(61) 举报
匿名人士 发表于 2008-04-16 15:44:17
我低估了“人民”这种东西的智商
回复 支持(154) 反对(29) 举报
匿名人士 发表于 2008-04-16 15:57:47
总是把爱国挂在嘴上,所以一口唾沫就能吐掉
回复 支持(129) 反对(24) 举报

最后一个,我才是比较欣赏的。