昨天写一个验证器时遇到一个问题:传给验证函数的回调函数无法修改宿主(回调函数是宿主Vaildtor的成员方法)的属性(message),不报错,但就是修改没有效果;及其郁闷之下,去掉了那个属性(message),声明了个公共变量MSG,用来存放验证失败的消息。代码如下,不知各位高手有何高见,不要使用公共变量。
<!--
/*!
 *验证器
 *@author 胡海
 */
 var MSG=[];
/*!
 *验证任务
 *@parm type 验证类型
 *@param parameters 验证动作参数列表
 */
function Shedule(type,parameters)
{
this.type=type;
this.parameters=parameters;
}/*!
 *任务类型
 *@param type 验证类型
 *@param action 验证动作
 */
function SheduleType(type,action)
{
this.type=type;
this.action=action;
}/*!验证器
 *@param form 要验证的表单(jQuery包装过的对象)
 *@param isShowMessageTogether(是否同时显示消息)
 */
function Vaildtor(form,isShowMessageTogether)
{
this.form=form;
this.sheduleList=[];
this.sheduleTypeList=[new SheduleType('EMPTY_VALUE',checkEmptyContent),new SheduleType("INVILD_EMAIL",checkInvildEmail)];
this.addMsg=function(msg)
{ var temp=this;
if(msg!=null && jQuery.trim(msg)!='')
{
MSG[MSG.length]=msg;
}
};
this.showMsg=function()
{
var msg='';
for(var i=0;i<MSG.length;i++)
if(isShowMessageTogether)
msg+=MSG[i]+'\n';
else
alert(MSG[i]);
if(isShowMessageTogether)
alert(msg);
};
this.doShedule=function(shedule)
{
for(var i=0;i<this.sheduleTypeList.length;i++)
if(shedule.type=this.sheduleTypeList[i].type)
{
return this.sheduleTypeList[i].action(shedule.parameters,this.addMsg);
}

};
}
/*!
 *获取任务类型列表
 */
Vaildtor.prototype.getSheduleTypeList=function()
{
return this.sheduleTypeList;
};

/*!
 *添加任务类型
 *@param type 验证类型
 *@param action 任务动作
 */
Vaildtor.prototype.addSheduleType=function(type,action)
{
this.sheduleTypeList[this.sheduleType.length]=new SheduleType(type,action);
}

/*!
 *添加任务
 *@param type 验证类型
 *@parm params 验证动作参数列表
 */
Vaildtor.prototype.addShedule=function(type,params)
{
this.sheduleList[this.sheduleList.length]=new Shedule(type,params);
};

/*!
 *部署验证
 */
Vaildtor.prototype.deployVaildShedule=function()
{
var temp=this;
this.form.submit(
function(event)
{
MSG=[];
var flag=true;
for(var i=0;i<temp.sheduleList.length;i++)
{
flag=flag & temp.doShedule(temp.sheduleList[i]);
}
if(flag==false)
{
temp.showMsg();
event.preventDefault();
}
}
);
};

/*!
 *空值检查
 *@param input 要检查的输入控件 (jQuery包装过的对象)
 *@param message 内容为空时的提示信息
 *@param isFilterPragraphTag 是否过滤段落标记
 *@param isFilterBlank 是否过滤空格
 *@param callback 回调函数
 */
checkEmptyContent=function(params,callback)
{
input=params.input;
message=params.message;
isFilterPragraphTag=params.isFilterPragraphTag;
isFilterBlank=params.isFilterBlank;
if(input.val()!='')
{        
var noWarpContent=input.val();
if(isFilterPragraphTag)//过滤段落标记
{
//过滤<p>标记
while(noWarpContent.indexOf('<p>')>=0)
noWarpContent=noWarpContent.replace('<p>','');
//过滤</p>标记
while(noWarpContent.indexOf('</p>')>=0)
noWarpContent=noWarpContent.replace('</p>','');
}
if(isFilterBlank)//过滤空格
{
//过滤空格标记
while(noWarpContent.indexOf('&nbsp;')>=0)
noWarpContent=noWarpContent.replace('&nbsp;','');
while(noWarpContent.indexOf('&nbsp')>=0)
noWarpContent=noWarpContent.replace('&nbsp','');
//过滤空格
noWarpContent=$.trim(noWarpContent);
}
if($.trim(noWarpContent)!='')
{
return true;
}
}
callback(message);
return false;
};

    /*!
 *检查邮件地址有效性
 */
checkInvildEmail=function(params,callback)
{}
//-->

解决方案 »

  1.   

    这个验证器是需要jQuery1.3.2支持的,调用方法如下:1.实例化验证器对象
    2.添加验证任务
    3.部署验证任务示例调用代码如下:
    <script type="text/javascript">
         var vaildtor=new Vaildtor($('form.replyTopic'),true);
         vaildtor.addShedule('EMPTY_VALUE',
                          {   
                              input:$('#content'),
                              message:'回复内容不可以为空!',
                              isFilterPragraphTag:true,
                              isFilterBlank:true
          }
         );
         vaildtor.deployVaildShedule();
    </script>
      

  2.   

    在Vaildtor中的doShedule中addMsg作为回调函数添加验证失败的提示信息,如果将MSG换为Vaildtor的属性message,addMsg在被回调时对message的修改总是不起作用。如果说是引用传递与值传递的问题,那用数组总没问题吧(原来用的字符串),但还是不行,恳请各位出出主意,看能否不用公共变量,而是把消息存放在Vaildtor内部。