马赫迪,
我看不出任何明显的东西,但效率可能是个问题。一大堆改进是可能的。
以下是一些通用指针:
- 将 globals
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% 正确,但应该为您提供一些关于如何改进它的线索。
编辑
作为 resize 事件持续重新触发的解决方法,请尝试动态分离和重新附加 resize 处理程序。
代替 :
$(window).resize(function() {
correctPages();
});
和 ;
function attachResizeHandler() {
$(window).on('resize', resizeHandler);
}
function resizeHandler() {
$(window).off('resize');
correctPages();
setTimeout(attachResizeHandler, 600);
}
我选择了 600 毫秒,因为它比正确页面或校验哈希代码中的最长超时时间稍长。根据触发不需要的调整大小事件的确切原因,您可能会侥幸逃脱。
在代码的其他地方,替换所有实例:
`correctPages();`
和 :
`resizeHandler();`
resizeHandler
然后在页面加载时checkhash();
调用初始附件。