2015-06-17 44 views
1

在我的HTML中,有一個按鈕可以短按和長按。如果你很快點擊它(就像在其他每個按鈕上一樣),它會執行給定的回調函數。當您持續按下該按鈕時,將會重複執行回調,直到檢測到鼠標移動或鼠標懸停事件。在按下按鈕時避免在移動設備上進行長時間打擊行爲

var onBtnClick = function (evt, callback) { 
     //only react to left mouse button 
     if (evt.which == 1) { 
      //save 'this' context and interval/timeout IDs 
      var self = this, 
       interval= null, 
       timeout = null; 

      //react to a single click 
      callback(); 

      //when user leaves the button cancel timeout/interval, lose focus and unbind recently bound listeners 
      self.on("mouseup mouseout", function() { 
       window.clearTimeout(timeout); 
       window.clearInterval(interval); 
       self.blur(); 
       self.off("mouseup mouseout"); 
      }); 

      //on a long click call the callback function within an interval for faster value changing 
      timeout = window.setTimeout(function() { 
       interval = window.setInterval(callback, 50); 
      }, 300); 
     } 
    }, 

    i = 0, 

    cb = function() { 
     console.log(i++); 
    }; 

$("button").mousedown(function(evt) { 
    onBtnClick.call($(this), evt, cb); 
}); 

這適用於桌面環境。但是:當在移動設備上使用網站時,由於瀏覽器檢測到右擊(長按),長按不會被註冊。

是否有可能在移動設備上重新創建臺式機的行爲?我怎麼能做到這一點?

+0

確保回調只觸發一次! – lshettyl

+0

@LShetty:但只要用戶保持按下按鈕,我就想觸發回調...... – Fidel90

回答

1

你將要包括touchstarttouchend事件的手機。此外,您將要確保您爲他們提供的功能包括致電evt.preventDefault()。這樣做有效地告訴手機瀏覽器「嘿,你知道你現在通常想做的事情嗎?不要那樣做。」

這就是說,你提供的應該是這樣的代碼的更新版本:

var onBtnClick = function (evt, callback) { 
     //only react to left mouse button or a touch event 
     if (evt.which == 1 || evt.type == "touchstart") { 
      //save 'this' context and interval/timeout IDs 
      var self = this, 
       interval= null, 
       timeout = null; 

      //react to a single click 
      callback(); 

      //when user leaves the button cancel timeout/interval, lose focus and unbind recently bound listeners 
      self.on("mouseup mouseout touchend", function (evt) { 
       window.clearTimeout(timeout); 
       window.clearInterval(interval); 
       self.blur(); 
       self.off("mouseup mouseout touchend"); 
       evt.preventDefault(); 
      }); 

      //on a long click call the callback function within an interval for faster value changing 
      timeout = window.setTimeout(function() { 
       interval = window.setInterval(callback, 50); 
      }, 300); 
     } 
    }, 

    i = 0, 

    cb = function() { 
     console.log(i++); 
    }; 

$("button").mousedown(function(evt) { 
    onBtnClick.call($(this), evt, cb); 
}); 

$('#hold').on('touchstart', function (evt) { 
    onBtnClick.call($(this), evt, cb); 
    evt.preventDefault(); 
}); 

主要變化:新增|| evt.type == "touchstart"的,如果檢查,以便您捕捉兩個鼠標左鍵,觸摸事件,添加touchendmouseupmouseout事件的列表中,將evt.preventDefault()添加到清除超時的函數中,並添加了一個on('touchstart' jQuery調用,以確保您的按鈕實際上專門用於觸摸和點擊。

+1

就是這樣。謝謝!我嘗試使用'evt.preventDefault();'而不是'return false;',這對我也很好。 – Fidel90

+1

我其實完全忘記了'preventDefault'是一件事情。這很可能是更好的處理方法;我會更新答案以匹配。 – DracoAdvigilat

+0

我測試了一下,現在在移動IE瀏覽器的Windows Phone上我有另一個問題。避免上下文菜單工作正常,但如果我保持按鈕按下回調只調用12次,然後停止(如我已停止按)。我必須再次按下以獲得另外12個步驟,依此類推。這裏有什麼問題,爲什麼只要按住按鈕,回調就不會被調用? – Fidel90

相關問題