Подтвердить что ты не робот

Как сделать двойной клик и однократное нажатие кнопки ссылки для управления 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();");
    }
}

Вместо одного щелчка, как я могу сделать его двойным щелчком при нажатии на ссылку?

Edited

Я попытался с решением, представленным * qualified_tech *, но проблема в том, что в этом случае он перехватит один клик.

Мне нужно выполнить некоторую операцию одним щелчком мыши и что-то еще при двойном щелчке. Пожалуйста, помогите мне.

Спасибо

4b9b3361

Ответ 1

Вам нужно было сделать что-то вроде этого.

Код позади.

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

то в вашем javascript вам нужно будет определить функцию OnClick, подобную этой

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); 
    }
}

Вы можете поместить javascript непосредственно в ваш .aspx файл или добавить его динамически, когда вы добавите LinkButton на страницу. Если вам необходимо выполнить некоторые действия на стороне сервера, когда пользователь делает одно клик или двойной клик, вы можете использовать метод __doPostBack. Подробнее см. здесь.

Проблема с моим подходом заключается в том, что пользователю всегда нужно подождать всего времени обратного вызова до того, как будет выполнено одно действие с одним кликом. Я не вижу никакого способа обойти это, пока вы используете один клик/двойной щелчок, чтобы отличить то, что хочет пользователь. Если вы обнаружите, что эта задержка слишком велика, вы всегда можете попробовать что-то вроде щелчка/сдвига + щелчок, чтобы чередовать действия. Вероятно, это было бы не так интуитивно, но вы сразу узнали бы, чего хочет пользователь, и могли бы немедленно ответить, вместо того, чтобы ждать, будет ли пользователь нажимать второй раз.

Сообщите мне, если у вас есть какие-либо вопросы.

Ответ 2

Короткий ответ: Нет, вы не можете этого сделать.

Длинный ответ: вы не можете этого сделать, потому что двойной клик фактически состоит из двух кликов. Есть много хаков (например, подходы, основанные на таймер), которые вы можете найти, кто пытается это сделать, но если вы их выберете, имейте в виду, что это всегда будет ненадежным и рискованным поведением.

Как quirksmode.org, здесь последовательность событий для двойного щелчка:

  • mousedown
  • MouseUp
  • выберите
  • MouseDown
  • MouseUp
  • выберите
  • DblClick

Даже этот порядок не согласован среди браузеров. Существует простой надежный способ обнаружения как щелчка, так и двойного щелчка на одном и том же элементе.

Цитата quirksmode.org:

Не регистрируйте события click и dblclick на одном элементе: это невозможно выделить события с одним щелчком мыши из событий кликов, которые приведет к событию dblclick.

И за jQuery:

Не рекомендуется связывать обработчики как с кликом, так и с dblclick события для одного и того же элемента. Последовательность инициируемых событий изменяется от браузера к браузеру, причем некоторые из них получают два события click dblclick и другие только один. Двойная чувствительность (максимум время между щелчками, которое обнаруживается как двойной щелчок) может варьироваться в зависимости от операционной системы и браузера, и часто настраивается пользователем.

Лучше всего переделать рабочий процесс, чтобы вы могли использовать что-то другое (а не количество кликов), чтобы полагаться.

Ответ 3

Попробуйте использовать ondblclick вместо onclick.

Чтобы сделать эту работу правильно, вам также нужно перехватить onclick и вернуть false, чтобы автоматическая навигация не выполнялась:

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

Ответ 4

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();
}

Ответ 5

Попробуйте получить кол-во щелчка и попытайтесь выполнить операцию. Я думаю, что ondbclick можно реализовать через javascript.

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

EDIT: Что говорит компетентный_tech, вы можете выполнить эту логику

Ответ 6

Вставьте этот код в Page_Load, он будет работать

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

Ответ 7

Я разместил здесь пример кода 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");



    }

Введя вторую кнопку с одинаковым значением, решение является стабильным, но требует некоторого дополнительного кодирования.

Ответ 9

При тестировании вашего примера выше я обнаружил, что форма GridView содержится в передаваемых файлах при каждом нажатии кнопки LinkButton. Чтобы обойти это, я использовал следующий код.

Следующий script будет отсчитывать каждый раз, когда пользователь нажимает на ссылку.

<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);    
}    

Это должно позволить вам захватывать двойные клики по некоторым ссылкам и одиночные клики на других. Однако, как упоминалось выше, подача формы теперь отменяется, и вам нужно будет найти другой способ отправки ваших данных, если вы хотите использовать вышеуказанный код.