2012-07-19 64 views
1

我有一個這樣的javascript調用:的Javascript錯誤警報爲了

usernameTest('queijo'); 
alert('a'); 

功能usernameTest()工作,並進行調試,它會提醒字符串「T」或「F」。

爲什麼當我加載這個頁面時,顯示的第一個警告是「a」,只有在「t」或「f」之後? (順便說一句,jQuery是加載到頁面了。)

[編輯]

源代碼:

function usernameTest(username) { 
    var unReg = /^[0-9a-zA-Z_]{1,20}$/; 
    if(!unReg.test(username)) 
     return false; 
    $.ajax({ 
     type : 'POST', 
     url : 'checkuser.php', 
     data : 'username=' + username, 
     cache : false, 
     success : function(response) { 
      if(response == 1) { 
       alert('f'); 
       return false; 
      } else { 
       alert('t'); 
       return true; 
      } 
     } 
    }); 
} 

[EDIT2]

我已經知道的問題是,是叫AJAX 。新的主要問題現在是另一個。 我這樣稱呼它(在適當的地方,而不是用於調試的代碼);

if(!usernameTest(argument)) 
    //do something 

我該怎麼做這樣的事情?

回答

1

如果要使用的代碼可能會根據系統狀態而更改,則可以將該函數作爲參數傳遞給usernameTest以執行您所期望的操作。否則,您可以直接在if語句中編寫代碼。

function usernameTest(username, onFailure) { 
    // code here... 

    $.ajax({ 
     // ajax setup here... 
     success : function(response) { 
      if(response == 1) { 
       //... 
      } else if (typeof(onFailure) === 'function') { 
       onFailure(); 
      } 
     } 
    }); 
} 

var name = 'Bob'; 
var onFailure = function() { 
    // do something 
}; 

usernameTest(name, onFailure); 

另外,請嘗試當你問你的問題,除非是不清楚或需要作詳細說明不改的問題要具體。如果有人回答了原始問題,他/她應該得到信用,並且應該分別詢問其他問題。

+0

謝謝!並且感謝您的建議,我在這裏是新的,當我第一次發佈這個問題時,我幾乎陷入恐慌。 – 2012-07-19 01:45:34

0

您的usernameTest功能確實不是提醒任何事情,否則會在提醒「a」之前發出警報。

我確定它安裝了一個事件監聽器(可能是文檔準備好了嗎? - 如果你給我的代碼,我可以告訴你更多),其中「用戶」提醒。事件監聽器函數不是立即執行,而是在將來執行。

2

@Bergi說的或usernameTest()是一個AJAX函數 - 這意味着它是異步的。考慮在問題中包含usernameTest()函數的來源 - 這樣就會更容易回答。

更新:我看到它是一個AJAX函數。你需要把你的代碼在回調中:

success : function(response) { 
      if(response == 1) { 
       //do stuff here - you can't return from here as this is asynchronous - i.e. happening independently (not at the same time) of the rest of the code 
      } else { 
       //do stuff here - you can't return from here as this is asynchronous - i.e. happening independently (not at the same time) of the rest of the code 
      } 
     } 
+0

已添加源代碼。是的,這是AJAX ...有什麼辦法解決這個問題? – 2012-07-19 01:06:33

+0

謝謝你的回答! – 2012-07-19 01:46:35

1

usernameTest發出ajax請求。 ajax中的第一個A代表異步:請求發出,代碼立即執行,包括alert('a')調用。只有當響應從服務器返回時才執行成功回調,包括alert('t')

這種異步執行方式是Javascript開發的核心。你必須擁抱它並用它來解決你的問題。戰鬥只會導致悲傷。

請注意您的返回語句不會從usernameTest返回值。他們從成功回調中返回。您的usernameTest函數不會返回任何內容。沒有辦法像這樣將異步請求轉換爲同步函數返回。

您需要找到一種方法異步使用來自服務器的答案。例如,無論你打算放入調用的if子句,而是將該代碼放入成功回調本身。然後它將獲得真實或錯誤的價值。

+0

我這樣調用它:if(usernameTest(argument))等等等等等等。我應該怎麼做? – 2012-07-19 01:18:32

+0

@JoãoLuís:我已經添加到我的答案。 – 2012-07-19 01:30:37

+0

謝謝你的回答! – 2012-07-19 01:47:30

0

永遠不會使用警報。使用(){console.log()}或(){console & & console.log()}。

通過使用警報,您只能看到一條消息。你從來不想擁有的味精。

使用的console.log你看到實例的功能的消息, 沒有違反網站:

什麼? [確定]

+0

謝謝你的提示!雖然在PHP,HTML和CSS方面經驗豐富,但我幾乎是一個使用JavaScript的新手... – 2012-07-19 01:48:26

+1

@JoãoLuís嘗試調試器並設置斷點;)我隱藏的最愛是js的IE9.10 [F12],但也使用Firebug for HTML,用於javaScript和* kit的V8窗口! – metadings 2012-07-19 02:04:35