博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thinkphp处理jQuery EasyUI form表单问题
阅读量:5903 次
发布时间:2019-06-19

本文共 4016 字,大约阅读时间需要 13 分钟。

 EasyUI form表单不是ajax方式提交,而是在提交的时候新建一个隐藏的iframe并在iframe里面创建一个与绑定表单一样的表单,然后在iframe里面进行同步提交而不是异步提交,提交时只刷新iframe里面的页面,而在iframe外面的页面看来就像是异步提交了,这样做有一个好处——能上传文件或者图片,因为ajax方式是无法上传文件的。但是的form方法处理响应返回值(比如json)的时候没有像ajax、get、post这几个方法方便,如果处理json响应需要自己调用eval来转换成的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.的两个函数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就可以了。

你可能感兴趣的文章
视频云资深技术专家李彬:传统企业如何进行多媒体数字化转型?
查看>>
Android 开发中不得不知道的 Tips 集合 (第三波)
查看>>
看大牛如何分析Zookeeper ZAB 协议
查看>>
Android VectorDrawable SVG 命令详细分析
查看>>
拿着爬虫数据,搞事情啊!!
查看>>
Spark机器学习(上)
查看>>
创建、发布自己的 Vue UI 组件库
查看>>
通过ABAP代码判断当前系统类型,BYD还是S4 OP还是S4 Cloud
查看>>
Python可以做哪些好玩的事之将喜欢的博客整理成pdf
查看>>
编译Android下可执行命令的FFmpeg
查看>>
RxBus-实现EventBus之post
查看>>
揭秘yii2中行为的方法是如何注入到组件类中去的~
查看>>
Angular4.x+Ionic3 踩坑之路之二
查看>>
Redis中的强大的数据结构跳跃表(skiplist)的内部详解及实际运用
查看>>
算法怎么玩(一): 从直男到渣男
查看>>
理解异步之美:Promise与async await(一)
查看>>
python48-tornado
查看>>
优雅的实现Fragment监听返回键
查看>>
React v16的关于propTypes的小坑
查看>>
提供一个Glide灵活加载圆角图片的方法
查看>>