Ajax学习与简单应用

1 篇文章 0 订阅
1 篇文章 0 订阅

什么是Ajax

AJAX即“ A synchronous  J avascript +  X ML [1]  ”(异步JavaScript和XML [1]  ),是指一种创建交互式 网页应用的网页开发技术。
AJAX = 异步  JavaScriptXML标准通用标记语言的子集)。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页面。
摘自: 百度百科

Jquery Ajax

定义和用法

ajax() 方法通过 HTTP 请求加载远程数据。

该方法是 jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性。

最简单的情况下,$.ajax() 可以不带任何参数直接使用。

注意:所有的选项都可以通过 $.ajaxSetup() 函数来全局设置。

数据类型

$.ajax() 函数依赖服务器提供的信息来处理返回的数据。如果服务器报告说返回的数据是 XML,那么返回的结果就可以用普通的 XML 方法或者 jQuery 的选择器来遍历。如果见得到其他类型,比如 HTML,则数据就以文本形式来对待。

通过 dataType 选项还可以指定其他不同数据处理方式。除了单纯的 XML,还可以指定 html、json、jsonp、script 或者 text。

其中,text 和 xml 类型返回的数据不会经过处理。数据仅仅简单的将 XMLHttpRequest 的 responseText 或 responseHTML 属性传递给 success 回调函数。

注意:我们必须确保网页服务器报告的 MIME 类型与我们选择的 dataType 所匹配。比如说,XML的话,服务器端就必须声明 text/xml 或者 application/xml 来获得一致的结果。

如果指定为 html 类型,任何内嵌的 JavaScript 都会在 HTML 作为一个字符串返回之前执行。类似地,指定 script 类型的话,也会先执行服务器端生成 JavaScript,然后再把脚本作为一个文本数据返回。

如果指定为 json 类型,则会把获取到的数据作为一个 JavaScript 对象来解析,并且把构建好的对象作为结果返回。为了实现这个目的,它首先尝试使用 JSON.parse()。如果浏览器不支持,则使用一个函数来构建。

JSON 数据是一种能很方便通过 JavaScript 解析的结构化数据。如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用 jsonp 类型。使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的 URL 后面。服务器端应当在 JSON 数据前加上回调函数名,以便完成一个有效的 JSONP 请求。如果要指定回调函数的参数名来取代默认的 callback,可以通过设置 $.ajax() 的 jsonp 参数。

注意:JSONP 是 JSON 格式的扩展。它要求一些服务器端的代码来检测并处理查询字符串参数。

如果指定了 script 或者 jsonp 类型,那么当从服务器接收到数据时,实际上是用了 <script> 标签而不是 XMLHttpRequest 对象。这种情况下,$.ajax() 不再返回一个 XMLHttpRequest 对象,并且也不会传递事件处理函数,比如 beforeSend。

发送数据到服务器

默认情况下,Ajax 请求使用 GET 方法。如果要使用 POST 方法,可以设定 type 参数值。这个选项也会影响 data 选项中的内容如何发送到服务器。

data 选项既可以包含一个查询字符串,比如 key1=value1&key2=value2 ,也可以是一个映射,比如 {key1: 'value1', key2: 'value2'} 。如果使用了后者的形式,则数据再发送器会被转换成查询字符串。这个处理过程也可以通过设置 processData 选项为 false 来回避。如果我们希望发送一个 XML 对象给服务器时,这种处理可能并不合适。并且在这种情况下,我们也应当改变 contentType 选项的值,用其他合适的 MIME 类型来取代默认的 application/x-www-form-urlencoded 。

高级选项

global 选项用于阻止响应注册的回调函数,比如 .ajaxSend,或者 ajaxError,以及类似的方法。这在有些时候很有用,比如发送的请求非常频繁且简短的时候,就可以在 ajaxSend 里禁用这个。

如果服务器需要 HTTP 认证,可以使用用户名和密码可以通过 username 和 password 选项来设置。

Ajax 请求是限时的,所以错误警告被捕获并处理后,可以用来提升用户体验。请求超时这个参数通常就保留其默认值,要不就通过 jQuery.ajaxSetup 来全局设定,很少为特定的请求重新设置 timeout 选项。

默认情况下,请求总会被发出去,但浏览器有可能从它的缓存中调取数据。要禁止使用缓存的结果,可以设置 cache 参数为 false。如果希望判断数据自从上次请求后没有更改过就报告出错的话,可以设置 ifModified 为 true。

scriptCharset 允许给 <script> 标签的请求设定一个特定的字符集,用于 script 或者 jsonp 类似的数据。当脚本和页面字符集不同时,这特别好用。

Ajax 的第一个字母是 asynchronous 的开头字母,这意味着所有的操作都是并行的,完成的顺序没有前后关系。$.ajax() 的 async 参数总是设置成true,这标志着在请求开始后,其他代码依然能够执行。强烈不建议把这个选项设置成 false,这意味着所有的请求都不再是异步的了,这也会导致浏览器被锁死。

$.ajax 函数返回它创建的 XMLHttpRequest 对象。通常 jQuery 只在内部处理并创建这个对象,但用户也可以通过 xhr 选项来传递一个自己创建的 xhr 对象。返回的对象通常已经被丢弃了,但依然提供一个底层接口来观察和操控请求。比如说,调用对象上的 .abort() 可以在请求完成前挂起请求。


摘自: w3cSchool Ajax

常见用法

我的一个简单用法(OT 中微信插件):

<button class="btn " type="button" οnclick="update('menu')" >生成自定义菜单</button>
<script type="text/javascript" charset="utf-8">
            function update(type){
                var url = "{:addons_url('Wechat://Wechatclass/update_wechat')}";
            <span style="white-space:pre">	</span>$.post(
                    url,
                    {updateType:type},
                    function(data){
                        if (data){
                            alert(data);
                        }
                        else{
                            alert('faile');
                        }
                    });
            }
</script>

其他用法(TP365):

function subRiqi(){
                    page = 1
                            $("#bankInfoModal").toggleClass("visible");
                            $(".popover").fadeOut(300);
                            activityDay = $("#statdate").val();
                            var actt = activityDay.substr(5);
                            $("#hdriqi").empty();
                            $("#hdriqi").append(actt);
                            if (activityDay == 0){
                    activityDay = "";
                    }

                    var html = "";
                            $.getJSON("{$site.WEBROOT}Preferential/index?countyId=" + countyId + "&indexSearchContent=" + indexSearchContent + "&indexCityId=" + indexCityId + "&storeSortId=" + storeSortId + "&page=" + page + "&activityDay=" + activityDay + "&specialDay=" + specialDay, function(data){
                            $(".home_information_list").empty();
                                    $.each(data, function(i, item){
                                    if (item.m_content != "折扣"){

                                    if (item.bigCount > 1){
                                    html += '<li>';
                                            html += '<a  class="km-listview-link" href={$site.WEBROOT}Preferential/storeBig?bigId=' + item.bigId + '><img class="goods" src="{$site.WEBROOT}' + item.store_icon + '"/>';
                                            html += '<div class="info"><ul> <li class="dl_name middle"> ';
                                            html += '<h1>' + item.store_name + '</h1><span class="deal_flag " >';
                                            html += '<img id="type" style="position:relative;top:3px;" src="{$site.WEBROOT}' + item.store_sort_icon + '" height="16" /></span>';
                                            html += '<span class="avatarBank"><div class="CMB" style="background: url({$site.WEBROOT}' + item.bank_icon + ');"></div></span>';
                                            html += '<span class="discount"><h2 class="location"><span class="km-icon km-location km-notext">';
                                            html += '</span>' + item.distance + 'KM</h2>' + item.m_content + '</span></li>';
                                            html += '<li class="dl_address small"><h2>' + item.store_address.substr(0, 13) + '</h2></li></ul></div></a></li>';
                                    } else{
                                    html += '<li>';
                                            html += '<a  class="km-listview-link" href={$site.WEBROOT}Preferential/info?storeId=' + item.storeId + '><img class="goods" src="{$site.WEBROOT}' + item.store_icon + '"/>';
                                            html += '<div class="info"><ul> <li class="dl_name middle"> ';
                                            html += '<h1>' + item.store_name + '</h1><span class="deal_flag " >';
                                            html += '<img id="type" style="position:relative;top:3px;"  src="{$site.WEBROOT}' + item.store_sort_icon + '" /></span>';
                                            html += '<span class="avatarBank"><div class="CMB" style="background: url({$site.WEBROOT}' + item.bank_icon + ');"></div></span>';
                                            html += '<span class="discount"><h2 class="location"><span class="km-icon km-location km-notext">';
                                            html += '</span>' + item.distance + 'KM</h2>' + item.m_content + '</span></li>';
                                            html += '<li class="dl_address small"><h2>' + item.store_address.substr(0, 13) + '</h2></li></ul></div></a></li>';
                                    }
                                    } else{
                                    if (item.bigCount > 1){
                                    html += '<li>';
                                            html += '<a  class="km-listview-link" href={$site.WEBROOT}Preferential/storeBig?bigId=' + item.bigId + '><img class="goods" src="{$site.WEBROOT}' + item.store_icon + '"/>';
                                            html += '<div class="info"><ul> <li class="dl_name middle"> ';
                                            html += '<h1>' + item.store_name + '</h1><span class="deal_flag " >';
                                            html += '<img id="type" style="position:relative;top:3px;" src="{$site.WEBROOT}' + item.store_sort_icon + '" height="16" /></span>';
                                            html += '<span class="avatarBank"><div class="CMB" style="background: url({$site.WEBROOT}' + item.bank_icon + ');"></div></span>';
                                            html += '<span class="discount"><h2 class="location"><span class="km-icon km-location km-notext">';
                                            html += '</span>' + item.distance + 'KM</h2>' + item.m_rebate + '折</span></li>';
                                            html += '<li class="dl_address small"><h2>' + item.store_address.substr(0, 13) + '</h2></li></ul></div></a></li>';
                                    } else{
                                    html += '<li>';
                                            html += '<a  class="km-listview-link" href={$site.WEBROOT}Preferential/info?storeId=' + item.storeId + '><img class="goods" src="{$site.WEBROOT}' + item.store_icon + '"/>';
                                            html += '<div class="info"><ul> <li class="dl_name middle"> ';
                                            html += '<h1>' + item.store_name + '</h1><span class="deal_flag " >';
                                            html += '<img id="type" style="position:relative;top:3px;"  src="{$site.WEBROOT}' + item.store_sort_icon + '" /></span>';
                                            html += '<span class="avatarBank"><div class="CMB" style="background: url({$site.WEBROOT}' + item.bank_icon + ');"></div></span>';
                                            html += '<span class="discount"><h2 class="location"><span class="km-icon km-location km-notext">';
                                            html += '</span>' + item.distance + 'KM</h2>' + item.m_rebate + '折</span></li>';
                                            html += '<li class="dl_address small"><h2>' + item.store_address.substr(0, 13) + '</h2></li></ul></div></a></li>';
                                    }
                                    }
                                  });
                                    $(".home_information_list").append(html);
                            });
                    }



网上的:

jQuery.post ( url, [data], [callback], [type] ) :使用POST方式来进行异步请求

参数:

url (String) : 发送请求的URL地址.

data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示。

callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。

type (String) : (可选)官方的说明是:Type of data to be sent。其实应该为客户端请求的类型(JSON,XML,等等)

这是一个简单的 POST 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。示例代码:

Ajax.aspx:

  
  
Response.ContentType  =   " application/json " ;Response.Write( " {result: ' "   +  Request[ " Name " +   " ,你好!(这消息来自服务器)'} " );
jQuery 代码:
  
  
$.post( " Ajax.aspx " , { Action:  " post " , Name:  " lulu "  },          function  (data, textStatus){              //  data 可以是 xmlDoc, jsonObj, html, text, 等等.        // this;      //  这个Ajax请求的选项配置信息,请参考jQuery.get()说到的this      alert(data.result);        },  " json " );

点击提交:

这里设置了请求的格式为"json":


$.ajax()这个是jQuery 的底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。

这里有几个Ajax事件参数: beforeSend  success  complete ,error 。 我们可以定义这些事件来很好的处理我们的每一次的Ajax请求。

 

$.ajax({
url:  ' stat.php ' ,

type: 
' POST ' ,

data:{Name:
" keyun " },

dataType: 
' html ' ,

timeout: 
1000 ,

error: 
function (){alert( ' Error loading PHP document ' );},

success: 
function (result){alert(result);}

});

摘自:博客园 jQuery $.post $.ajax用法

常见BUG

在Ajax中跳转的地址再次跳转到另一个方法时(两次请求),参数在第二个方法中获取时,注意获取参数的来源(POST,GET。。。。),不然有可能会获取不到值。代码如下:
addons_url方法:
/**
 * 插件显示内容里生成访问插件的url
 * @param string $url url
 * @param array $param 参数
 */
function addons_url($url, $param = array()){
    $url        = parse_url($url);
    $case       = C('URL_CASE_INSENSITIVE');
    $addons     = $case ? parse_name($url['scheme']) : $url['scheme'];
    $controller = $case ? parse_name($url['host']) : $url['host'];
    $action     = trim($case ? strtolower($url['path']) : $url['path'], '/');

    /* 解析URL带的参数 */
    if(isset($url['query'])){
        parse_str($url['query'], $query);
        $param = array_merge($query, $param);
    }

    /* 基础参数 */
    $params = array(
        '_addons'     => $addons,
        '_controller' => $controller,
        '_action'     => $action,
    );
    $params = array_merge($params, $param); //添加额外参数

    return U('Addons/execute', $params);
}



execute方法:
public function execute($_addons = null, $_controller = null, $_action = null){
        if(C('URL_CASE_INSENSITIVE')){
            $_addons        =   ucfirst(parse_name($_addons, 1));
            $_controller    =   parse_name($_controller,1);
        }

        $TMPL_PARSE_STRING = C('TMPL_PARSE_STRING');
        $TMPL_PARSE_STRING['__ADDONROOT__'] = __ROOT__ . "/Addons/{$_addons}";
        C('TMPL_PARSE_STRING', $TMPL_PARSE_STRING);
        if(!empty($_addons) && !empty($_controller) && !empty($_action)){
            $Addons = A("Addons://{$_addons}/{$_controller}")->$_action();
        } else {
            $this->error('没有指定插件名称,控制器或操作!');
        }
    }
    public function update_wechat() {
        $update_type = I('get.updateType');
        echo $update_type;
    }


编码心得

遇到BUG时千万不要心急,先确定肯定不会出问题的地方(最小的代码单元),然后依次查找代码源,找清楚代码的关系(继承、构造函数覆盖等等)平心静气的找BUG,一心急就完蛋喽~


~留白~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值