thinkphp处理jQuery EasyUI form表单问题
jQuery EasyUI form表单不是ajax方式提交,而是在提交的时候新建一个隐藏的iframe并在iframe里面创建一个与绑定表单一样的表单,然后在iframe里面进行同步提交而不是异步提交,提交时只刷新iframe里面的页面,而在iframe外面的页面看来就像是异步提交了,这样做有一个好处——能上传文件或者图片,因为ajax方式是无法上传文件的。但是jquery的form方法处理响应返回值(比如json)的时候没有像ajax、get、post这几个方法方便,如果处理json响应需要自己调用eval来转换成js的json对象,像下面这样:
$('#info_form').form({
url: 'process.php',
onSubmit: function(){
// do some check
// return false to prevent submit;
},
success:function(data){
var data = eval('(' + data + ')'); // change the JSON string to javascript object
if (data.success){
alert(data.message)
}
}
});
// submit the form
$('#info_form').submit();
上面这段代码是处理这种格式的json:
{
"success": true,
"message": "Message sent successfully."
}
上面说的这些不会出什么问题,出问题是在thinkphp里面,熟悉thinkphp的人应该知道Controller.class.php里面有两个函数success和error,这两个函数很方便响应ajax请求,提供JSON、XML、JSONP等格式,如果用这两个函数来响应EasyUI的form请求那就会出问题,这个问题在非IE浏览器很不容易发现,在IE浏览器下就直接出问题了,返回的响应内容不被jQuery正常解析而直接被浏览器首先判断为非文本格式就提示保存了,如下:
再来看看响应头:
可以看出响应头中Content-Type是application/json,而IE以为这不是一个可以显示的格式就提示保存了,从而就没有把响应内容交给jQuery来处理。chrome浏览器只是提示一个告警(Resource interpreted as Document but transferred with MIME type application/json)后依然把响应交给jQuery来处理,所以就感觉像是正常的。因为Controller.class.PHP的两个函数success和error最终调用的是ajaxReturn,所以直接修改ajaxReturn,把header('Content-Type:application/json; charset=utf-8')修改成header('Content-Type:text/html; charset=utf-8'),这回IE浏览器也正常了,但这么改可能会影响其他代码,所以就直接加一个类型EVAL,改后的ajaxReturn如下:
/**
* Ajax方式返回数据到客户端
* @access protected
* @param mixed $data 要返回的数据
* @param String $type AJAX返回数据格式
* @return void
*/
protected function ajaxReturn($data,$type='') {
if(empty($type)) $type = C('DEFAULT_AJAX_RETURN');
switch (strtoupper($type)){
case 'JSON' :
// 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8');
exit(json_encode($data));
case 'XML' :
// 返回xml格式数据
header('Content-Type:text/xml; charset=utf-8');
exit(xml_encode($data));
case 'JSONP':
// 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8');
$handler = isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER');
exit($handler.'('.json_encode($data).');');
case 'EVAL' :
// 返回可执行的js脚本
header('Content-Type:text/html; charset=utf-8');
exit(is_array($data) ? json_encode($data) : $data);
default :
// 用于扩展其他返回格式数据
Hook::listen('ajax_return',$data);
}
}
调用ajaxReturn时把$type设成EVAL就可以了。
thinkphp处理jQuery EasyUI form表单问题的更多相关文章
- Jquery easyui 重置按钮,easyui 清空表单,Jquery easyui 重置表单
Jquery easyui 重置按钮,easyui 清空表单,Jquery easyui 重置表单 >>>>>>>>>>>>&g ...
- 基于Bootstrap+jQuery.validate Form表单验证实践
基于Bootstrap jQuery.validate Form表单验证实践 项目结构 : github 上源码地址:https://github.com/starzou/front-end- ...
- 表单(上)EasyUI Form 表单、EasyUI Validatebox 验证框、EasyUI Combobox 组合框、EasyUI Combo 组合、EasyUI Combotree 组合树
EasyUI Form 表单 通过 $.fn.form.defaults 重写默认的 defaults. 表单(form)提供多种方法来执行带有表单字段的动作,比如 ajax 提交.加载.清除,等等. ...
- jQuery控制form表单元素聚焦
CreateTime--2017年5月28日08:57:16Author:Marydon jQuery使form表单的第一个文本框聚焦 /** * 使form表单的第一个文本框聚焦 */ func ...
- jQuery实现form表单基于ajax无刷新提交方法详解
本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...
- jquery获取form表单内容以及绑定数据到form表单
在日常开发的过程中,难免会用到form表单,我们需要获取表单的数据保存到数据库,或者拿到后台的一串json数据,要将数据绑定到form表单上,这里我写了一个基于jquery的,formHelp插件,使 ...
- jquery序列化form表单使用ajax提交后处理返回的json数据
1.返回json字符串: /** 将一个字符串输出到浏览器 */ protected void writeJson(String json) { PrintWriter pw = null; try ...
- jquery序列化form表单
在开发中有时需要在js中提交form表单数据,就需要将form表单进行序列化. jquery提供的serialize方法能够实现. $("#searchForm").seriali ...
- Jquery实现form表单提交后局部刷新页面的多种方法
最近做一个小项目,刚好需要用到搜索功能,实现搜索框内输入数据然后按回车或者点击“提交”,然后给后台数据库处理并返回数据给前端,在前端局部更新数据. 但是遇到了一个小问题,就是form表单下任意输入框输 ...
随机推荐
- 在MathType如何让括号随内容自动调整大小的技巧
MathType软件是一款数学公式编辑器工具可以轻松输入各种复杂的公式和符号,与Office文档完美结合,显示效果超好,比Office自带的公式编辑器要强大很多.但是很多的新手朋友不知道在MathTy ...
- Phpcms V9当前栏目及所有二级栏目下内容调用标签
在二级栏目列表页调用: <!--* 获取子栏目* @param $parentid 父级id* @param $type 栏目类型* @param $self 是否包含本身 0为不包含* @pa ...
- linux数据盘分区以及格式化
首先切换到root账户下 sudo -i 手动格式化 请根据以下步骤对数据盘进行分区以及格式化,并挂载分区使数据盘可用. 注:执行以下命令时,请注意修改数据盘符,可以使用”fdisk -l”查看盘符 ...
- Windows中目录及文件路径太长无法删除的解决方法
用windows自带的命令解决 win7以上的系统有 robocopy 命令 http://www.jianshu.com/p/95a269951a1b 导致目录太深的原因就是用node中的node ...
- Java精选笔记_HTTP协议
HTTP协议 HTTP概述 介绍 HTTP是Hyper Text Transfer Protocol的缩写,即超文本传输协议. HTTP是一种请求/响应式的协议,客户端在与服务器端建立连接后,就可以向 ...
- sublime常用插件及配置
以下是我的sublime插件列表: SideBarEnhancements增强版侧边栏 这个插件官方不支持通过package安装了,只能手动了,下载地址https://github.com/S ...
- android素材资源
这里先给大家 推荐两个 找图标的 搜索引擎 http://findicons.com/ 这个我也在用 大家也可以试试 找个图标还是很easy的. http://www.iconfinder. ...
- 前端 ui 框架
Bootstrap:http://getbootstrap.com/css/ ant-design:https://ant.design/ weui:https://weui.io/ amazeui: ...
- @property装饰器的用法【python】
转自:http://www.jb51.net/article/65052.htm python官方介绍:https://docs.python.org/release/2.6/library/func ...
- Linux 下配置网卡的别名即网卡子IP的配置
what 什么是ip别名?用windows的话说,就是为一个网卡配置多个ip.when 什么场合增加ip别名能派上用场?布网需要.多ip访问测试.特定软件对多ip的需要...and so on. ho ...