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