2012-07-23 18 views
42

我有一個按鈕,例如:如何防止使用jQuery進行雙擊?

<input type="submit" id="submit" value="Save" /> 

在jQuery的我使用的是下面的,但它仍然允許雙擊:

<script type="text/javascript"> 

$(document).ready(function() { 

    $("#submit").one('click', function (event) { 

我如何能防止雙擊任何想法?

+4

這是一個按鈕,可以單擊它多次你想。只需防止默認操作或在第一次點擊後禁用它。 – adeneo 2012-07-23 22:51:19

+1

同意adeneo。最簡單的解決方案似乎只是點擊後禁用它。如果禁用,則爲 – DaiYoukai 2012-07-23 22:53:19

+1

!它不會回發!只能單擊一次!你是否有任何解決方案,只需點擊一下,直到完成表格處理完成 – 2015-01-08 09:09:31

回答

49

jQuery的one()將針對綁定的每個元素觸發附加的事件處理程序,然後刪除事件處理程序。

如果由於某些原因不能滿足要求,也可以在點擊按鈕後完全禁用按鈕。

$(document).ready(function() { 
    $("#submit").one('click', function (event) { 
      event.preventDefault(); 
      //do something 
      $(this).prop('disabled', true); 
    }); 
}); 

應當注意的是,使用ID submit可引起問題,因爲它覆蓋form.submit功能與該元素的引用。

+1

因此.one真的沒有幫助我想完成什麼,對嗎?我們需要使用殘疾人士才能真正發揮作用。 – 2012-07-23 22:58:05

+4

不,一個()工作得很好,它只運行一次綁定函數,但由於它是一個常規按鈕,您可以點擊它直到手指受傷。阻止它的唯一方法就是像上面那樣禁用它,或者爲了防止默認發送表單,所以按鈕不會做任何事情,無論如何你都應該這樣做,否則頁面將重新加載,所有的javascript函數將重新開始,並且這些解決方案都不會以任何方式工作。如果您禁用,請致電 – adeneo 2012-07-23 23:01:01

+2

!那麼按鈕不會回發!您是否有任何解決方案,只需點擊一下鼠標,直到完成表單處理完成? – 2015-01-08 08:22:20

9

對我來說,jQuery的人有一定的副作用(以IE8),我結束了使用下列內容:

$(document).ready(function(){ 
    $("*").dblclick(function(e){ 
    e.preventDefault(); 
    }); 
}); 

它非常漂亮的作品,看起來簡單。找到它:http://www.jquerybyexample.net/2013/01/disable-mouse-double-click-using-javascript-or-jquery.html

+0

在Chrome中不起作用。 [嘗試這個小提琴](http://jsfiddle.net/b6nsdbqe/)。 – Domi 2014-11-19 10:58:49

+0

這應該是公認的答案。在按鈕上工作良好。您的文本輸入可能需要不同的處理:如此處所示(在Chrome中)http://jsfiddle.net/b6nsdbqe/ – Ripside 2015-06-09 16:28:32

+0

不適用於動態生成的元素(需要重新調用)。 – MatteoSp 2016-04-05 09:42:39

10

我的解決方案:https://gist.github.com/pangui/86b5e0610b53ddf28f94它可以防止雙擊,但在1秒後接受更多的點擊。希望能幫助到你。

下面是代碼:

jQuery.fn.preventDoubleClick = function() { 
    $(this).on('click', function(e){ 
    var $el = $(this); 
    if($el.data('clicked')){ 
     // Previously clicked, stop actions 
     e.preventDefault(); 
     e.stopPropagation(); 
    }else{ 
     // Mark to ignore next click 
     $el.data('clicked', true); 
     // Unmark after 1 second 
     window.setTimeout(function(){ 
     $el.removeData('clicked'); 
     }, 1000) 
    } 
    }); 
    return this; 
}; 
17

只是多了一個解決方案:

$('a').on('click', function(e){ 
    var $link = $(e.target); 
    e.preventDefault(); 
    if(!$link.data('lockedAt') || +new Date() - $link.data('lockedAt') > 300) { 
     doSomething(); 
    } 
    $link.data('lockedAt', +new Date()); 
}); 

這裏我們保存最後點擊數據屬性的時間,然後檢查以前的點擊超過0.3秒前。如果它是錯誤的(小於0.3秒前),只需更新最後一次點擊時間,如果屬實,則執行一些操作。

jsbin

+1

謝謝,這幫了我一個問題,我有:) – 2016-07-19 07:42:37

0

我也有類似的問題,但禁用按鈕並沒有完全奏效了。當點擊按鈕時發生了一些其他的操作,有時候,按鈕沒有被關閉很快,當用戶雙擊時,發生了2個事件。
我拿Pangui的超時想法,並結合了這兩種技術,禁用按鈕,幷包括超時,以防萬一。我創建了一個簡單的jQuery插件:

var SINGLECLICK_CLICKED = 'singleClickClicked'; 
$.fn.singleClick = function() { 
    var fncHandler; 
    var eventData; 
    var fncSingleClick = function (ev) { 
     var $this = $(this); 
     if (($this.data(SINGLECLICK_CLICKED)) || ($this.prop('disabled'))) { 
      ev.preventDefault(); 
      ev.stopPropagation(); 
     } 
     else { 
      $this.data(SINGLECLICK_CLICKED, true); 
      window.setTimeout(function() { 
       $this.removeData(SINGLECLICK_CLICKED); 
      }, 1500); 
      if ($.isFunction(fncHandler)) { 
       fncHandler.apply(this, arguments); 
      } 
     } 
    } 

    switch (arguments.length) { 
     case 0: 
      return this.click(); 
     case 1: 
      fncHandler = arguments[0]; 
      this.click(fncSingleClick); 
      break; 
     case 2: 
      eventData = arguments[0]; 
      fncHandler = arguments[1]; 
      this.click(eventData, fncSingleClick); 
      break; 
    } 
    return this; 
} 

,然後用它是這樣的:

$("#button1").singleClick(function() { 
    $(this).prop('disabled', true); 
    //... 
    $(this).prop('disabled', false); 
}) 
2

我有類似的問題。你可以使用setTimeout()來避免雙擊。

//some codes here above after the click then disable it 

//也檢查這裏是否有禁用

//如果有在BTN標籤禁用,那麼 //返回屬性的屬性。把它轉換成js。

$('#btn1').prop("disabled", true); 

setTimeout(function(){ 
    $('#btn1').prop("disabled", false); 
}, 300); 
8

我發現大多數解決方案都不適用於點擊標籤或DIV元素(例如使用Kendo控件時)。所以我做了這個簡單的解決方案:

function isDoubleClicked(element) { 
    //if already clicked return TRUE to indicate this click is not allowed 
    if (element.data("isclicked")) return true; 

    //mark as clicked for 1 second 
    element.data("isclicked", true); 
    setTimeout(function() { 
     element.removeData("isclicked"); 
    }, 1000); 

    //return FALSE to indicate this click was allowed 
    return false; 
} 

使用它,你必須決定開始一個事件或有不對的地方:

$('#button').on("click", function() { 
    if (isDoubleClicked($(this))) return; 

    ..continue... 
}); 
+1

尼克黑客。不知道什麼是確切的問題,但至少這個解決方案工作形式。謝謝@roberth – 2016-11-27 12:40:29

+0

優秀,使用是完美的動畫任何風格 – Offboard 2017-08-13 23:43:41

0
/* 
Double click behaves as one single click 


"It is inadvisable to bind handlers to both the click and dblclick events for the same element. The sequence of events triggered varies from browser to browser, with some receiving two click events before the dblclick and others only one. Double-click sensitivity (maximum time between clicks that is detected as a double click) can vary by operating system and browser, and is often user-configurable." 

That way we have to check what is the event that is being executed at any sequence. 

    */ 
     var totalClicks = 1; 

$('#elementId').on('click dblclick', function (e) { 

if (e.type == "dblclick") { 
    console.log("e.type1: " + e.type); 
    return; 
} else if (e.type == "click") { 

    if (totalClicks > 1) { 
     console.log("e.type2: " + e.type); 
     totalClicks = 1; 
     return; 
    } else { 
     console.log("e.type3: " + e.type); 
     ++totalClicks; 
    } 

    //execute the code you want to execute 
} 

}); 
0

由@Kichrum提供的解決方案几乎是工作我。我不得不添加e.stopImmediatePropagation()以防止默認操作。這裏是我的代碼:

$('a, button').on('click', function (e) { 
    var $link = $(e.target); 
    if (!$link.data('lockedAt')) { 
     $link.data('lockedAt', +new Date()); 
    } else if (+new Date() - $link.data('lockedAt') > 500) { 
     $link.data('lockedAt', +new Date()); 
    } else { 
     e.preventDefault(); 
     e.stopPropagation(); 
     e.stopImmediatePropagation(); 
    } 
}); 
2

只是把這個方法放在你的表格中,然後它會處理一次雙擊或更多的點擊。一旦請求發送它將不允許發送一次又一次的請求。

<script type="text/javascript"> 
     $(document).ready(function(){ 


      $("form").submit(function() { 
        $(this).submit(function() { 
         return false; 
        }); 
        return true; 
       }); 

     }); 
     </script> 

它會幫助你確定。

+1

保存我的一天。謝謝。 – GhitaB 2017-10-02 08:44:58

0

我發現的是舊的,但現代瀏覽器的工作解決方案。適用於不通過雙擊來切換課程。

$('*').click(function(event) { 
    if(!event.detail || event.detail==1){//activate on first click only to avoid hiding again on double clicks 
     // Toggle classes and do functions here 
     $(this).slideToggle(); 
    } 
}); 
0

「易peasy」

$(function() { 
    $('.targetClass').dblclick(false); 
});