2012-05-16 70 views
0

摘要:這是一個基本的,獨立的Web窗體。只是HTML表單,包含了一個JQuery函數。JQuery/Ajax調用功能不正確

我有一個表格檢查電子郵件和用戶名的唯一性和有效性(電子郵件)。我正在使用JQuery onChange事件來調用每個函數,這是一個Ajax調用一個PHP文件。

了jQuery的用戶名檢查如下:

$("#username").change(function() { 
    var username = $("#username").val(); 
    var msgbox_username = $("#username_status"); 
    var dataString = "username="+ username; 

    $("#username_status").html('<img src="images/loader.gif">Checking Availability.'); 
    if (username != "" && username.length >= 6){ 
     $.ajax({ 
      Type: "POST", 
      url: "functions/check_username.php", 
      data: dataString, 
      success: function(msg_username) { 
       $("#username_status").ajaxComplete(function (event, request) { 
        if (msg_username == 'Username Ok') { 
         $("#username").removeClass("red").addClass("green"); 
         msgbox_username.html('<font color="Green">Available</font>'); 
        } else { 
         $("#username").removeClass("green").addClass("red"); 
         msgbox_username.html(msg_username); 
        } 
       }); 
      } 
     }); 
     return false; 
    } else { 
     $("#username").removeClass("green").addClass("red"); 
     msgbox_username.html('<font color="Red">Username of 6 or more characters is required</font>'); 
    } 
}); 

的check_username.php文件如下:

<?php 
$username = $_GET["username"]; 
include_once("../includes/connect.php"); 
$query = "SELECT username 
      FROM  sss_users 
      WHERE  username = '$username'"; 
$result = mssql_query($query); 
if(mssql_num_rows($result) > 0 && strlen($username) >= 6) { 
    echo '<font color="#cc0000"><strong>' . $username . '</strong> is already in use. </font>'; 
} else { 
    echo 'Username Ok'; 
} 
?> 

與模式繼續,電子郵件JQuery的:

$("#email").change(function() { 
    var email = $("#email").val(); 
    var msgbox_email = $("#email_status"); 
    var dataString = "email="+ email; 

    $("#email_status").html('<img src="images/loader.gif">Checking Availability.'); 
    var atpos = email.indexOf("@"); 
    var dotpos = email.lastIndexOf("."); 
    if (atpos < 1 || dotpos < atpos + 2 || dotpos + 2 >= email.length){ 
     $("#email").removeClass("green").addClass("red"); 
     msgbox_email.html('<font color="Red">Valid Email Required</font>'); 
    } else { 
     $.ajax({ 
      Type: "POST", 
      url: "functions/check_email.php", 
      data: dataString, 
      success: function(msg_email) { 
       $("#email_status").ajaxComplete(function (event, request) { 
        if (msg_email == 'Email Ok') { 
         $("#email").removeClass("red").addClass("green"); 
         msgbox_email.html('<font color="Green">Available</font>'); 
        } else { 
         $("#email").removeClass("green").addClass("red"); 
         msgbox_email.html(msg_email); 
        } 
       }); 
      } 
     }); 
     return false; 
    } 
}); 

而電子郵件PHP:

<?php 
$email = $_GET["email"]; 
include_once("../includes/connect.php"); 
$query = "SELECT email 
      FROM  sss_users 
      WHERE  email = '$email'"; 
$result = mssql_query($query);   
if(mssql_num_rows($result) > 0) { 
    echo '<font color="#cc0000"><strong>' . $email . '</strong> is already in use. </font>';  
} else { 
    echo 'Email Ok';  
} 
?> 

他們每個seperately工作,但如果我把一個無效的用戶名在框中,然後把一個有效的電子郵件,不知何故check_username.php文件被調用,不管是在框中(有效與否)它認爲這是一個有效的用戶名。

一個例子是:

所有功能都要求onChange事件

1)中的用戶名asdfasdf類型(可用)

2)從刪除用戶名asdfasdf文本框(此功能正常,顯示用戶名必須至少包含6個字符)

3)鍵入任意有效的電子郵件地址

結果:有效的郵件工作正常,但用戶名字段(空白)回憶說那兒有什麼之前(asdfasdf),並說,這是一個有效的用戶名(即使該領域仍是空白。)

希望這是有道理的。有什麼建議麼?

SOLUTION

如下文所述,該.ajaxComplete()調用是包含該標籤的所有功能。因此,當我做了以下修改它的工作:

$("#username_status").ajaxComplete(function (event, request) { ... code here ... }); 

改爲:

$("#username_status").ajaxComplete(function (event, request, settings) { ... code and new if statement ... }); 

然後我裹

if(settings.url == 'functions/check_username.php') {} 

周圍的驗證代碼。這個過程用於用戶名和電子郵件驗證。

+1

指定程序在哪裏或製作一個jsfiddle示例 –

+0

您是否在第3步中說,更改電子郵件會刪除用戶名的驗證消息? –

+0

是的。這幾乎就像調用電子郵件驗證的OnChange也會調用用戶名驗證一樣。但是,沒有理由應該這樣做,因爲OnChange事件鏈接到兩個不同的輸入字段。 – jascissom

回答

0

http://api.jquery.com/ajaxComplete/

每當一個Ajax請求完成後,jQuery的觸發ajaxComplete 事件。任何和所有已在 .ajaxComplete()方法中註冊的處理程序都會在此時執行。

也許這兩個處理程序正在被解僱。

+0

完美。這正是問題所在。解決方案是將設置傳遞給函數,然後檢查settings.url ==「我需要的url」這使得另一個函數不應該運行。 – jascissom