2012-01-04 99 views
12

考慮以下幾點:如何爲Asp.net控件的鏈接按鈕創建雙擊&單擊事件?

protected void dgTask_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     LinkButton btn = (LinkButton)e.Row.Cells[4].FindControl("lnkBtnEdit"); 

     btn.Attributes.Add("onclick", "return Test();"); 
    } 
} 

而不是一個單一的點擊,我怎樣才能使雙擊它,而鏈接按鈕點擊?

編輯

我曾嘗試與* competent_tech *提出的解決方案,但問題是,在這種情況下,它會攔截單一的點擊。

我需要做一些單擊操作和其他雙擊操作。請幫幫我。

感謝

+1

http://www.codeproject.com/KB/webforms/DoubleClickGridviewRow.aspx – Neha 2012-01-17 09:52:18

回答

13

你不得不這樣做這個。

後面的代碼。

Linkbutton btn; 
btn.Attributes.Add("onClick", "OnClick();"); 

然後,在JavaScript,你需要像這樣定義

var clickCount = 0; 
var timeoutID = 0; 

function OnClick() 
{ 
    clickCount++; 

    if (clickCount >= 2) { 
     clickCount = 0;   //reset clickCount 
     clearTimeout(timeoutID); //stop the single click callback from being called 
     DoubleClickFunction(); //perform your double click action 
    } 
    else if (clickCount == 1) { 
     //create a callback that will be called in a few miliseconds 
     //the callback time determines how long the user has to click a second time 

     var callBack = function(){ 
         //make sure this wasn't fired at 
         //the same time they double clicked 
         if (clickCount == 1) {  
          clickCount = 0;   //reset the clickCount 
          SingleClickFunction(); //perform your single click action 
         } 
         }; 

     //This will call the callBack function in 500 milliseconds (1/2 second). 
     //If by that time they haven't clicked the LinkButton again 
     //We will perform the single click action. You can adjust the 
     //Time here to control how quickly the user has to double click. 
     timeoutID = setTimeout(callBack, 500); 
    } 
} 

的OnClick功能,您可以直接把JavaScript插入您的.aspx文件或將其添加動態當您添加的LinkBut​​ton到頁面。如果您需要在用戶單擊或雙擊時在服務器端執行某些操作,則可以使用__doPostBack方法。有關更多信息,請參閱here

我的方法存在的問題是,用戶在執行單擊操作之前必須始終等待整個回調時間。只要您使用單擊/雙擊來區分用戶想要的內容,我不會看到任何解決方法。如果你發現這個延遲太大,你總是可以嘗試點擊/移動+點擊來切換動作。它可能不會那麼直觀,但你會立即知道用戶想要什麼,並可以立即作出反應,而不是等待用戶再次點擊。

讓我知道如果您有任何問題。

4

嘗試使用ondblclick代替onclick

要正確地做這項工作,你還必須的onclick攔截並返回false,這樣自動導航不會發生:

 LinkButton1.Attributes.Add("ondblclick", @"alert('test');"); 
     LinkButton1.Attributes.Add("onclick", @"return false;"); 
+0

沒有它不工作..我試圖btn.Attributes.Add( 「onfocus此」,「迴歸測試();」); – user1025901 2012-01-04 04:46:48

+0

你能澄清一點嗎?它是不是工作,因爲它在第一次點擊或? – 2012-01-04 04:49:35

+0

不,我不能執行,我是能夠與做任何動作的onclick – user1025901 2012-01-04 04:51:31

0

嘗試獲取點擊的次數,並嘗試執行操作.i認爲ondbclick可以通過javascript來實現。

int count = 0; 
if(btn.Click == true) 
{ 
    count++; 
    if(count == 2) 
    { 
     // Perform the logic here 
    } 
} 

編輯: competent_tech說的是right.you能夠執行邏輯

+0

沒辦法,如果現在點擊一個,20秒後點擊什麼?這是雙擊? – Aristos 2012-01-14 21:48:59

0

將此代碼粘貼在Page_Load中,將工作

LinkButton1.Attributes.Add("ondblclick","yourfunction()"); LinkButton1.Attributes.Add("onclick", @"return false;");

+0

這種方法將擊敗在單擊時執行一些操作的目的,並且雙擊其他任何東西時的目的 – user1025901 2012-01-05 02:14:22

8

簡答:不,你不能那樣做。

長答案:你不能這樣做,因爲雙擊實際上是2次單擊。有很多黑客(如基於定時器的方法)可以找到試圖執行此操作的方法,但是如果選擇它們,請注意,這總是會成爲不可靠和危險的行爲。

quirksmode.org,這裏的事件爲雙擊序列:

  1. 鼠標按下
  2. 鼠標鬆開
  3. 點擊
  4. 鼠標按下
  5. 鼠標鬆開
  6. 點擊
  7. DBLCLICK

即使這個順序在瀏覽器中也不一致。沒有簡單的方法檢測同一元素上的點擊和雙擊。

報價quirksmode.org

不註冊單擊和雙擊自動對同一元素的事件:這是 無法分辨單個單擊從點擊事件事件 導致了DblClick事件。

jQuery

是不可取的處理程序綁定到兩個點擊DBLCLICK爲同一元素 事件。事件觸發的順序從瀏覽器不同 到瀏覽器,與之前 一些接收兩個click事件的DBLCLICK和其他人只有一個。雙擊靈敏度(檢測爲雙擊的點擊之間的最大時間間隔爲 )可能因操作系統和瀏覽器而異,並且通常可由用戶配置。

最好的辦法是重新設計工作流程,以便使用其他方法(而不是點擊次數)來依靠。

+0

它不僅是那些需要計數的事件,您還需要放置,所有這些必須完成的時間限制以及像素距離這兩次點擊之間。 – Aristos 2012-01-19 08:48:49

+0

@Aristos:的確如此。 jQuery的引用很好地概括了爲什麼時間限制可能不起作用。感謝您提出距離的一部分。 – Mrchief 2012-01-19 17:20:51

0

我已經在這裏放置了示例javascript代碼。

http://jsbin.com/ubimol/2/edit

HTML:

<input id="sin" type="button" value="Edit" onclick="singleClick();return false;"/> 
    <input id="dou" style="display:none" type="button" value="Edit" onclick="doubleClick();return false;" /> 

的Javascript:

var isDoubleClick = false; 
function singleClick(){ 
    $("#sin").hide();$("#dou").show(); 

    //wait for 500 milliseconds. 
    setTimeout("waitForSecondClick()", 500); 


} 


    function waitForSecondClick(){ 
    if(isDoubleClick == false){ 
     alert("this is a sinle click event, perform single click functionality"); 
     } 

     isDoubleClick = false; //Reset 
     $("#sin").show();$("#dou").hide(); 
    } 

    function doubleClick(){ 
     isDoubleClick = true; 

     alert("this is a double click event, perform double click funcitonality"); 



    } 

通過與相同的值引入第二個按鈕,該解決方案是穩定的,但需要一些額外的編碼。

0

在測試你上面的例子,我發現形式GridView包含在被提交每次點擊LinkButton 。要解決這個問題,我使用了下面的代碼。

下面的腳本將在每次用戶點擊鏈接時數。

<script type="text/javascript">  
    var clickNo = 0;  

    function clickCounter() {  
     clickNo++;  
     if (clickNo == 2) {  
      alert("Double Click");  
      clickNo = 0;  
     }  
    }  
</script>  

我們取消了表單提交,以便我們可以跟蹤用戶點擊鏈接的次數。這可能會導致頁面出現問題,但似乎是無法跟蹤雙擊的原因。

<form id="form1" runat="server" onsubmit="return false;">  

我創建了一個模板字段中GridView控制同時顯示單單擊和雙擊按鈕。

<asp:TemplateField HeaderText="Edit">  
    <ItemTemplate>  
     <asp:LinkButton ID="lnkBtnEdit" runat="server">LinkButton</asp:LinkButton>  
     &nbsp;&nbsp;  
     <asp:LinkButton ID="lnkBtnEditDouble" runat="server">LinkButton</asp:LinkButton>  
    </ItemTemplate>  
</asp:TemplateField>  

在頁面背後的代碼,我們添加javascript代碼對於單次點擊和javascript代碼雙擊。請注意:由於我在測試中使用的列數有限,因此Cell引用設置爲2,而在您的示例中則爲4。

try  
{  
    if (e.Row.RowType == DataControlRowType.DataRow)  
    {  
     // Please note: the value in Cells has changed for my testing data.  
     LinkButton btn = (LinkButton)e.Row.Cells[2].FindControl("lnkBtnEdit");  

     btn.Attributes.Add("onclick", "javascript:alert('Single Click');");  

     LinkButton btnDouble = (LinkButton)e.Row.Cells[2].FindControl("lnkBtnEditDouble");  

     btnDouble.Attributes.Add("onclick", "javascript:clickCounter();");  
    }  
}  
catch (Exception ex)  
{  
    Console.WriteLine(ex.Message);  
}  

這應該允許您捕獲雙擊某些鏈接並單擊其他人。然而,正如上面提到的,表單提交現在已取消,你需要找到另一種方法來提交您的數據,如果你使用上面的代碼。

1

http://jsfiddle.net/XfJDK/2/

<div onClick="return OnClick();">click me</div> 
<div id="eventText">...</div> 

var clicks = 0; 

function OnClick() { 

    clicks++; 
    if (clicks == 1) 
     setTimeout("RunRealCode();", 300); // schedule real code, allowing for 300ms for 2nd optional click 

    setTimeout("clicks = 0;", 350); // click timeout of 300 + 50 ms 
} 

function RunRealCode() { 
     if (clicks == 2) 
      $("#eventText").text("Double").fadeOut().fadeIn(); 
     else if (clicks == 1) 
      $("#eventText").text("Single").fadeOut().fadeIn(); 
}