zoukankan      html  css  js  c++  java
  • Jquery下的Ajax调试方法

    介绍

    本文介绍Jquery下的Ajax调试方法;很多调试方法,就是一点就通,但是,在还没有通之前,会让人困惑,不知所以然;

    Ajax 可以为用户提供更为丰富的用户体验。jQuery 对 Ajax 当然也提供了很好的支持,而且还抽象了各种浏览器对于 Ajax 支持方面令人痛苦的差异。它不但提供了全功能的 $.ajax() 方法,还有诸如$.get()$.getScript()$.getJSON()$.post() 和 $().load() 等更为简便的方法。

    一个示例

    首先,我们用一个示例来说明JQuery的Ajax调用过程,

    实现的一个功能是:点击确认支付按钮之后,实现余额支付的功能:

    1.首先在php页面将相关需要调用的函数绑定到按钮上:

    <input type="submit" name="pay_btn" id="pay_btn" value="确认支付" />

    <script type="text/javascript">

    $(function(){

        $("#pay_btn").bind("click",ABC.balancePay);

    });

    2.脚本处:

    如果使用$.post方式实现:

    var ABC = {

        balancePay: function(event){

            event.preventDefault();

            var tthis = $(event.currentTarget);

            var form = tthis.parents(‘form’);

            var url = form.attr(‘action’);

            var data = ‘code=15′ ;//+ $(‘#verifyCode’).val();

            var jqXhr = $.post(url, data, undefined, ‘jsonp’);

            jqXhr.done(function(datas){

                    //console.log(‘这里是通过console打印出来的’); //#4

                    $("#msg").text(‘结果:’+data);

    });

    }

    $.post方式也可以直接指定回调函数:

    var jqXhr = $.post(url, data, function(data){

                $("#msg").text('结果:'+data);

    }, 'jsonp');

    使用$.ajax方法实现:

    var jqXhr = $.post(url, data, function(data){

                $("#msg").text(‘结果:’+data);

    }, ‘jsonp’);

    使用$.ajax方法实现:

    var jqXhr = $.ajax({

                type: ‘post’,

                url: url,

                data: {code: ‘15′},

                dataType: ‘jsonp’,

                sccuess:function(data){

                alert(‘good’);},

                error: function(XMLHttpRequest, textStatus, errorThrown) {  //#3这个error函数调试时非常有用,如果解析不正确,将会弹出错误框
                            alert(XMLHttpRequest.status);
                            alert(XMLHttpRequest.readyState);
                            alert(textStatus); // paser error;
                        },

    });

    3.服务器端:

    public function actionInterPayProc($callback)

    {

    //header("content-type: text/javascript");

    //header(‘Content-type: text/html; charset=utf-8′);

             $code = $_POST['code'];

            //$code  //#1 此处给出一个有语法错误的表达式

            //echo $code;  //#2  此处标记,用于后面调试说明;

            …

            $result = 1;

                //echo $_POST['callback']. ‘(‘ . json_encode($result) . ‘);’;//注意使用的编码方式需要和客户端请求保持一致;

    exit(0);

    }

    2
      

    调试工具

    Firefox 有强大 FireBug 插件,现在比较新的浏览器如 Chrome 和 Safari,以及 IE 8都内置了调试工具,借助于这些调试工具,可以非常详细的查看 Ajax 的执行过程(chrome和firefox中调出调试工具的快捷键是ctrl+shift+c);

    以下使用FireBug;

    调试方法

    1.使用firebug,查看回调:

        对于Ajax方法,是通过异步执行的服务器端程序,如果服务器端出错,在页面上不会显示的,我们需要借助调试工具来查看;例如,将以上示例中#2的注释去掉,触发ajax请求一次,可以在控制台面板中查看到错误的返回结果:

    如果是服务器端程序出错,也可以直接看到,出错原因跟一般普通的页面一样,只不过是在ajax返回的面板中查看(web浏览器页面中不会有任何显示)。

    这里需要说明的是,如果在服务器端使用了echo等方法将需要查看的变量打印出来了,那么,ajax调用的结果一定是失败的,因为这样看上去的回调函数名称被更改了,造成无法解析;

    例如,打印的变量是333,那么最后回调的结果是:333ajaxcallbak(1);客户端寻找333ajaxcallbak这个函数名,无法解析。

    2.使用error函数打印错误信息:

    $.ajax()有一个error参数,可以指定一个函数,在请求失败时,将调用此方法。这里给出的信息,对于调试来说,非常有用;

    error:function (XMLHttpRequest, textStatus, errorThrown)

    error事件返回的第一个参数XMLHttpRequest有一些有用的信息:

    XMLHttpRequest.readyState:

    其返回的状态码对应了一种错误说明:

    状态码

    0 - (未初始化)还没有调用send()方法

    1 - (载入)已调用send()方法,正在发送请求

    2 - (载入完成)send()方法执行完成,已经接收到全部响应内容

    3 - (交互)正在解析响应内容

    4 - (完成)响应内容解析完成,可以在客户端调用了

    XMLHttpRequest.status:

    这里返回的状态码就是我们日常见到的HTTP状态;比如404,表示没有找到页面;

    (详细的状态码对应信息见附录;)

    textStatus:

    "timeout", "error", "notmodified" 和 "parsererror"。

    (默 认: 自动判断 (xml 或 html)) 请求失败时调用时间。参数有以下三个:XMLHttpRequest 对象、错误信息、(可选)捕获的错误对象。如果发生了错误,错误信息(第二个参数)除了得到null之外,还可能是"timeout", "error", "notmodified" 和 "parsererror"。

    通过这个error函数,程序出错就很容易排查;

    比如上面的#2处,去掉注释,相当于更改了回调函数名;在erro里就会报:parsererror;

    3.使用console.log打印输出:(alert()也可以)

    这只是一个增强调试体验的辅助方法。对于js中的关注变量跟踪,我们可通过alert()方法打印出来,不过弹出框频繁会让人烦躁。console.log是一个替代方式,它是firebug插件的一个方法。console.log打印出来的变量结果会显示在firebug的控制台面板中;

    可能的出错原因:

    1.如果返回的结果格式不正确,在firebug中能看到结果;

    2.对于JSON请求,对格式比较严格:

    如果通过error函数打出来的报错是:parsererror

    可能的原因是服务器端脚本编码的问题;可以在服务端处理函数内处理的第一行加上对应的header信息:

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

    当然,最有可能的是格式不正确:

    echo "{'re':'success'}";jquery不能解析

    echo "{"re":"success"}";就没有错误

    不要输出怪异的json格式的字符串,要不jq1.4+版本不会执行success回调。如{abc:1}或者{'abc':1},要输出 
    {"abc":1}

    {'success':true}改为{"success":true}

    相关书籍:

    刚接触jquery的朋友,可以看看这本书。介绍的很全面,实例浅显易懂:

    锋利的JQuery

    附录:

    XMLHttpRequest.status状态码

    1xx-信息提示 
    这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。 
    100-继续。 
    101-切换协议。 
    2xx-成功 
    这类状态代码表明服务器成功地接受了客户端请求。 
    200-确定。客户端请求已成功。 
    201-已创建。 
    202-已接受。 
    203-非权威性信息。 
    204-无内容。 
    205-重置内容。 
    206-部分内容。 
    3xx-重定向 
    客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 
    301-对象已永久移走,即永久重定向。 
    302-对象已临时移动。 
    304-未修改。 
    307-临时重定向。 
    4xx-客户端错误 
    发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。 
    401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示: 
    401.1-登录失败。 
    401.2-服务器配置导致登录失败。 
    401.3-由于ACL对资源的限制而未获得授权。 
    401.4-筛选器授权失败。 
    401.5-ISAPI/CGI应用程序授权失败。 
    401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。 
    403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因: 
    403.1-执行访问被禁止。 
    403.2-读访问被禁止。 
    403.3-写访问被禁止。 
    403.4-要求SSL。 
    403.5-要求SSL128。 
    403.6-IP地址被拒绝。 
    403.7-要求客户端证书。 
    403.8-站点访问被拒绝。 
    403.9-用户数过多。 
    403.10-配置无效。 
    403.11-密码更改。 
    403.12-拒绝访问映射表。 
    403.13-客户端证书被吊销。 
    403.14-拒绝目录列表。 
    403.15-超出客户端访问许可。 
    403.16-客户端证书不受信任或无效。 
    403.17-客户端证书已过期或尚未生效。 
    403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。 
    403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。 
    403.20-Passport登录失败。这个错误代码为IIS6.0所专用。 
    404-未找到。 
    404.0-(无)–没有找到文件或目录。 
    404.1-无法在所请求的端口上访问Web站点。 
    404.2-Web服务扩展锁定策略阻止本请求。 
    404.3-MIME映射策略阻止本请求。 
    405-用来访问本页面的HTTP谓词不被允许(方法不被允许) 
    406-客户端浏览器不接受所请求页面的MIME类型。 
    407-要求进行代理身份验证。 
    412-前提条件失败。 
    413–请求实体太大。 
    414-请求URI太长。 
    415–不支持的媒体类型。 
    416–所请求的范围无法满足。 
    417–执行失败。 
    423–锁定的错误。 
    5xx-服务器错误 
    服务器由于遇到错误而不能完成该请求。 
    500-内部服务器错误。 
    500.12-应用程序正忙于在Web服务器上重新启动。 
    500.13-Web服务器太忙。 
    500.15-不允许直接请求Global.asa。 
    500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。 
    500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。 
    500.100-内部ASP错误。 
    501-页眉值指定了未实现的配置。 
    502-Web服务器用作网关或代理服务器时收到了无效响应。 
    502.1-CGI应用程序超时。 
    502.2-CGI应用程序出错。application. 
    503-服务不可用。这个错误代码为IIS6.0所专用。 
    504-网关超时。 
    505-HTTP版本不受支持。 
    FTP 
    1xx-肯定的初步答复 
    这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。 
    110重新启动标记答复。 
    120服务已就绪,在nnn分钟后开始。 
    125数据连接已打开,正在开始传输。 
    150文件状态正常,准备打开数据连接。 
    2xx-肯定的完成答复 
    一项操作已经成功完成。客户端可以执行新命令。200命令确定。 
    202未执行命令,站点上的命令过多。 
    211系统状态,或系统帮助答复。 
    212目录状态。 
    213文件状态。 
    214帮助消息。 
    215NAME系统类型,其中,NAME是AssignedNumbers文档中所列的正式系统名称。 
    220服务就绪,可以执行新用户的请求。 
    221服务关闭控制连接。如果适当,请注销。 
    225数据连接打开,没有进行中的传输。 
    226关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。 
    227进入被动模式(h1,h2,h3,h4,p1,p2)。 
    230用户已登录,继续进行。 
    250请求的文件操作正确,已完成。 
    257已创建“PATHNAME”。 
    3xx-肯定的中间答复 
    该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。331用户名正确,需要密码。 
    332需要登录帐户。 
    350请求的文件操作正在等待进一步的信息。 
    4xx-瞬态否定的完成答复 
    该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。421服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。 
    425无法打开数据连接。 
    426Connectionclosed;transferaborted. 
    450未执行请求的文件操作。文件不可用(例如,文件繁忙)。 
    451请求的操作异常终止:正在处理本地错误。 
    452未执行请求的操作。系统存储空间不够。 
    5xx-永久性否定的完成答复 
    该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。500语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。 
    501在参数中有语法错误。 
    502未执行命令。 
    503错误的命令序列。 
    504未执行该参数的命令。 
    530未登录。 
    532存储文件需要帐户。 
    550未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。 
    551请求的操作异常终止:未知的页面类型。 
    552请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。 
    553未执行请求的操作。不允许的文件名。 
    常见的FTP状态代码及其原因 
    150-FTP使用两个端口:21用于发送命令,20用于发送数据。状态代码150表示服务器准备在端口20上打开新连接,发送一些数据。 
    226-命令在端口20上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。 
    230-客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。 
    331-客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。 
    426-命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。 
    530-该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS的配置可能拒绝匿名访问。 
    550-命令未被执行,因为指定的文件不可用。例如,要GET的文件并不存在,或试图将文件PUT到您没有写入权限的目录。

    参考:

    http://www.akasuna.com/2012/03/15/jquery-and-ajax-and-jsonp/

    http://www.cnblogs.com/mybest/archive/2011/12/13/2285730.html

    Posted by: 大CC | OCT23,2012

    博客:cnblogs.com/me115/ [订阅]

    微博:新浪微博

  • 相关阅读:
    [cf1038E][欧拉路]
    [最小费用最大流(板子)]
    [网络流24题]
    [ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018)]
    [Split The Tree][dfs序+树状数组求区间数的种数]
    [CSL 的魔法][求排序最少交换次数]
    [CSL 的字符串][栈,模拟]
    ZOJ 3949 Edge to the Root 树形DP
    第十三周 Leetcode 363. Max Sum of Rectangle No Larger Than K(HARD)
    POJ 2104 HDU 2665 主席树 解决区间第K大
  • 原文地址:https://www.cnblogs.com/nuaaydh/p/4455511.html
Copyright © 2011-2022 走看看