澳门威利斯人_威利斯人娱乐「手机版」

来自 办公软件 2019-07-13 19:55 的文章
当前位置: 澳门威利斯人 > 办公软件 > 正文

解决jQuery使用JSONP时产生的错误,thinkphp后台aja

thinkphp新版设置了ajaxreturn方法固然是JSON格式会活动安装头新闻为JSON格式,那样做在Google下得以健康深入分析,可是在IE和OPERA浏览器下就能够提醒下载,进而致使程序出错,修改议程如下
thinkphp新版设置了ajaxreturn方法假诺是JSON格式会自动安装头音信为JSON格式,那样做在谷歌(Google)下得以健康剖析,可是在IE和OPERA浏览器下就能唤起下载,进而致使程序出错,修改议程如下
打开:ThinkPHP/Lib/Core/Action.class.php

jQuery EasyUI form表单不是ajax情势提交,而是在付出的时候新建二个隐形的iframe并在iframe里面制造三个与绑定表单同样的表单,然后在iframe里面进行共同交付实际不是异步提交,提交时只刷新iframe里面的页面,而在iframe外面包车型地铁页面看来似乎异步提交了,那样做有多少个低价——能上传文件可能图片,因为ajax情势是无力回天上传文件的。但是jquery的form方法处理响应重临值(比方json)的时候从不像ajax、get、post那多少个方法方便,假使拍卖json响应供给团结调用eval来转变到js的json对象,像上面那样:

哪些是域,简单的话便是商业事务 域名或地点 端口,3者只要有别的贰个例外就代表不在同几个域。跨域,正是在二个域中访谈另叁个域的数量。

寻觅到代码:

$('#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();    

假若只是加载另叁个域的内容,而没有要求拜谒在那之中的数量来说,跨域是很简短的,举个例子动用iframe。但借使急需从另一个域加载并运用那一个多少来讲,就能够相比费心。为了安全性,浏览器对这种场合有所严酷的限定,必要在客户端和服务端同不平日间做一些装置技艺促成跨域央浼。

header('Content-Type:application/json; charset=utf-8');

上边这段代码是管理这种格式的json:

JSONP简介
JSONP(JSON with Padding)是一种常用的跨域花招,但只支持JS脚本和JSON格式的数额。看名就会猜到其意义,JSONP是采用JSON作为垫片,进而实现跨域诉求的一种技术花招。其基本原理是应用HTML的<script>标签天生能够跨域这一特点,用其加载另二个域的JSON数据,加载成功后会自动运转一个回调函数公告调用者。此进程要求另三个域的服务端支持,所以这种艺术实现的跨域并不是即兴的。

修改为:

{  
    "success": true,      
    "message": "Message sent successfully."     
}  

JQuery对JSONP的支持
JQuery的Ajax对象支持JSONP方式的跨域央浼,方法是将crossDomain参数钦点为true並且将dataType参数钦赐为jsonp[1],或许利用简写形式:getJSON()方法[2]。例如:

header('Content-Type:text/html; charset=utf-8');

地点说的那些不会出怎么着难题,出题目是在thinkphp里面,纯熟thinkphp的人应当清楚Controller.class.php里面有四个函数success和error,这八个函数极低价响应ajax乞求,提供JSON、XML、JSONP等格式,纵然用那多个函数来响应EasyUI的form伏乞那就能够出标题,那几个标题在非IE浏览器很不轻松察觉,在IE浏览器下就一直出标题了,再次回到的响应内容不被jQuery寻常深入分析而直接被浏览器首先判定为非文本格式就提示保存了,如下:

// 设置crossDomain和dataType参数以使用JSONP
$.ajax({
 dataType: "jsonp",
 url: "http://www.example.com/xxx",
 crossDomain: true,
 data: {

 }
}).done(function() {
 // 请求完成时的处理函数
});

// 使用getJSON
$.getJSON("http://www.example.com/xxx?jsoncallback=?", {
 // 参数
}, function() {
 // 请求完成时的处理函数
});

一共有两处索要修改

 

使用getJSON时,必要在参数中内定jsoncallback=?,这么些就是这段时间所说的回调函数,JQuery会自动以叁个Infiniti制生成的值(回调函数名)来替换该参数中的问号部分,进而产生jsoncallback=jQueryxxxxxxx这种情势的参数,然后和任何参数一齐行使GET格局发出要求。

文章来源:

图片 1

应用第一种办法时,只要将dataType参数的值钦点为jsonp,JQuery就能够活动在伸手地址前面加上jsoncallback参数,由此无需手动加多。

感谢!

再来看看响应头:

JQuery跨域诉求的老毛病:错误管理 跨域需要大概会退步,举例对方服务器的安全设置拒绝接受来自己方的呼吁(小编方不在对方的深信列表中),只怕互联网不通,或对方服务器已关门,或然必要地址或参数不准确导致服务器报错等等。


图片 2
能够观察响应头中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如下:

在JQuery中,当使用ajax或getJSON发送乞求后会再次回到二个jqXH瑞鹰对象[3]。该目的完毕了Promise协议,所以大家能够采取它的done、fail、always等接口来管理回调。比如大家能够用在它的fail回调中展开呼吁败北时的错误管理:

/**                                                                             
 * 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);                                   
    }                                                                            
}                      
var xhr = $.getJSON(...);
xhr.fail(function(jqXHR, textStatus, ex) {
  alert('request failed, cause: '   ex.message);
});

调用ajaxReturn时把$type设成EVAL就能够了。

这种艺术能够管理“符合规律的不当”,举个例子超时、诉求被搁浅、JSON深入分析出错等等。但它对这多少个“非经常的谬误”,举例互联网不通、服务器已关闭等境况的支持并倒霉。

举例当对方服务器无法常常访谈时,在Chrome下您会在调控台看到一条错误新闻:

图片 3

JQuery不会管理该错误,而是选用“静静地失利”:fail回调不会试行,你的代码也不会收获其余反馈,所以您未曾管理这种不当的机会,也无从向用户告知错误。

本文由澳门威利斯人发布于办公软件,转载请注明出处:解决jQuery使用JSONP时产生的错误,thinkphp后台aja

关键词: 澳门威利斯人 PHP