本帖最后由 mark35 于 2012-12-3 20:21 编辑
smallthing 发表于 2012-8-22 23:10 
其实是可以的,但是,需要写不少js,对程序员要求比较高,说白了就是做个在网页里的客户端
其实也不难。下面是我以前项目中用到,自己封装的ajax函数,
// 自定义jq ajax,返回JSON
var my_jsonajax = function() {
var defaultValue = {
url : '',
data : {},
type : 'POST',
dataType : 'json',
processData : true,
async : true,
cache : true,
global : true,
ifModified : false,
beforeSend : null,
succ : function(r, e){return true;}, // r.stat >5
complete : null,
err : function(r, e){return true;}, // r.stat <=5
succAlert : false, // 提示成功信息
failAlert : false, // 提示失败信息(非ajax失败,而是服务端返回失败信息!)
reload : false, // 成功后不刷新页面
abortOnRetry: true, // 相同URL则终止前一个请求
loaderImg : '#loaderImg' // 加载动画id
};
return function(opt){
var sts = jQuery.extend({}, defaultValue, opt);
jQuery.ajax({
abortOnRetry: sts.aboutOnRetry,
type : sts.type,
url : sts.url,
cache : sts.cache,
data : sts.data,
async : sts.async,
global : sts.global,
ifModified : sts.ifModified,
dataType : sts.dataType,
beforeSend : function(xhr){
xhr.setRequestHeader('myajax', 1);
if (typeof sts.beforeSend == 'function') {
sts.beforeSend();
}
if (sts.loaderImg) {
jQuery(sts.loaderImg).show();
}
},
success : function(r, e){
if (sts.loaderImg) {
jQuery(sts.loaderImg).hide();
}
if (r && r.relogin) {
return false;
}
else if (!r || typeof r.stat === 'undefined') { // r.stat : 5初始化值, 1错误, 3失败, 7完成, 9成功. 若r.jump真则跳转r.dat值或者reload
if (jQuery.blockUI) {
jQuery.unblockUI();
}
return false;
}
if (r.stat > 5) {
sts.succ(r, e); // 先执行自定义
if (sts.succAlert && r.msg) { // 显示成功信息
alert(r.msg);
}
if (r.jump) {
window.location.href = r.dat || window.location.href;
}
if (true == sts.reload) { // 刷新页面
window.location.href = window.location.href;
}
}
else {
sts.err(r, e);
if (sts.failAlert && r.msg) {
alert(r.msg);
}
}
},
complete : function(r, e){
if (typeof sts.complete == 'function') {
sts.complete(r, e);
}
//r = null;
},
error : function(xhr, e){
if ((jQuery.blockUI)) {
jQuery.unblockUI();
}
if (sts.loaderImg) {
jQuery(sts.loaderImg).hide();
}
alert('ajax错误: ' + (!e ? '' : e));
}
});
}
}();
PHP端的- /**
- * 输出返回json格式数据,默认终止脚本
- * @param mixed $arg string/array
- * @param int $ex 1退出脚本, !1继续执行脚本
- */
- function json_return($arg, $ex = 1, $cacheTime = 0) {
- $cacheTime = intval($cacheTime);
- ob_start();
- header( 'Content-Type: application/json; charset=UTF-8' );
- if ($cacheTime > 0) {
- header("Cache-Control: must-revalidate, max-age=$cacheTime");
- }
- else {
- header('Cache-Control: no-cache, no-store, must-revalidate');
- }
- echo json_encode($arg);
- if ($ex == 1) { die(); }
- }
- /**
- * 修改返回JSON信息
- * msgR($jsR)返回当前状态值
- * msgR(null, 1, 'errmsg') 返回错误及错误信息
- *
- * @param jsR array/null 若null则初始化
- * @param stat int (-1:relogin; 1:error; 3:failure; 5:init; 7:complete; 9:succeed; -2:jump url with $dat)
- * @param msg string[option='']
- * @param data mixed[option=Null]
- * @param jump int[option=0] 是否需要跳转 设置为1则需要 $dat保存url 若$dat空则客户端reload
- */
- function msgR($j, $stat = 5, $msg = '', $dat = null, $jump = 0) {
- if (func_num_args() == 0) {
- return array('stat'=>5, 'msg'=>''); //初始化,msg初始值不能为null!
- }
- elseif (func_num_args() == 1) {
- if (!$j) { return array('stat'=>5, 'msg'=>''); } // 初始化$jsR
- elseif (is_array($j)) {return $j['stat'];} //返回状态值
- }
- elseif (!$j) { // 若第一参数值假则初始化,故不用特地初始化 $jsR
- $j = array('stat'=>5, 'msg'=>'');
- }
- $j['stat'] = $stat;
- if (9 == $stat) {
- $j['msg'] = $msg; //9时清空已有msg
- }
- else {
- $j['msg'] = !$j['msg'] ? $msg : ($j['msg'] . ',' . $msg); //非9时追加msg
- }
- if ($dat) {
- $j['dat'] = $dat;
- }
- if ($jump) {
- $j['jump'] = 1;
- if (!$j['dat']) {
- $j['dat'] = $dat; // 跳转url
- }
- }
- $j['msg'] = my_htmlspecialchars( $j['msg'] );
- return $j;
- }
复制代码 调用- json_return(msgR(null, 3, '任务添加失败'));
复制代码 |