med*_*iev 12 javascript optimization refactoring internet-explorer dom
我有一个预订引擎,在IE7中相当缓慢.它基于ajaxified和hash/window onchange.共有5个步骤.我遇到的主要问题是第2步在IE中非常慢.
当用户登陆步骤2时,发出ajax请求以使用web服务提取数据以显示酒店房间.酒店客房按主要房型和内部更具体类型划分.应用于酒店房间的JS功能包括:
所有这一切导致着名:

显然原因是在IE中的特定时间内有太多的脚本语句按顺序执行.
我基本上需要重构我的代码并对其进行优化,以便在函数调用之间存在延迟.
我在执行ajax请求后注入HTML的方式是:
734 $( o.html ).appendTo( el )
Run Code Online (Sandbox Code Playgroud)
o.html是对html从此处派生的JSON对象属性的引用.
然后,下面的代码运行:
setTimeout(function () {
$('#roomz .room-accordion').each(function () {
$(this).accordion({
header: 'h2.new-heading',
autoheight: false,
clearStyle: true,
collapsible: true,
change: function (event, ui) {
window.ui = ui;
// if it hasnt been quickflipped/subnest accordioned, do it
if (!$(ui.newContent).data('enabled')) {
$('.room-rates', ui.newContent).each(function () {
$(this).accordion({
header: 'h4.rate-name',
autoheight: false,
active: 0,
clearStyle: true
});
//if (!$.browser.msie)
$(this).jScrollPane();
})
$('.room-image', ui.newContent).quickFlip({
vvertical: true
//easing:'easeInBounce'
//easing:'easeInSine'
});
$('.back-copy-inner', ui.newContent).jScrollPane({
verticalDragMaxHeight: 131
});
$(ui.newContent).data('enabled', true);
}
}
})
var el = this;
setTimeout(function () {
$('.back-copy-inner:eq(0)', el).jScrollPane({
verticalDragMaxHeight: 131
});
}, 500);
$('.room-rates:eq(0)', this).each(function () {
$(this).accordion({
header: 'h4.rate-name',
autoheight: false,
active: 0,
clearStyle: true
});
var el = this;
setTimeout(function () {
//if (!$.browser.msie)
$(el).jScrollPane();
}, 50);
});
$('.room-image:eq(0)', this).quickFlip({
vvertical: true
//easing:'easeInBounce'
//easing:'easeInSine'
});
$('.room:eq(0)', this).data('enabled', true);
});
}, 20);
Run Code Online (Sandbox Code Playgroud)
我的第一个代码版本基本上将quickflip和scrollpanes应用到每个房间,无论它是否隐藏在手风琴中.重构版本(实时/当前版本)将其应用于手风琴中活动的第一个房间,当通过手风琴点击另一个房间时,我将快速翻转和滚动窗格应用于它.
我在整个事情周围添加了一个setTimeout,因为这是在注入HTML之后发生的.我也在setTimeout里面.
看起来它仍然太慢了.任何人都可以提供任何重构/优化提示吗?
我再次重构它的想法包括:
.eachon .room accordion,应用一个重复操作来强制每次迭代之间的延迟?blank.gif通过手风琴激活它们如果有人能就我的重构想法提出意见,哪些会产生最好的结果,那就太棒了.
链接:
PS - 不支持IE6
编辑:我在迭代之间放了一个延迟.each,它仍然很慢.我认为自定义滚动条是主要原因.啊.
编辑#2:实时代码是setTimeouts的意大利面.我试图懒惰加载滚动窗格,但它仍然太慢的IE浏览器.
Eri*_*lin -1
我还没有亲自尝试过你的情况,但根据我对这些事情的经验,这是我考虑你的重构的顺序。
由于该错误是由于 JS 连续执行 10 秒或更长时间造成的,因此我会重点关注这一点,而不是优化 HTML 或 GZip 甚至图像加载。在我看来,你的问题是所有设置手风琴的 JS 执行以及可能稍微昂贵的选择器。我不认为这是因为你加载了 31k 的 JSON。正是对这一切的处理才害死了你。
我首先关注的是将每次迭代延迟$('#roomz .room-accordion').each(function() {...}100 毫秒左右,#1 也是如此。
您还可以考虑将选择器的所有“:eq(0)”部分更改为“:first”,除非有一些巧妙的原因我不明白如何使用该确切的选择器。
希望这会有所帮助,即使我没有您应该应用的确切代码调整。