今天完成了一个在进行耗时长久的操作时,为了不让用户感到无聊而显示一个“载入中,请稍安勿躁”之类提示的小例子。
演示地址:此处。
==============
为了使这个“耗时长久”的操作显得真实一些,我决定让我的jQuery通过ajax去调用一个PHP文件,并从PHP文件那里返回一些东西。当然,这只是一个demo,PHP文件不用太复杂:
$t=rand(3,6); sleep($t); $arr=array("t"=>$t, "foo"=>"bar"); $jarr=json_encode($arr); echo $jarr;
值得注意的有两点:
第一,在返回到jQuery之前,我先用PHP函数json_encode将要返回的东西进行JSON编码。JSON是很通用的编码规范,jQuery、PHP都支持;
第二,返回需要用到的不是return,而是echo。这个很特别。我开始用的是return,然后在jQuery中死活得不到返回的数据流。
核心的jQuery代码是:
var time_elapsed; var action; $(document).ready( function() { $("a").filter("#long").click( function(event) { event.preventDefault(); $.getJSON("ajaxcall.php", function(json) { time_elapsed=json.t; action=json.foo; } ); } ); $("div").filter("#div01").ajaxStart( function() { $(this).slideDown("slow"); } ).ajaxComplete( function() { alert("本次"+action+"的操作耗时"+time_elapsed+"秒。"); $(this).fadeOut("slow"); } ); } );
这里需要注意三点:
第一,变量的说明要在所有函数体之外,类似全局变量。虽然使用全局变量不好,但是在这样小规模的代码段中,也是可以接受的;
第二,请注意获得json数据流中变量的方法。由于在PHP中我是用JSON编码我的返回值,所以我必须用getJSON去调用PHP文件,从而获得数据。同时,可以注意到,经由getJSON得到的数据已经变成了一个对象数组,我可以用json.t,json.foo这样很直观的方法来获取返回值。
第三,请注意ajax调用和针对ajax调用时状态处理函数的声明。ajax的调用必须用$.getJSON的方式;而ajax调用状态中最重要的就是ajaxStart和ajaxComplete。
So far, so good.