2011-03-29 59 views
3

有沒有一種方法可以像confirm這樣的onclick函數的返回值轉換爲jQuery函數?jQuery:從錨點獲取onclick函數的返回

我有有一個onclick事件確認返回真或假鏈接:

<a onclick="return confirm('Sure?');" class="delete" href="delete.php">Delete</a> 

這是一個給定的結構,我改變它沒有可能性。 但我願做這樣的事情:

$('a.delete').click(function() { 
    if (confirm_from_onclick == true) { 
     //do some more before really returning true and following the link 
    } 
}); 

回答

5

如果沒有辦法讓你改變HTML標記,你需要刪除從該節點完成onclick直列處理程序,並把它在你的不顯眼的事件處理程序。

這可能是這樣的:

$(function() { 
    $('a').each(function(_, anchor) { 
     var onclk = anchor.onclick; // store the original function 
     anchor.onclick = null;  // delete/overwrite the handler 

     $(anchor).bind('click', function() { 
      if(onclk()) { 
       // do something 
      } 
      return false; // call stopPropagation() + preventDefault() 
     }); 
    });  
}); 

既然你處理一個onclick直列事件處理程序,你不能阻止或防止這種與約束不引人注意的事件處理程序射擊。它總是會首先發射,所以你需要徹底移除原來的事件。

您並不需要存儲該功能,您也可以將onclick設置爲null,並在您自己的事件處理程序中重寫邏輯。我只是爲了方便而做的。

演示http://jsfiddle.net/em9KP/

+0

jAndy - 這是一個很好的解決方案。你能解釋一下這個:$('a')。each(函數(_underscore_,anchor),特別是函數(_underscore_,anchor)的一部分嗎?我以前從來沒有見過這樣的東西(評論不喜歡下劃線顯然是) – JackWilson 2011-03-29 08:00:10

+0

@JackWilson:'.each()'方法在它的回調函數中傳遞了兩個東西:* index *和actual * *因爲我沒有應用這個代碼片段中的* index *值,我只是使用一個下劃線,我也可以寫「index」或「foobar」。 – jAndy 2011-03-29 08:04:27

+0

非常好的解決方案,非常感謝! – Tim 2011-03-29 08:06:04

3

真正簡單的答案,可能不是你在尋找什麼,但爲什麼不從錨刪除「的onclick」事件,那裏面搞定一切點擊功能?

如在函數內創建確認對話框。

<a class="delete" href="delete.php">Delete</a> 

$('a.delete').click(function(e) { 
    e.preventDefault(); 
    if (confirm('Sure?')) { 
     //do some more before really returning true and following the link 
    } 
}); 

編輯: 對不起!錯過了你提到它是一個集合結構的部分,你無法改變它。正在尋找替代方案。