2013-01-16 14 views
1

後我與jQuery的動畫()函數的一個非常奇怪的問題,在iPhone 5的情景:上touchend jQuery的動畫滾動上的iPhone5

附上一份事件處理程序touchend事件的元素上,開始動畫。通常這工作得很好。但是,一旦我滑動頁面,一旦滑動到此元素上,動畫功能就不再生成動畫了(關於所有未來的手勢)。事件被解僱並且處理程序被調用,但動畫不會執行任何操作。我試着用jQuery移動事件,現在用oldscool element.attachaddEventListener導致相同的結果。有趣的是:

  1. 如果我重視它touchstart,它的工作原理之前和滾動後(!但我需要的touchend事件)
  2. 如果我做的東西,不動畫,切換,例如,它也可以工作。

小演示頁:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Testpage</title> 
    <meta content="width=device-width, initial-scale=1.0, user-scalable=yes" name="viewport"> 
    <script src="/3rdParty/scripts/jquery/jquery-1.8.3.js" type="text/javascript"></script> 
    <style> 
     body { padding: 10px;} 
     #mover { position: relative; width: 100px; background-color: red; color: #fff; padding: 5px; } 
     #hider { width: 100%; overflow: hidden; } 
     #touchme { border:1px solid #808080; margin-bottom:10px;line-height: 50px; text-align:center;} 
    </style> 
    <script> 
     $(document).ready(function(){ 
      var elem = document.getElementById('touchme'); 
      elem.addEventListener('touchend', positionHandlerEnd, false); 
      elem.addEventListener('mouseup', positionHandlerEnd, false); 
     }); 
    </script> 
    <script> 
     function positionHandlerEnd(e) { 
      $('#mover').animate({left: '+=40px'}); 
      e.preventDefault(); 
      return; 
     } 

    </script> 
</head> 
<body> 
<div id="touchme">Touch me</div> 
<div id="hider"><div id="mover">This moves</div></div> 
<div> dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate</div> 
<div> dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate</div> 
<div> dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate</div> 
</body> 
</html> 

任何想法究竟是什麼發生在這裏?或任何workarrounds?

回答

3

由於我在同一個問題上苦苦掙扎,我偶然發現了Safari的setTimeout bug。看起來,Safari(在IOS6下)在滾動時不執行動畫或定時器。我不知道爲什麼這會在滾動後影響動畫,但this guy寫了一個小腳本來爲我解決問題。一定要檢查一下:

https://gist.github.com/3755461

我不是100%肯定這是否會導致其他瀏覽器錯誤(沒有遇到什麼,),但我的天,我救了很高興與你分享。

+0

這真的很有趣,謝謝。我沒有發現這是導致這些問題的超時時間。我發現了一個解決方案,但它的工作原理很奇怪:我爲jQuery添加了一個插件,如果可能的話,它會使用CSS3翻譯。因此,在iOS6的Safari上,使用了CSS3翻譯,並且在舊版瀏覽器中幸運地看起來沒有這個問題(我用舊的iPod touch進行了檢查,它的工作原理類似於魅力),將使用jQuery功能。但是這並沒有真正解決問題,只是試圖繞過它。你的解決方案會好得多。謝謝! –

0

我不能重複您的代碼的問題,但我現在有類似的問題。

我有一個覆蓋按鈕,在圖像的左側位置上運行動畫,僅用於測試.animate是否有效。

我還有一個touchend eventListener,它調用一個函數,它使用.animate在觸摸後將img捕捉到特定的位置。

在safari凍結DOM滾動後,.animate函數不再有效,但其他所有操作都會如.css。另外,如果touchend偵聽器函數沒有調用.animate,則在滾動後按下疊加按鈕時,.animate函數將繼續工作。

我已經通過簡化我的代碼的議案,仍然存在這個問題。這是無關緊要的,如果我使用js addEventListener或jQuery的.bind。所以我開始慢慢地通過jquery代碼添加日誌語句(打印到頁面中的div),並注意到jQuery.now()函數在滾動後停止返回當前日期,這本質上運行了一個js函數:new Date()。我想知道它是否與safari凍結DOM有關,但我似乎無法找到更多。這似乎並沒有發生在Android上。

當我尋找答案的時候,對我而言有什麼奇怪的是,在另一個js文件中,在同一頁面上工作,我可以在滾動後獲取日期。

我看到,如果在touchend事件上調用的函數不執行動畫,此按鈕上的動畫調用繼續工作。否則它不會。

以下網址有一個touchend事件功能不.animate運行:

http://selfconstruc.tv/code/jquery-touchmove/test1.html

以下網址中有不運行.animate一個touchend事件功能:

http://selfconstruc.tv/code/jquery-touchmove/test2.html

+0

這幾乎是同樣的問題。也許這個腳本臭蟲566也適合你?否則:如果可能,我添加了一個使用CSS3轉換的jQuery插件,而不是animate()。他們工作。 –

0

我剛找到解決辦法。這是一個黑客imho,但它爲我工作。在touchend事件函數中,執行一個調用另一個執行動畫的函數的setTimeout。
$(「div」)。bind(「touchend」,TouchEnd); (e) timeout = setTimeout(runanimation,10); }

這是足夠的延遲,以避免jQuery的動畫功能停止在touchend/scroll之後在safari中工作的問題。

+0

我已經嘗試了一段時間,它不適合我不幸... –