在网页上,我们有以下服务器端表单验证系统。例如,如果用户正在为事件添加日期详细信息(并且事件可以包含许多此类日期详细信息),则我们会在单击“添加”按钮时调用javascript函数,如下所示。
validateForm('frmName','codelibrary/classes/myclass.php','validationArrName')
where:
@frmName = form name
@codelibrary/classes/myclass.php = location of class file, that contains classes and functions for server side validation
@validationArrName = Type of validation we apply
In the php script, validationArrName is defined as a list of keys (representing form fields) and values (representing the functions we will call to validate that form field).
validationArrName = array ('fieldName1'=>validationFun1,'fieldName2'=>validationFun2);
eg:
fieldName1 = email_address
validationFun1 = validateEmail()
在html页面上,我们通过ajax调用服务器端验证如下。
$.post(className,$("form[name="+formName+"]").serialize()+"&isValidate=1&validateArrayName="+validateArrayName,function(data){ ... });
如果验证功能报告错误,我们会在html页面上显示相应的错误消息。
问题在于,当我们第一次这样做时(例如:在刷新页面之后),提交此日期详细信息表单进行验证需要很多时间,如与后续请求相比。
我们观察到,它不是一次调用codelibrary / classes / myclass.php文件,而是在跳转到所需位置(validationArrName)并运行它之前实际引用此文件超过10次。
对于后续请求,它工作正常,只引用该文件一次。
这可能是什么问题?我们使用jquery提交会有问题吗?
答案 0 :(得分:0)
你能做的最好的事情就是时间。
在javascript中:
console.time('post load'):
$.post(className,$("form[name="+formName+"]").serialize()+"&isValidate=1&validateArrayName="+validateArrayName,function(data){
console.timeEnd('post load');
console.log('data');
...
});
在php中,使用microtime来计算不同的部分并回显它们。它们将在控制台中打印出来。
它不应该是缓存或包含相关的,因为ajax每次都会启动一个新的连接。
根据您的意见,我编辑了这个答案:
我仍然不知道会发生什么。但是我看到了两种可能性。第一个是您使用“标志”来验证表单。加载页面时,所有表单标志都未设置,并首先提交全部检查。后续提交工作正常。
另一种选择是,第一次提交表单时,您在提交点击时不会event.preventDefault()
,但它仍然是一个松散的解释。
我很想看看你如何调用$.post(...)
函数(如何绑定提交按钮,或者如何调用$()。submit()。