2012-01-04 98 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(); 
}