在Mobile Safari上强制执行完整页面渲染?

时间:2010-11-22 19:27:36

标签: javascript dom performance mobile-safari cordova

有没有办法在Mobile Safari上强制渲染/更新所有页面元素(甚至是屏幕外的元素)?

我正在使用PhoneGap构建应用程序,并且在尝试通过JS在屏幕外“存储”的DOM元素中更新数字时遇到问题。该元素位于HTML中,但在屏幕外定位,直到按下按钮为止。当我按下按钮显示数字时,元素将重新出现。

我注意到Mobile Safari喜欢渲染页面元素(甚至元素的部分),因为它们在屏幕上可见。例如,您可以放大图像,它只会渲染可见的部分,如果您滚动另一部分不可见,它现在将开始渲染(这需要时间)。

我只是替换<的内容。 span>使用新字符串(数字)但是如果< span>在屏幕外,它似乎没有更新,直到我在屏幕上调用它,然后需要额外的时间来更新。

是否有任何修复/解决方法,或者我将来是否应尝试设计?我觉得很奇怪,我无法动态更改屏幕外的元素,并在需要时将它们拉回屏幕......

HTML:

<div class="menu_container" id="menu_menu">    
<p id="hit_pct"><span class="gold">100</span> Hit %</p>
</div><!-- /#menu_menu -->
通过定位,

menu_menu位于屏幕外。然后按下按钮滑入。当menu_menu尝试滑入时,它会突然显示,因为span元素最初不会出现。然后缓慢渲染并完成幻灯片动画。

我尝试过不使用滑动动画,结果保持不变。元素的渲染速度不够快,因此整个容器不会在合理的时间内出现。

更新元素的JavaScript:

if(aTilesHit == 0){
   pct = 100;
}else{
   pct = Math.round((abTilesHit/aTilesHit)*100);
}
x$('#hit_pct').inner('<span class="gold">'+pct+'</span> Hit %');

打开菜单的JavaScript:

animationsOn = false; //Halts the animations that will be behind the menu
if(x$('.menu_button').hasClass('active')){
   close_menus();
}else{
   x$('#ingameMenus').css({'left':0}); //Positions the menu on screen
   x$('.menu_container').removeClass('hidden'); //.hidden positions the element offscreen. It does NOT add display=hidden
   x$('.menu_button').addClass('active');
}

谢谢, 约旦

注意:这不会发生在Android浏览器上,因此我觉得它与Mobile Safari处理页面呈现的方式直接相关。

2 个答案:

答案 0 :(得分:4)

这可能是移动Safari的渲染问题。可以通过使用以下CSS规则触发硬件加速来强制渲染:

-webkit-transform: translate3d(0,0,0)

在这个问题中讨论:iPad Safari scrolling causes HTML elements to disappear and reappear with a delay

答案 1 :(得分:1)

你说它位于屏幕外,您是否可以使用display: none;隐藏元素?

元素的内容仍然可以通过JavaScript获得,但不会出现在屏幕上。