马赫迪,
我看不出任何明显,但效率可能是一个问题。一船改进是可能的。
以下是一些一般的指针:
- 认沽全局
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