jquery ajax成功函数只能工作一次

时间:2012-05-03 08:48:54

标签: php jquery ajax

我正在尝试实现一个利用jquery的post功能来动态更新数据库的表单。我意识到的是,在用户点击“更新”按钮后,成功函数被回复就好了“更新成功”消息。

我对stackoverflow世界的问题是为什么在后续点击(没有刷新页面)我没有得到同样的成功消息。而且,具有讽刺意味的是我的数据库正在更新,所以我知道AJAX调用正在进行中。

我在下面发布了我的代码:

JS

var TEAM = { 
update: function() {

    var form_data = $('form').serialize();
    $.ajax({
        type: "POST",
        url: "../manager/edit_team.php",
        data: form_data,
        error: function() {
            $('#status').text('Update failed. Try again.').slideDown('slow');
        },
        success: function() {
            $('#status').text('Update successful!');
        },
        complete: function() { 
            setTimeout(function() {
                $('#status').slideUp('slow');
                }, 3000);
        },
        cache: false
    });
}
}

// jQuery Code for when page is loaded
$(document).ready(function()
{
 $("#update").on("click", function() {
     TEAM.update();
 });
 });

PHP(我也欢迎任何其他评论)      

require '../includes/config.php';
include '../includes/header.html';

// autoloading of classes
function __autoload($class) {
    require_once('../classes/' . $class . '.php');
}

// Site access level -> Manager
$lvl = 'M'; 

// Assign user object from session variable
if (isset($_SESSION['userObj']))
{
    $manager = $_SESSION['userObj'];
}
else 
{
    session_unset();
    session_destroy();
    $url = BASE_URL . 'index.php';
    ob_end_clean();
    header("Location: $url");
    exit(); 
}

// Establish database connection
require_once MYSQL2;

// Assign Database Resource to object
$manager->setDB($db);

// Authorized Login Check
if (!$manager->valid($lvl))
{
    session_unset();
    session_destroy();
    $url = BASE_URL . 'index.php';
    ob_end_clean();
    header("Location: $url");
    exit(); 
}

// Check for a valid game sch ID, through GET or POST:
if ( (isset($_GET['z'])) && (is_numeric($_GET['z'])) )
{
    // Point A in Code Flow
    // Assign variable from myteams-m.php using GET method
    $id = $_GET['z'];
}
elseif ( (isset($_POST['z'])) && (is_numeric($_POST['z'])) )
{
    // Point C in Code Flow
    // Assign variable from edit_team.php FORM submission (hidden id field)
    $id = $_POST['z'];
}
else 
{
    // No valid ID, kill the script.
    echo '<p class="error">This page has been accessed in error.</p>';
    include '../includes/footer.html';
    exit();
}

$team = new ManagerTeam();
$team->setDB($db);
$team->setTeamID($id);
$team->pullTeamData();

$flag = 0;
echo $flag . "<br />";
// Confirmation that form has been submitted:   
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{   // Point D in Code Flow

    // Assume invalid values:
    $tname = FALSE;

    // Validate team name
    if ($_POST['tname'])
    {
        $tname = $_POST['tname'];

    }
    else 
    {
        echo '<p class="error"> Please enter a team name.</p>';
    }       

    // Validate about team information
    if ($_POST['abouttm'])
    {
        $abtm = trim($_POST['abouttm']);

    }
    else 
    {
        $abtm = '';
    }

    // Check if user entered information is valid before continuing to edit game
    if ($tname)
    {
        if($team->editTeam($tname, $abtm) == True)
        {
            echo '<p>Team was successfully updated</p>';
            $flag = 1;
        }
        else 
        {
            echo '<p>No changes were made</p>';
            $flag = 2;
        }
    }
    else
    {   // Errors in the user entered information
        echo '<p class="error">Please try again.</p>';
    }

}   // End of submit conditional.
echo $flag . "<br />";
// Point B in Code Flow
// Always show the form...

// Get team name attribute
$team->pullTeamData();
$teamname = $team->getTeamAttribute('tmname');
$about = $team->getTeamAttribute('about');

if ($teamname != '') // Valid user ID, show the form.   
{
    // Headliner
    echo '<h2>Edit Team</h2>';

    // Create the form:
    echo '
    <div id="EditTeam"></div>
    <div id="Team">
        <fieldset id="TeamDetails">
            <legend>Edit Team</legend>
            <form method="post" id="information">
            <p id="status"></p>
            <input type="hidden" name="z" value="' . $id . '" />                
            <p>
                <label for="tname">New Team Name:</label><br/>
                <input type="text" name="tname" id="tname" size="10" maxlength="45" value="' . $teamname . '" />
            </p>
            <p>
                <label for="abouttm">Team Information:</label><br/>
                <textarea id="abouttm" name="abouttm" cols="30" rows="2">"' . $about . '"</textarea><br />
                <small>Enter something cool about your team.</small>
            </p>
            <p>
                <input type="hidden" name="id" id="id">
                <input type="button" value="update" id="update" />
            </p>
        </form>
        </fieldset>
    </div>';                

}
else 
{   //Not a valid user ID, kill the script
    echo '<p class="error">This page has been accessed in error.</p>';
    include '../includes/footer.html';
    exit();
}   

// Close the connection:
$db->close();
unset($db);

include '../includes/footer.html';
?>

您会注意到我还定义了一个$ flag来帮助调试,但具有讽刺意味的是,无论“更新”按钮的点击次数如何,它都会输出0。所以没有迹象表明数据库正在更新,但是当我检查表时肯定是。

我感谢任何帮助或指示。谢谢,

1 个答案:

答案 0 :(得分:2)

#status消息未显示,因为您已将其隐藏 slideUp(),要再次显示,您需要slideDown()他们。

    success: function() {
        $('#status').text('Update successful!');
-ADD->  $('#status').slideDown('slow');
    },
    complete: function() { 
        setTimeout(function() {
            $('#status').slideUp('slow');
            }, 3000);

以与错误处理程序相同的方式执行操作:
success: function(){
$('#status').text('Update successful!').slideDown('slow');
...

似乎你已经知道了,只是忘记了......

可能有用的其他方法是stop(),以确保在新动画启动时停止上一个动画。,在使用 long 超时时尤其重要/动画。
(有用= 可以防止其他可见性问题,并确保消息不会开始跳入和跳出
(long = 大约0.5-1.5秒或更长时间,如果在这段时间内可能发生其他事情那么它很长......

例如,这将clear fx queuefinish running animation immediatelyslideUp()

$('#status').stop(true, true).slideUp('slow');

您还询问了其他代码部分的建议

如果您使用相同的代码至少两次,或者如果它是可以重复使用的一般方法,则使其可重用:

function redirect_to( $page ) {
    session_unset();
    session_destroy();
    $url = BASE_URL . $page;
    ob_end_clean();
    header("Location: $url");
    exit(); 
}

if ($condition == true) {
    redirect_to( 'index.php' );`
}