2012-08-06 107 views
32

我有一個問題,當頁面變得太大時,使用jQuery加載和操作DOM時,Mobile Safari崩潰。iOS上的移動Safari在大網頁上崩潰

我在iPhone和iPad上遇到同樣的問題。

解決移動頁面查找錯誤的最佳方法是什麼?是否有任何已知的問題可能會導致Mobile Safari崩潰?

+0

什麼太大?它可以重現嗎?你有一個工作示例來顯示崩潰?是否可以在其他瀏覽器上測試(Chrome,FF)?同樣的問題? – rene 2012-08-06 15:42:04

+0

這是一個論壇網站,當線程獲得超過100條評論時,它總會發生。我沒有在我測試過的任何桌面瀏覽器上看到這一點,但在用戶通過身份驗證時,始終在移動Safari上。 – 2012-08-06 15:56:04

+0

我想我已經把它縮小到一大段JavaScript代碼,但我還是不明白是什麼原因造成的。我想我必須刪除所有內容,然後一點一點啓用,看看它什麼時候中斷。 – 2012-08-06 15:59:35

回答

27

我確實發現了這個問題。它不是像我想的那樣用JS,而是用CSS。我添加了類以使CSS過渡淡入某些元素。對於匿名用戶,這些元素有display: none;,可能永遠不會運行不透明度轉換。

奇怪的是,過渡只出現在兩個元素上。那麼爲什麼這隻會在100多條評論的長線程上崩潰呢?

所以底線是:-webkit-transition在移動Safari瀏覽器上崩潰了。

12

任何iOS應用程序的主要問題是內存使用情況。所以,你的頁面很可能使用了太多的內存。

Mobile Safari使用了一些聰明的技巧,以至於整個頁面在任何給定的時間都不會駐留在內存中,只有一部分。也許你可以檢查你的頁面中是否有任何東西擊敗了這個機制,或者使它失效。

在任何情況下,要提供更多關於點的建議,關於您的頁面的更多信息將非常棒。

順便說一下,您可以從設備存儲的崩潰日誌中獲得一些提示。請檢查您是否可以設置下找到它:

  1. 一般
  2. 關於
  3. 診斷&使用
  4. 診斷&使用數據

如果它是內存的問題,你應該找像「信號(0)」;不確定這是否意味着「因內存使用而死亡」,但當我發現一個信號(0)時,我通常認爲這是理所當然的。

否則,它可能會告訴你什麼是錯的...

希望這有助於。

+1

請檢查我的關於檢查崩潰日誌的編輯... – sergio 2012-08-06 16:03:13

+0

你如何能像你說的那樣「檢查你的頁面中的任何內容是否會擊敗[Mobile Safari的聰明的內存節省機制]或使其效率更低」? – davidtheclark 2014-01-10 23:28:38

3

存在內存限制和Javascript執行時間限制,儘管對於如何實際打擊這些限制有些模糊。常見的報告是,大小超過10MB的頁面會出現問題,JavaScript執行時間限制爲10秒。

有關更多信息,請參閱Apple's documentation

+0

這是嵌入式平臺無需交換的必然結果。一旦主內存已滿,內存不足錯誤即將開始發生。 如果10MB聽起來很小,請記住,Safari可以在任何時候打開多個標籤 - 儘管它會安靜地放棄隱藏標籤的頁面內容以迴應內存壓力。 – marko 2012-08-06 15:50:21

+0

@Marko這是一個明顯的Safari錯誤和潛在的安全問題。當系統通知他們並且不會崩潰時,應用程序需要釋放盡可能多的內存。當Safari內存不足時,Safari應該拍攝快照並顯示它們,或者甚至在太多時禁用圖像或截斷頁面。 (Off-topic note:固態硬盤下的交換是恐怖的,這就是爲什麼我購買了我配備SSD的MBP最大的內存,所以我可以儘可能地避免交換,這對蘋果來說永遠不會在我們的移動設備上啓用。) – 2012-08-06 16:10:40

+0

The內存和時間限制似乎只適用於JavaScript。畫布和JPEG也有一些限制。達到極限會停止網頁,而不是Safari。顯然,蘋果應該加大限制來防止崩潰。 – 2012-08-06 16:14:22

21

有同樣的問題,對我來說是導致Safari的崩潰的-webkit-transform: translateZ(0);

+0

這對我來說伎倆! – Mohammer 2013-01-08 14:11:18

+0

同樣的事情,做到了。 – Ben 2014-03-02 12:39:29

0

我有一個類似的問題,網頁的工作就像在Android設備上的魅力和iOS(iPhone和模擬器)墜毀。

經過大量研究(也使用ios_webkit_debug_proxy)後,我發現問題與jQuery ready事件相關。

添加一點超時解決了問題。我的應用程序也使用iframe。

$(document).ready(function() { 
    window.setTimeout(function() { ready(); }, 10); 
}); 
+2

如果ready是一個不帶參數的函數,那麼你可以這樣做: window.setTimeout(ready,10); – Dtipson 2015-03-18 01:25:28

+0

感謝提及'ios_webkit_debug_proxy',這是一個很酷的項目! – ken 2015-09-21 21:59:09

1

我最近有移動Safari瀏覽器崩潰含有大量的圖片(30+足夠)web應用程序的頁面和菜單的幾個轉變的問題。經過大量的試驗和錯誤之後,我解決了類似於LinkedIn的解決方案,但是使用angularjs進行無限滾動。我使用了requestAnimFrame和兩個展開/縮小divs(帶有js樣式屬性)在列表的頂部和底部以除去所有圖像容器(其他東西覆蓋在頂部),除了幾個接近視。滾動性能(本地,沒有JS)是好的,內存消耗在檢查。