2011-09-18 49 views
0

在網頁上,我們有以下系統的服務器端表單驗證。例如,如果用戶正在添加一個事件的日期詳細信息(並且事件可以包含很多這樣的日期詳細信息),我們在點擊下面的「添加」按鈕時調用一個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

我不明白,你說有10個Ajax第一次調用,或者有10個來自服務器的myclass.php調用? – roselan

+0

10調用服務器上的myclass.php,但不會調用/訪問validationArrName部分,直到最後一次調用。 – siliconpi

+0

嗨@roselan - 有10個調用服務器上的myclass.php,但是validationArrName部分不被調用/訪問,直到最後一次調用... – siliconpi

回答

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())。

相關問題