在xajax中控制函数的执行顺序
引子:xajax是一个开源的PHP类库,它能够让你黏合HTML、CSS、Javascrīpt和PHP,轻而易举的开发功能强大、基于WEB的AJAX应用软件. 使用xajax开发的应用软件,无需重新调入页面,就能够异步调用服务器端的PHP函数和更新内容。
xajax具体的用法不说了,直接说问题:想做一个页面的刷新效果,在获取数据过程中提示用户“正在获取数据”,数据获取完毕后,再将提示语替换成实际的数据,很简单,用xajax做两个PHP函数:
[quote]function show_loading()
{
...
$objResponse->assign("my_text", "innerHTML", "正在获取数据");
...
}
function show_data()
{
...
获取数据$data
$objResponse->assign("my_text", "innerHTML", $data);
...
}[/quote]
再用JavaScript调用
[quote]xajax_show_loading();
xajax_show_data();[/quote]
测试发现,大多数情况,都可以得到想要的结果,但是偶尔会出现一直是“正在获取数据”,无法展现数据的问题。检查发现这种情况数据是获取成功的,进一步debug发现是由于先调用的函数不一定先执行造成的,也就是show_data成功展示了数据,但又被执行较慢的show_loading用“正在获取数据”覆盖了本该显示数据,导致看起来像是获取数据失败,执行出错或卡死的感觉。
最初用了个笨办法,延缓获取数据和展示的行为,JavaScript改为
[quote]xajax_show_loading();
setTimeout(xajax_show_data(), 200);[/quote]
也能达到效果,但是方法很撮。。。
最后翻了xajax的文档,发现可以call或者script调用JavaScript,于是改为
[quote]function show_data()
{
...
$objResponse->assign("my_text", "innerHTML", "正在获取数据");
$objResponse->script("xajax_update_data()");
...
}
function update_data()
{
...
获取数据$data
$objResponse->assign("my_text", "innerHTML", $data);
...
}[/quote]
JavaScript改为
[quote]xajax_show_data();[/quote]
这样就可以确保先执行show_data更新等待提示语完成后,再执行update_data展现数据了。解决~~!
发表评论