2014-08-27 101 views
2

我的問題是我無法取消在touchstart觸發後觸發的mousedown事件。這個問題是特定於Android的本機瀏覽器的。jQuery.on「touchstart mousedown」 - 這兩個事件在觸​​摸屏設備上觸發

Chrome和Safari都在Android和iOS(onMenuInteraction)中都成功執行了我的方法。我的問題似乎侷限於Android的本地瀏覽器(對於預裝了Android 4.1.2的我)。

以下是我從Javascript對象中提取的代碼。

MenuButtonView.prototype.onSmallScreenSetUp = function() { 
    $("#mobileMenuBtn").on({ "touchstart mousedown": $.proxy(this.onMenuInteraction, this) }); 
} 

MenuButtonView.prototype.onMenuInteraction = function(e) { 
    console.log(this, "onMenuInteraction", e); 
    e.stopImmediatePropagation(); 
    e.stopPropagation(); 
    e.preventDefault(); 
} 

請能有人告訴我,我怎麼能取消你的手指觸摸屏幕觸發touchstart事件後,多數民衆贊成開除鼠標按下事件。

此要求基於管理與臺式機和移動/平板電腦平臺的交互。一切正常,直到您使用Android本地瀏覽器進行測試。

非常感謝

d

回答

1
  1. 檢測哪些事件的支持 - 沒有必要支持兩個事件同時
  2. 負荷$。對()相應
  3. 添加事件前刪除所有事件如此傳播和/或預先存在的(不需要的)事件不會成爲問題

    $(「#mobileMenuBtn」)。o ff()。on({「touchstart mousedown」:$ .proxy(this.onMenuInteraction,this)});

參考文獻:

how-to-check-browser-for-touchstart-support-using-js-jquery

jquery:off()

+1

Re#1通常情況並非如此,設備可以同時擁有觸摸屏和鼠標設備。例如,Chromebook或Windows觸摸屏平板電腦/筆記本電腦。如果這是一個Android應用程序(例如嵌入在Phonegap/Cordova中),那麼您可以假設只需觸摸事件並完全跳過鼠標。如果這是一個網頁,你不能假設,因爲它可以在幾個不同的瀏覽器,包括桌面訪問。試試這個:http://stackoverflow.com/questions/13655919/how-to-bind-both-mousedown-and-touchstart-but-not-respond-to-both-android-jqu – 2014-08-27 22:24:26

+0

他特指Android,我回答他的android問題;)我同意,根據給定的環境,你可能需要以不同的方式做事。 – JDA 2014-08-28 12:35:44

1

使用上述從JDA和Dave Methvin建議組合(謝謝兩者),解決我的問題是下面。

在「touchstart mousedown」事件的回調中,我特別關閉了「touchstart mousedown」。這會停止任何後續的觸摸或鼠標事件被調用。

我發現在Android的本機瀏覽器中實現'touchend'有問題 - 然而'mouseup'事件似乎涵蓋了兩個目的,即對我來說,它似乎表現出與您期望的'touchend'相同的方式。

當'mouseup'被調用時,我將「touchstart和mousedown」事件重新應用到按鈕。

我的解決方案的簡化版本低於:

$(document).ready(function() { 

     $("#mobileMenuBtn").on({ "touchstart mousedown" : onInteraction, 
            "mouseup" : onInteractionEnd }); 

     function onInteraction(e) { 
      $("#mobileMenuBtn").off("touchstart mousedown"); 
     } 

     function onInteractionEnd(e) { 
      $("#mobileMenuBtn").on({ "touchstart mousedown" : onInteraction }); 
     } 

}) 

希望這有助於其他人發現了同樣的問題。

6

支票的touchstart支持存在,設置一個變量來確定是什麼支持你提供:

//touchstart or mousedown 
var click = ('ontouchstart' in document.documentElement) ? 'touchstart' : 'mousedown'; 

然後使用:

$(element).on(click,function(){ 
    //do stuff 
}); 

注意click在這種情況下是一個變量,而不是串。

+3

這是如何在具有觸摸屏和鼠標的新型筆記本電腦上工作的? – Alec 2016-07-21 15:41:27

+1

我認爲他們使用touchstart,但他們對觸摸等鼠標輸入作出響應。幾個月前我測試了這個,我確信這就是發生了什麼。儘管如此,我現在無法訪問這樣的設備進行測試。我記得那時我正在建造的東西必須通過MS表面測試,並且確實如此。 – dewd 2016-07-21 15:47:23

+0

你會爲觸摸屏筆記本電腦做什麼。TouchPad將無法工作.... – CandleCoder 2016-11-08 10:08:50

1

如果touchstart被觸發,則使用e.preventDefault();取消mousedown事件。