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表单问题的更多相关文章

  1. Jquery easyui 重置按钮,easyui 清空表单,Jquery easyui 重置表单

    Jquery easyui 重置按钮,easyui 清空表单,Jquery easyui 重置表单 >>>>>>>>>>>>&g ...

  2. 基于Bootstrap+jQuery.validate Form表单验证实践

    基于Bootstrap jQuery.validate Form表单验证实践 项目结构 :     github 上源码地址:https://github.com/starzou/front-end- ...

  3. 表单(上)EasyUI Form 表单、EasyUI Validatebox 验证框、EasyUI Combobox 组合框、EasyUI Combo 组合、EasyUI Combotree 组合树

    EasyUI Form 表单 通过 $.fn.form.defaults 重写默认的 defaults. 表单(form)提供多种方法来执行带有表单字段的动作,比如 ajax 提交.加载.清除,等等. ...

  4. jQuery控制form表单元素聚焦

      CreateTime--2017年5月28日08:57:16Author:Marydon jQuery使form表单的第一个文本框聚焦 /** * 使form表单的第一个文本框聚焦 */ func ...

  5. jQuery实现form表单基于ajax无刷新提交方法详解

    本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...

  6. jquery获取form表单内容以及绑定数据到form表单

    在日常开发的过程中,难免会用到form表单,我们需要获取表单的数据保存到数据库,或者拿到后台的一串json数据,要将数据绑定到form表单上,这里我写了一个基于jquery的,formHelp插件,使 ...

  7. jquery序列化form表单使用ajax提交后处理返回的json数据

    1.返回json字符串: /** 将一个字符串输出到浏览器 */ protected void writeJson(String json) { PrintWriter pw = null; try ...

  8. jquery序列化form表单

    在开发中有时需要在js中提交form表单数据,就需要将form表单进行序列化. jquery提供的serialize方法能够实现. $("#searchForm").seriali ...

  9. Jquery实现form表单提交后局部刷新页面的多种方法

    最近做一个小项目,刚好需要用到搜索功能,实现搜索框内输入数据然后按回车或者点击“提交”,然后给后台数据库处理并返回数据给前端,在前端局部更新数据. 但是遇到了一个小问题,就是form表单下任意输入框输 ...

随机推荐

  1. ubuntu下使用sublime text进行C编程开发尝鲜

    1 选择编译系统 2 编写文件,编译(Ctrl+B)运行(Shift+Ctrl+B)

  2. sql替换数据库字段中的字符

    UPDATE `table_name` SET `field_name` = replace (`field_name`,'from_str','to_str') WHERE ……说明:table_n ...

  3. 基于Cocos2d-x学习OpenGL ES 2.0系列——纹理贴图(6)

    在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...

  4. 应用程序挂起、复原与终止— IOS开发

    本文转载至 http://justcoding.iteye.com/blog/1473350 一.挂起 当有电话进来或者锁屏,这时你的应用程会挂起,在这时,UIApplicationDelegate委 ...

  5. iOS设计模式之类族(class cluster)

    类族模式在UIKit(user interface framework)使用的范围已经远远超过我们的想象,比如,UIButton,NSArray,NSString,NSNumber等, 例如NSNum ...

  6. iOS 自动布局 Autolayout 优先级的使用

    一.约束的优先级 0.屏幕适配 发展历程 代码计算frame -> autoreszing(父控件和子控件的关系) -> autolayout(任何控件都可以产生关系) -> siz ...

  7. php查询操作实现投票功能

    这篇文章主要为大家详细介绍了php查询操作实现投票功能的具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   本文实例为大家分享了php查询操作实现投票功能的代码,供大家参考,具体内容如下 ...

  8. c++11——模板的细节改进

    c++11改进了编译器的解析规则,尽可能的将多个右尖括号(>)解析为模板参数结束符,方便编写模板相关的代码. 1. 模板的右尖括号 之前的c++标准中,模板套模板中右尖括号不能连在一块,否则会和 ...

  9. 网络电话pjsip Getting Started: Building for Apple iPhone, iPad and iPod Touch

    Getting Started: Building for Apple iPhone, iPad and iPod Touch ¶ Getting Started Preparation Get th ...

  10. java基础---->多线程之yield(三)

    yield方法的作用是放弃当前的CPU资源,将它让给其它的任务去占用CPU执行时间.但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片.今天我们通过实例来学习一下yield()方法的使用.最是 ...