馬赫迪,
我看不出任何明顯,但效率可能是一個問題。一船改進是可能的。
以下是一些一般的指針:
- 認沽全局
beginX
,beginY
等$(document).ready(function(){...})
閉包內。
- 儘量減少查找DOM節點的需求 - 緩存jQuery對象並儘可能使用方法鏈接。
- .removeclass()將刪除多個空格分隔的類。不需要單獨的陳述
$("#d_page" + i + " #overlay")
令人擔憂。 ids應該是唯一的,爲什麼不是$("#overlay")
或$(".... .overlay")
?
- 讓jQuery方法
.eq()
和.not()
做了一些辛苦的工作。
- 給頁面class =「page」。讓
$pages = $(".page")
,然後$("#d_page" + i.toString())
應簡化爲$pages.eq(i)
。這種類型的許多表達式將會簡化。
通過逐步改進,我將功能correctPages()
從大約170多行減少到了26行。
這是我結束了:
function correctPages() {
var $pages = $(".page"),//relies on pages having class="page"
prefix = (isLandscape(window.innerWidth, window.innerHeight)) ? 'd_landscape_activepage_' : 'd_portrait_activepage_',
classes = ["whitebackground", prefix+"1", prefix+"2", prefix+"3", prefix+"4"].join(' '),
$np = [$pages.eq(currentPage), $pages.eq(nextPage(currentPage)), $pages.eq(nextPage(nextPage(currentPage))), $pages.eq(nextPage(nextPage(nextPage(currentPage))))];
$pages.removeClass(classes);
$pages.find(".overlay").css({top:0, opacity: 0.6});//relies on overlays having class="overlay"
$pages.not($np[0]).not($np[1]).not($np[2]).addClass(prefix+"1");
$pages.not($np[2]).removeClass(prefix+"5").addClass("transition");
$pages.eq(prevPage(currentPage)).addClass(prefix+"2");
$np[0].addClass(prefix+"3").find(".overlay").css("opacity", "0.1");
$np[1].addClass(prefix+"4");
$np[2].addClass(prefix+"5");
$np[isNext ? 2 : 3].removeClass("transition");
setTimeout(function() {
$np[2].addClass("transition");
}, 100);
$(".articlecontent").css("background", "rgba(250,250,250,0)");
$(".d_landscape_activepage_3 .articlecontent").css("background", "rgba(250,250,250,1)");
$(".d_portrait_activepage_3 .articlecontent").css("background", "rgba(250,250,250,1)");
correctDivs();
$("#d_pagefix").css("opacity", "0");
setTimeout(function() {
$np[0].find(".overlay").css("top", "10000px");
}, 400);
}
此代碼是未經測試,可能不是100%正確的,但應該給你一些線索,如何可以改善。
編輯
的解決方法是調整大小事件的持續再觸發嘗試拆卸和重新安裝動態調整大小的處理程序。
替換:
$(window).resize(function() {
correctPages();
});
用;
function attachResizeHandler() {
$(window).on('resize', resizeHandler);
}
function resizeHandler() {
$(window).off('resize');
correctPages();
setTimeout(attachResizeHandler, 600);
}
我選擇了600毫秒,因爲它比正確的頁面或checkhash代碼中的最長超時稍長。取決於究竟是什麼觸發不需要的調整大小事件,您可能會少一些。
在別處在代碼,替換的所有實例:
`correctPages();`
與:
`resizeHandler();`
的resizeHandler
初始附着然後將發生時checkhash();
被稱爲上頁面加載。
那麼你認爲那個巨大的javascript可能會導致safari崩潰? – 2012-08-17 02:09:16
'$ pages = $(「。page」)''應該是'$ pages = $(「。dpage」)'... – 2012-08-17 02:44:04
我自己沒有iPad(我的朋友測試了我的代碼),他現在告訴問題不在刷卡後!它是從頁面完成加載時開始的! – 2012-08-17 03:30:41