2012-02-09 54 views
2

現在我已經爲我正在處理的這個任務組織器項目提供了幾個AJAX方法 - 到目前爲止,我只有插入的工作和刪除部分工作。出於某種原因,我無法弄清楚爲什麼我無法在刷新頁面之前刪除新條目。在PHP生成的代碼(第五從而echo下降顯示了我傳遞的是與我的數據庫任務id相關的ID):使用AJAX刪除表格/數據庫項目的問題

function generateTaskTable(){ 
    $con = mysql_connect('localhost', '-', '-'); 
    if (!$con) { 
     die('Could not connect: ' . mysql_error()); 
    } 
    mysql_select_db("tasks", $con); 
    $result = mysql_query("SELECT * FROM tasks order by taskDate ASC"); 
    echo '<table id="task_table">'; 
    while($row = mysql_fetch_array($result)) 
    { 
     $id = $row['taskID']; 
     echo '<tr id="row'.$id.'">'; 
     echo '<td>'.convertDate($row['taskDate']).'</td>'; 
     echo '<td>'.$row['hours'].'</td>'; 
     echo '<td>'.$row['task'].'</td>'; 
     echo '<td><a href=""><img src="images/trash.png" class="delete" name="'.$id.'"></a> 
     <a href=""><img src="images/delete.png" class="unsuccessful"></a> 
     <a href=""><img src="images/check.png" class="successful"></a></td>'; 
     echo '</tr>'; 
    } 
    echo '</table>'; 
    mysql_close($con); 
} 

的JQuery/Ajax調用:

<script type="text/javascript"> 
    $(document).ready(function(){ 
     $('.delete').click(function(e){ 
      var deleteID = $(this).attr('name'); 
      var row = deleteID; 
      $.ajax({ 
       type: "POST", 
       url: "ajax.php", 
       data: "deleteID="+ deleteID, 
       success: function(result){ 
        $('#row'+row).fadeOut('fast'); 
       } 
      }); 
      e.preventDefault(); 
     }); 

     $("form#submit").submit(function(e) { 

      var day = $('#dayDD').val(); 
      var month = $('#monthDD').val(); 
      var year = $('#yearDD').val(); 
      var hours = $('#hours_text').val(); 
      var task = $('#task_text').val(); 

      $.ajax({ 
       type: "POST", 
       url: "ajax.php", 
       data: "day=" + day + "&month=" + month + "&year=" + year + "&hours=" + hours + "&task=" + task, 
       success: function(result){ 
        $('#hours_text').val(''); 
        $('#task_text').val(''); 
        $('#task_table').append(result); 
       } 
      }); 
      e.preventDefault(); 
     }); 
    }); 
</script> 

阿賈克斯.php:

if(isset($_POST['deleteID'])){ 
    deleteTask($_POST['deleteID']); 
} 

if (isset($_POST['task'])&& isset($_POST['hours'])){ 
    $newID = insertTask(); 
    $month = $_POST['month']; 
    $day = $_POST['day']; 
    $year = $_POST['year']; 
    $task = $_POST['task']; 
    $hours = $_POST['hours']; 
    $day = str_pad($day, 2, "0", STR_PAD_LEFT); 

    echo'<tr id="row'.$newID.'"><td>'.$month.' '.$day.', '.$year.'</td><td>'.$hours.'</td><td>'.$task.'</td><td><a href=""><img src="images/trash.png" class="delete" name="'.$newID.'"></a><a href=""><img src="images/delete.png" class="unsuccessful"></a><a href=""><img src="images/check.png" class="successful"></a></td></tr>'; 
} 

ajax.php的底部顯示了返回到AJAX調用的代碼。當我查看生成的源代碼時,它一旦添加一個新條目,新生成的ID就會正確並正確地分配給映像名稱 - 但它無法正常工作。而不是從表格和我的數據庫中刪除頁面刷新和項目不會被刪除,直到您再次單擊圖像。我還注意到圖標對齊略有偏離,我不知道爲什麼,因爲生成的源顯示與所有其他表項完全相同的格式。

刪除功能:

function deleteTask($id){ 
    $con = mysql_connect('localhost', '-', '-'); 
    if (!$con) { 
     die('Could not connect: ' . mysql_error()); 
    } 

    mysql_select_db("tasks", $con); 
    $result = mysql_query("DELETE FROM tasks WHERE taskID=$id"); 
    mysql_close($con); 
} 

編輯:好吧,我想我可能知道發生了什麼與此環視其他一些堆棧溢出的職位去錯了 - 也許是我的JQuery $('.delete').click功能無法正常工作,因爲它只是運行當document.ready激發時。 PHP生成的JQuery返回並在頁面上創建另一個表元素,並且具有正確的ID標記以便被刪除,但document.ready已經使類「delete」可點擊的元素(不是新元素)成爲可能。這會有可能嗎?如果是這樣,我該如何解決這個問題?謝謝!

回答

0

由於鏈接<a href="">圍繞垃圾按鈕進行刷新。嘗試把

javascript:void(0);

<td><a href="javascript:void(0)"><img src="images/trash.png" class="delete" name="'.$id.'"></a>

+0

謝謝!我希望我能夠高興,我現在不到15分。但是這解決了刷新問題 - 由於某種原因它仍然沒有被刪除。 – 2012-02-09 04:44:13

+0

發佈你的PHP代碼刪除..它會給出一個更好的主意。 – 2012-02-09 04:51:38

+0

編輯爲包含刪除功能 – 2012-02-09 04:58:21

-1

使用GET而不是POST在AJAX,只是刪除帖子和數據位和URL設置爲:

url: "ajax.php?deleteID=" + deleteID 

當然,也更新刪除php使用$ _GET而不是$ _POST。

+0

謝謝,但它仍然拒絕刪除這個項目,如果我點擊delete刪除其他任何項目,很好,奇數 – 2012-02-09 05:13:38

+3

否否否否否_Never_在GET調用中不使用刪除查詢,蜘蛛可以很高興地爲您的所有內容「索引」,從而刪除所有內容,即使它隱藏在防火牆後面或需要登錄,這種方法可以防止它,這是非常危險和容易避免的。'GET'方法僅*用於檢索數據。 – 2012-02-09 10:18:53

2

就在您的onClick處理程序添加e.stopPropagation();的元素與類.delete

+0

+1這是@ husbas解決方案的更好方法 – 2012-02-09 10:43:44

+0

我之前使用過e.preventDefault() ... e.stopPropagation()會是更好的方式嗎? – 2012-02-09 19:09:02

1

想通了。只需要添加$(".delete").live('click',function(e){即可將事件綁定到動態元素。