2011-08-20 102 views
0

我有多個jquery委託函數從列表中刪除項目。它們第一次正常工作,但似乎停止對其他刪除功能的刪除功能。多個Jquery .delegate()問題

所以我有3個表,可用性,經驗和愛好。如果我點擊從愛好列表中刪除一個項目,它可以工作,並且可以使其他人工作。後來從嗜好中刪除仍然有效。

看着它與螢火蟲,似乎每一次點擊從可用性或經驗刪除條目觸發相同的鏈接,第一次觸發從愛好刪除,就好像它已經保存並不會改變它。

$(document).ready(function() { 
    var i = 1; 
    var pager; 
    var pai; 
    var thetab; 
    $('#tabs-5').delegate('.delav', 'click', function (e) { 
     e.preventDefault(); 
     pager = $(this).attr("href"); 
     $("#dialog2").dialog({ 
      autoOpen: false, 
      width: 600, 
      modal: true, 
      buttons: { 
       "Confirm": function() { 
        $('#ava_list').html("Loading.."); 

        pai = $('#epa_id').val(); 
        thetab = "availability"; 
        $.get("/_includes/functions.php", { 
         cache: false, 
         table: thetab, 
         pa: pai, 
         delattr: pager 
        }, function (data) { 
         $('#ava_list').html(data); 
        }); 

        $(this).dialog("close"); 
       }, 
       "Cancel": function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $("#dialog2").dialog("open"); 
    }); 
}); 
$(document).ready(function() { 
    var i = 1; 
    var pager; 
    var pai; 
    var thetab; 
    $('#tabs-3').delegate('.delexp', 'click', function (e) { 
     e.preventDefault(); 
     pager = $(this).attr("href"); 
     $("#dialog2").dialog({ 
      autoOpen: false, 
      width: 600, 
      modal: true, 
      buttons: { 
       "Confirm": function() { 
        $('#exp_list').html("Loading.."); 

        pai = $('#epa_id').val(); 
        thetab = ""; 
        $.get("/_includes/functions.php?ms=", { 
         cache: false, 
         table: thetab, 
         pa: pai, 
         delattr: pager 
        }, function (data) { 
         $('#exp_list').html(data); 
        }); 

        $(this).dialog("close"); 
       }, 
       "Cancel": function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $("#dialog2").dialog("open"); 
    }); 
}); 
$(document).ready(function() { 
    var i = 1; 
    var pager; 
    var pai; 
    var thetab; 
    $('#tabs-7').delegate('.delhob', 'click', function (e) { 
     e.preventDefault(); 
     pager = $(this).attr("href"); 
     $("#dialog2").dialog({ 
      autoOpen: false, 
      width: 600, 
      modal: true, 
      buttons: { 
       "Confirm": function() { 
        $('#hob_list').html("Loading.."); 

        pai = $('#epa_id').val(); 
        thetab = "hobby"; 
        $.get("/_includes/functions.php", { 
         cache: false, 
         table: thetab, 
         pa: pai, 
         delattr: pager 
        }, function (data) { 
         $('#hob_list').html(data); 
        }); 

        $(this).dialog("close"); 
       }, 
       "Cancel": function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $("#dialog2").dialog("open"); 
    }); 
}); 
+0

不清楚點擊刪除是否會觸發正確的事件處理程序......無論如何,您重複使用相同的var名稱幾乎相同的代碼(據我所知,除了選擇器之外)三次,這使得它更難以調試。您應該嘗試重構它並避免重複... – mamoo

+0

所有這些工作都會觸發刪除功能。如果刷新我的頁面然後觸發刪除事件的可用性,經驗或愛好,他們都工作。哪個是最先使用的工作 - 然後似乎阻止其他人的工作。我也有他們每個人的增加功能 - 這工作得很好,無論。 – Ben

回答

2

我建議首先做以下修改,大幅簡化問題,並使其不太可能是一個對話框可以與他人發生衝突:

  1. 擺脫所有重複的代碼,並將所有代碼摺疊爲帶有幾個參數的單個函數調用。
  2. 確保您銷燬先前使用的對話框,因此當您創建新對話框時,它將從頭開始創建新數據。

還有幾個問題。什麼是table:,pa:delattr:屬性在get對象中傳遞給$ .get函數?他們沒有記錄$.get()設置。另外,你的意思是說,所有三個對話框中都有相同的pa: $('#epa_id').val(),行嗎?

下面介紹如何將所有重複代碼合併到一個通用函數中,併爲每個對話使用唯一ID。我也去掉了不需要的局部變量:

$(document).ready(function() { 

    function configureDialogClick(parent, child, list, tab, dialogID) { 
     $(parent).delegate(child, 'click', function (e) { 
      e.preventDefault(); 
      var pager = $(this).attr("href"); 
      $(dialogID).dialog({ 
       autoOpen: false, 
       width: 600, 
       modal: true, 
       buttons: { 
        "Confirm": function() { 
         $(list).html("Loading.."); 

         $.get("/_includes/functions.php", { 
          cache: false, 
          table: tab, 
          pa: $('#epa_id').val(), 
          delattr: pager 
         }, function (data) { 
          $(list).html(data); 
         }); 

         $(this).dialog("close"); 
         $(this).dialog('destroy'); 
        }, 
        "Cancel": function() { 
         $(this).dialog("close"); 
         $(this).dialog('destroy'); 
        } 
       } 
      }); 
      $(dialogID).dialog("open"); 
     }); 
    } 

    configureDialogClick("#tabs-3", ".delexp", "#ava_list", "", "#dialog3"); 
    configureDialogClick("#tabs-5", ".delav", "#hob_list", "availability", "#dialog5"); 
    configureDialogClick("#tabs-7", ".delhob", "#hob_list", "hobby", "#dialog7"); 

}); 

因爲我沒有運行此代碼的方式,我不能說這是否修復該問題,或者它只是在右側的下一個淨化步驟方向。

+0

實現同樣的事情可能有一個更簡單的方法 - 我的代碼道歉,因爲jquery對我來說是相當新的,所以我似乎有一個'哈克'的方法。看過你上面寫的這個新代碼之後,我發現你指的是與對話框相關的問題。 所以我做了進一步的檢查。是的 - 這個對話框(確認/取消)在其他地方使用,並且也出現故障。所以只是爲了在檢修代碼之前試着讓它工作,有沒有辦法讓每次停止使用同一個get url的對話框? – Ben

+0

另外,如果即時通訊是誠實的,最理想的方法是從鏈接的href中獲取完整的查詢語句,這將允許我簡單地將對話框添加到指定類的任何鏈接,從而可以節省大量代碼。儘管如此,我還是遇到了一些問題,因此選擇將所有工作都寫得很好。 – Ben

+0

對不起,我不明白你的新問題。如果您每次都需要一個不同的URL來獲取,您只需更改代碼即可修改每個特定案例的獲取URL。如果您不包含相關的HTML並描述您想要獲取的URL,那麼我很難知道如何就修改代碼提供建議。 – jfriend00