2012-07-12 37 views
0

我有一个有机会在之前操作我的页面的DOM 它的样式,呈现和显示给用户。 显然,我很乐意做这个窗口中所有动态的有趣东西,因为在渲染页面之后DOM操作非常昂贵。由于这主要针对移动设备,因此这种优化对我来说很有价值。通过回调强制同步函数执行

这里有一个基本概述/时间表:

function CalledBeforePageRendered(){ 
    DoAsyncDataBaseWorkWithCallBack(AsyncDataBaseCallBack); 
    DoLocalizationsAndOtherSYNCRONOUSActions(); 
} 


function AsyncDataBaseCallBack(results){ 
    // code that processes the results element 
    // code that manipulates the DOM *before* it's styled. 
} 

的问题是,DoAsyncDataBaseWorkWithCallBackDoLocalizationsAndOtherSYNCRONOUSActions 迅速完成,然后CalledBeforePageRendered收益和后续的造型被应用。

应用样式后,该页面会显示给用户...然后AsyncDataBaseCallBack被称为 ,然后应用div标签和其他DOM修改。只有,我需要这些修改发生在程式化之前发生

有没有什么办法可以使'CalledBeforePageRendered'等待'AsyncDataBaseCallBack'在返回前完成?我知道闭包通常在这里工作,但我不知道如何使用在CalledBeforePageRendered函数之外定义的回调来完成闭包工作。

+1

你为什么要异步执行DataBaseWork?如果所有工作(Db和Dom)都必须在最后同步,为什么不直接发送数据和从服务器构建的html? – Jaime 2012-07-12 19:07:22

+0

当你说'后来的造型应用',你的意思是更多的JS或只是页面的其余部分渲染的东西? – 2012-07-12 19:09:17

回答

1

如果您尝试执行同步JavaScript XmlHttpRequest(XHR)调用 - 这是非常可能的,但假设您尝试在呈现页面之前在客户端上操作DOM - 为什么不在服务器端(因为它首先生成了HTML)。如果你不能,我强烈建议你不要执行同步JavaScript XHR来在页面呈现之前更新页面。这样做会在XHR运行时锁定浏览器窗口,这不仅会增加页面加载的显着延迟时间 - 还会阻止最终用户(因为他们体验到的似乎是一个硬锁)。在DOM渲染之前操纵DOM并不是,即昂贵。最好是首先返回你想要的HTML,而不是在页面加载后加载更多。

再次 - 我只想强调 - 尝试在服务器端(而不是客户端)完成这项工作。如果你不能,并且需要将它作为次要调用 - 添加一个加载镜像,让XHR像大多数JavaScript库那样异步运行,无论如何都是非常强大的。如果我误解了你的目标,请告诉我。

+0

我想过这样做,但我的服务器端API是 - 如何把这个很好 - 不是由具有建设API的经验的人设计的。 我不想在显示DOM之后更新DOM的原因是我使用的是期望某种格式的HTML的框架,然后根据该设备对HTML进行风格化。在页面已被风格化之后插入已知的工作HTML并不具有预期的结果,因为框架已经解析了HTML并对DOM进行了修改。 我需要显示的数据已经存储在设备上的SQLIte数据库中。 – user1521764 2012-07-12 19:15:01

+0

我想我可以逆向工程的DOM修改,框架使用手动创建我自己的HTML,将与框架的样式工作。 – user1521764 2012-07-12 19:20:02

+0

你是否被绑定到这个框架?什么技术?这里有很多方法可以使猫变皮。 – 2012-07-12 19:24:31