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就可以了。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值