2012-06-10 59 views
0

EDIT2:耶,發現問題,居然有在Ajax調用一個錯誤,因爲我的愚蠢,我不知道,這兩種方法 - 成功和錯誤可以跑(我想這是不是一個或另一個),所以formComplete每次都被設置爲false,因爲出現錯誤。爲什麼這個變量在函數中傳遞時會發生變化?

欣賞你給&尖關於不使用全局變量名作爲函數參數的時間。

編輯:這裏是()的console.log(的檢查formComplete整個過程),其中formComplete設置代碼:去爲什麼這個變量(formComplete):

validate: function(field) { 
      if(!field.val()) { 
       formComplete = false; 
       // formComplete is false here 
       console.log(formComplete); 
      } 
      else { 
       if(field.attr('name') === 'queryEmail') { 
        // Validate the email 
        if(DMOFFAT.helper.validateEmail(field.val()) === true){ 
         // formComplete is either true or false here, depending on the last validation carried out 
         console.log(formComplete); 
         formComplete = true; 
         // formComplete is true here 
         console.log(formComplete); 
        } 
        else { 
         formComplete = false; 
         // formComplete is false here 
         console.log(formComplete); 
        } 
       } 
       else { 
        formComplete = true; 
        // formComplete is true here 
        console.log(formComplete); 
       } 

      } 
     }, 

問題從真到假?

我已經寫了一些基本的表單驗證聯繫人的形式,這裏是如何我已經做到了:

定義的字段,如下所示:

var queryTypeField = $('#queryType'), 
    queryMessageField = $('#queryMessage'), 
    queryEmailField = $('#queryEmail'), 
    queryNameField = $('#queryName'), 
    submitButton = $('#submit'); 

添加一些事件處理程序對這些像這樣(FWIW,DMOFFAT變量只是保持該代碼例如聯繫形式=接觸形式的不同模塊的JavaScript等的對象):

queryMessageField.on('blur', function() { 
     DMOFFAT.contactForm.validate(queryMessageField); 
    }); 

    queryNameField.on('blur', function() { 
     DMOFFAT.contactForm.validate(queryNameField); 
    }); 

    queryEmailField.on('blur', function() { 
     DMOFFAT.contactForm.validate(queryEmailField); 
    });  

    submitButton.on('click', function(evt) { 
     evt.preventDefault(); 
     console.log('Click'); 
     console.log(formComplete); 
     DMOFFAT.contactForm.send(formComplete); 
    }); 

的驗證函數簡單地設置'formComplete'爲true或false,取決於字段是否有效。

當我的領域都填寫正確,formComplete = true

正如你可以從上面我的代碼的最後一行看到,我通過formComplete(這是真的)到我的發送功能。我的發送功能只是檢查的formComplete值,然後將數據發送關閉PHP腳本,或打印錯誤,下面的代碼:

 send: function(formComplete) { 
     // This is true when the form is filled in correctly 
     console.log('In send formComplete is...' + formComplete); 
     if(formComplete === true) { 
      // Extract form values 
      formData['queryMessage'] = queryMessage.value; 
      formData['queryType'] = queryType.value; 
      formData['queryName'] = queryName.value; 
      formData['queryEmail'] = queryEmail.value; 
      $.ajax({ 
       type: 'POST', 
       async: true, 
       url: '....', 
       dataType: 'json', 
       data: formData, 
       success: function(data, status, xhr) { 
        DMOFFAT.contactForm.writeMessage(formComplete); 
       }, 
       error: function(xhr, status, err) { 
        DMOFFAT.contactForm.writeMessage(formComplete); 
       } 
      }); 

     } 
     else { 
      this.writeMessage(formComplete); 
     } 

現在,我知道formComplete是真實的,當表單填寫正確的,因爲我的PHP腳本創建一個.txt文件的數據,如果它是假的,這個文件不會被創建。

這意味着我們發送的formComplete值關閉到的WriteMessage,它只是寫了一些HTML頁面顯示提交是否成功與否,下面的代碼:

formComplete本身定義像這樣:

var formComplete; 

當我檢查formComplete的WriteMessage上的第一行,它現在假的,我無法找出原因,但...甚至當我明確設置formComplete爲true它的第106頁寫入MessageMes​​sage,它仍然是錯誤的。

TLDR:告訴我,在那裏我太傻了,請:)

PS:我知道我可以使用預建的聯繫表單驗證插件,但想嘗試建立一些簡單的自己。

+0

您發送'formComplete'到'DMOFFAT.contactForm.writeMessage();'。它是否是您定義'writeMessage'的同類對象? –

+0

你正在做一些有趣的事情,有一個全局變量與函數參數具有相同的名稱......沒有錯誤或無效,但在該函數中,它是將被引用的本地參數,而不是全局變量。 – Pointy

+2

formComplete是全局定義的嗎? – chucktator

回答

0

問題是,您從AJAX請求的回調函數調用writeMessage(),因此解釋器正在執行時查找全局變量。無論如何,你可以簡單地傳遞true在你的回調函數writeMessage(),因爲調用才能執行,如果formCompletetrue -

相關問題