2012-09-13 20 views
4

在Javascript中,我想,當用戶捏,檢測,並在同一時間讓他們這樣做。檢測捏/變焦而不會阻止默認行爲

var elm = $("#wrapper")[0]; 
var myGesture = new MSGesture(); 
myGesture.target = elm; 

elm.addEventListener("MSGestureChange", handleGesture);   
elm.addEventListener("MSPointerDown", function (e) { 
    myGesture.addPointer(e.pointerId); 
}); 

,我發現了MSPointerDown事件。

但據我所知,我需要使用-ms-touch-action: none(或pan-y pan-x)對問題元素(#wrapper)進行樣式設置,以便在收縮時能夠接收到MSGestureChange事件。

我不想阻止默認掐的行爲,所以我有哪些選擇?

有沒有解決的辦法,還是我堅持做一個或其他?

+0

在函數'handleGesture'中是否有'return false;'這樣的東西?通常事件應該冒泡... – OlafW

回答

3

您可以通過檢查幾個窗口/文件/屏幕變量的比率檢測變焦變化 - 看http://jsbin.com/abuzaz/8

窗邊onscrollonresize事件的註冊事件檢測變焦變化。如果您擔心調整大小或滾動事件變得「丟失」(可能發生),那麼一個醜陋的解決方案可能是註冊一個慢速間隔計時器來進行雙重檢查。

您可以通過查看document.documentElement.offsetHeightwindow.innerHeight的比率來檢測當前的縮放級別 - 但這可能是由於缺陷/怪癖(見下文)。

您可以通過查看onresize事件中screen.deviceXDPI的更改來檢測頁面縮放(ctrl- +)級別。

要獲得更多樂趣,請使用http://jsbin.com/otocer/12上的綠色方塊進行遊戲 - 然後觸摸另一手指,然後在第二根手指觸摸時獲得MSPointerCancel事件。但同時觸摸兩個,你不會得到任何事件。

觸摸縮放時,您經常會看到一個窗口滾動事件,但我不確定您可以100%地依賴它。看來你得到一個窗口,在觸摸縮放結束調整事件(但也許並不總是 - 見http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/1065f624-32a8-4c80-8ced-998ba624763e)-嘗試http://jsbin.com/otocer/17

注意,觸摸變焦(未頁面縮放)有一些錯誤:

+0

只是想補充說,調整大小事件是在IE10中捏在縮放(進出),這會導致一些問題與動態顯示,固定定位圖層(如你所說)的尺寸設置爲百分比 - 即。模態窗口消失在捏縮放。上面的工作幫助我解決了這個問題,方法是添加一個resize事件偵聽器和狀態跟蹤變量,以基本上重新顯示模式窗口以縮放。 – Strixy

0

注意到這一評論是現在與Windows 8

的最終版本已經過時在閱讀文檔應用您指定-ms-touch-action:none css樣式是什麼告訴瀏覽器,對於該元素,應用程序應該產生你想要捕捉的javascript事件。所以,實際上,我不認爲有可能讓你的蛋糕也吃掉它,無論是獲得JS活動,還是獲得內置行爲(http://msdn.microsoft.com/en-US/library/ie/hh673557.aspx)。

+0

你錯了。第一個鏈接http://jsbin.com/abuzaz/8顯示檢測捏縮放和縮放(它有* no * -ms-touch-action:none)。 http://jsbin.com/otocer/12鏈接將顯示-ms-touch-action:none和pinch-zoom之間的交互(您似乎認爲這存在問題)。你所說的是對我的答案的評論,而不是本身的答案,哎呀。我花了大量的時間來編寫和驗證我的答案,如果您在發佈之前花一些時間來驗證您的擔憂,我很感激。 – robocat

+0

Robcat - 我很高興他們終於通過Windows 8的產品版本解決了這個問題。當問到這個問題時,我回答了這個問題,IE 10和Windows 8不在您使用的版本中... – adam

+0

似乎仍然如此。 https://connect.microsoft.com/IE/feedback/details/767646/ms-touch-action-does-not-allow-a-way-to-programmatically-prevent-default-touch-behavior上的答案表示那裏沒有編程方法來阻止JS中的默認行爲,只能通過觸摸操作。 – natevw