2009-10-07 34 views
0

我有一個名爲「創建項目」,當用戶點擊按鈕,我想兩件事情發生如何使用一些自定義功能包click事件

  1. Ajax調用來檢查用戶按鈕允許創建一個項目
  2. 如果允許,然後按正常執行該按鈕,如果沒有,則彈出一個模式對話框,說他不允許創建一個新項目。

我有下面的代碼在上面的代碼

$('.create_project').click(function(e) { 
    e.stopDefault(); 
    $.getJSON('/check_user_limit', function(data){ 
     if(data.allow_to_create_project){ 
      //trigger the click here 
     }else{ 
      //modal here 
     } 
    } 
}); 

使用「觸發」,因爲它成爲一個無限循環將無法工作。解除綁定是第一次運行,但自從foo不再綁定到該函數以來,它將不會再次運行。

+1

你究竟想要完成什麼?這似乎相當低音,並且可能有更好的方法來做到這一點。 – 2009-10-07 20:25:55

+0

你只是想讓事件冒泡,讓點擊發生,就好像你什麼都沒做?然後,只需在事件處理程序結束時執行「返回true」即可。 – 2009-10-07 20:26:47

+0

我不認爲你應該使用相同的方法附加和觸發點擊。你不能把點擊連接到別的地方嗎? – Davy 2009-10-07 20:27:28

回答

0

我不知道爲什麼你不想只是做:

$('.foo').click(function(e) { 
    $(this).href = "/bar"; 
}); 
1

這很簡單,你只需做到以下幾點:

$('.foo').click(function(e) { 
    $(this).href = "/bar"; # done something else before the click 

    return true; 
}); 

如果你想攔截點擊事件並不傳播它然後簡單地返回false。我注意到你的例子更加明確,但解決方案仍然有點類似。我們不是通過返回true來傳播事件,而是通過手動觸發click來告訴click函數通過返回false來吞噬事件。然後,該代碼會是這個樣子:

$('.create_project').click(function(e) { 
    $.getJSON('/check_user_limit', function(data) { 
     if (data.allow_to_create_project) { 
      e.click(); 
     } else { 
      //modal here 
     } 
    } 
    return false; 
}); 

然而,使一個AJAX請求,以驗證功能是否可用通常不是一個好主意。如果服務器已經知道用戶不能創建項目,那麼爲什麼按鈕可以在第一位點擊?改爲使用適當的狀態更新控件。

+0

謝謝,但由於我需要發佈ajax調用,所以我需要首先e.preventDefault,'返回true'在'e.preventDefualt後不起作用。 – user169930 2009-10-07 21:17:04

0

我有點困惑。您提到解除綁定,但實際代碼中沒有實際的綁定事件。

如果您只是試圖執行某個元素的代碼預先點擊,您會以錯誤的方式去做。

$('.foo').click(function(e) 
{ 
    $(this).href = "/bar"; 
    return true; // this is implicit, but you could return false to cancel the event 
}); 

如果你想別人做一些事情,然後我會主張使用兩個單獨的事件,其中之一是一個自定義事件名稱。

0

爲什麼還要用這個客戶端代碼呢?

從可用性角度來看,使用服務器端代碼檢查用戶權限會更好,如果出現問題,在頁面加載時在禁用按鈕旁邊顯示一條消息。此消息還會提及可以做些什麼來啓用此用戶的項目創建。

有時你只需要評估一個特定的工具是否是實現目標所必需的。

+0

我有服務器端的檢查,客戶端只是嘗試給一個不錯的用戶體驗有一個模態對話框。 – user169930 2009-10-07 21:02:29

+0

模態對話並不總是等於不錯的用戶體驗。既然你正在檢查服務器端,爲什麼不利用這個檢查並立即給出反饋,而不是讓用戶做一個額外的查詢? – montrealist 2009-10-09 20:24:46