jquery AJAX应用

load(url[,data][,callback])------------->通常用来从WEB服务器上获取静态的数据文件
url: string类型 请求HTML页面的URL地址
data(可选): object 发送至服务器的key/value数据
callback(可选):function 请求完成时回调函数


例子:
主页面代码:

<style type="text/css">
* { margin:0; padding:0;}
body { font-size:12px;}
.comment { margin-top:10px; padding:10px; border:1px solid #ccc;background:#DDD;}
.comment h6 { font-weight:700; font-size:14px;}
.para { margin-top:5px; text-indent:2em;background:#DDD;}
</style>



  $(function(){
      $("#send").click(function(){
              $("#resText").load("test.html .para",function (responseText, textStatus, //test.html .para为test.html中.class为para的内容XMLHttpRequest){
                         alert( $(this).html() );    //在这里this指向的是当前的DOM对象,即 $("#iptText")[0]
                         alert(responseText);       //请求返回的内容
                         alert(textStatus);            //请求状态:success,error
                         alert(XMLHttpRequest);     //XMLHttpRequest对象
            });
      })
  })

<input type="button" id="send" value="Ajax获取" />

<div  class="comment">
    已有评论:
</div>
<div id="resText" ></div>


test.html中的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div class="comment">
 <h6>张三:</h6>
 <p class="para">沙发.</p>
</div>
<div class="comment">
 <h6>李四:</h6>
 <p class="para">板凳.</p>
</div>
<div class="comment">
 <h6>王五:</h6>
 <p class="para">地板.</p>
</div>
</body>
</html>


传递方式
load()方法的传递方式根据蚕食data来自动指定。
如果没有参数传递,则采用GET方式传递;
反之,就会自动转换为POST方式

load的回调函数为function (responseText, textStatus,XMLHttpRequest))
responseText:请求返回的内容
textStatus:请求状态:success/error/notmodified/timeout4种状态
XMLHttpRequest://XMLHttpRequest对象



$.get()使用异步GET方式来进行异步请求
$.get(url[,data][,callback][,type])
url:请求的页面的URL
data(可选) object 发送服务器的Key/value数据会作为QueryString附加到请求URL中
callback(可选) function 载入成功时回调函数(只有当Response的返回状态为success才返回此函数)
type : string 服务器返回的内容的格式,包括xml/html/script/json/text和_default


<div id="resText" >


    $(function(){
       $("#send").click(function(){
            $.get("get1.php", {
                        username :  $("#username").val() ,
                        content :  $("#content").val() 
                    }, function (data, textStatus){
                        $("#resText").html(data); // 把返回的数据添加到页面上
                    }
            );
       })
    })

而get1.php中的代码
echo "<div class='comment'><h6>{$_REQUEST['username']}:</h6><p class='para'>{$_REQUEST['content']}</p></div>";


$(function(){
 $("#send").click(function(){
 $("#resText").load("get1.php?username="+$('#username').val()+"&content="+$('#content').val());
 //如果是中文需要编码
 })
 })

如果返回的类型是XML类型则要在异步的界面head文件里
header("Content-Type:text/html; charset=utf-8");//PHP
但是XML文档类型体积大和难以解析。
资源:http://json.org 了解JSON



例子:
 $("#send").click(function(){
 $.get("get3.php", {
 username : $("#username").val() ,
 content : $("#content").val()
 }, function (data, textStatus){
 var username = data.username;
 var content = data.content;
 var txtHtml = "<div class='comment'><h6>"+username+":</h6><p class='para'>"+content+"</p></div>";
 $("#resText").html(txtHtml); // 把返回的数据添加到页面上
 },"json");
 })

get3.php
<?php
    header("Content-Type:text/html; charset=utf-8");
    echo "{ username : /"{$_REQUEST['username']}/" , content : /"{$_REQUEST['content']}/"}"
?>



$.post()
POST请求则是作为HTTP消息的实体内容发送给WEB服务器
GET方式对传输的数据有大小限制(通常不能大于2KB)
POST方式传递的数据量要比GET方式大得多(理论上不受限制)

GET方式请求的数据会被浏览器缓存起来,而其他人可以从浏览器的历史记录中读取到这些数据
在某种情况下,get方式会带来严重的安全性问题,而POST方式相对于来说就可以避免这些问题


例子:
 $(function(){
 $("#send").click(function(){
 $.post("post1.php", {
  username : $("#username").val() ,
  content : $("#content").val()
  }, function (data, textStatus){
  $("#resText").html(data); // 把返回的数据添加到页面上
  }
   );
   })
   })

post1.php
<?php
    header("Content-Type:text/html; charset=utf-8");
    echo "<div class='comment'><h6>{$_REQUEST['username']}:</h6><p class='para'>{$_REQUEST['content']}</p></div>";
?>


例子2:
 $(function(){
  $("#send").click(function(){
  $.post("post2.php", {
  username : $("#username").val() ,
  content : $("#content").val()
  }, function (data, textStatus){
  var username = $(data).find("comment").attr("username");
   var content = $(data).find("comment content").text();
   var txtHtml = "<div class='comment'><h6>"+username+":</h6><p class='para'>"+content+"</p></div>";
   $("#resText").html(txtHtml); // 把返回的数据添加到页面上
   },"xml");
   })
   })

post2.php
<?php
    header("Content-Type:text/xml; charset=utf-8");
    echo "<?xml version='1.0' encoding='utf-8'?>".
         "<comments>".
         "<comment username='{$_REQUEST['username'] }' >".
         "<content>{$_REQUEST['content']}</content>".
         "</comment>".
         "</comments>";
?>

例子3:
 $(function(){
  $("#send").click(function(){
  $.post("post3.php", {
  username : $("#username").val() ,
  content : $("#content").val()
  }, function (data, textStatus){
  var username = data.username;
   var content = data.content;
   var txtHtml = "<div class='comment'><h6>"+username+":</h6><p class='para'>"+content+"</p></div>";
   $("#resText").html(txtHtml); // 把返回的数据添加到页面上
   },"json");
  })
  })

post3.php
<?php
    header("Content-Type:text/html; charset=utf-8");
    echo "{ username : /"{$_REQUEST['username']}/" , content : /"{$_REQUEST['content']}/"}"
?>

$.getScript()
有时候,在页面初次加载时就取得所需的全部JavaScript文件时完全没有必要。
$.getScript()来加载.js文件

 $(function(){
  $('#send').click(function() {
  $.getScript('test.js');//加载后自动执行JS
  });
  })

test.js内容为:
var comments = [
  {
    "username": "张三",
    "content": "沙发."
  },
  {
    "username": "李四",
    "content": "板凳."
  },
  {
    "username": "王五",
    "content": "地板."
  }
];

  var html = '';
  $.each( comments , function(commentIndex, comment) {
      html += '<div class="comment"><h6>' + comment['username'] + ':</h6><p class="para">' + comment['content'] + '</p></div>';
  })

  $('#resText').html(html);

例子:
<style type="text/css">
* { margin:0; padding:0;}
body { font-size:12px;}
.comment { margin-top:10px; padding:10px; border:1px solid #ccc;background:#DDD;}
.comment h6 { font-weight:700; font-size:14px;}
.para { margin-top:5px; text-indent:2em;background:#DDD;}
.block{width:80px;height:80px;background:#DDD;}
</style>



 $(function(){
  $.getScript('http://dev.jquery.com/view/trunk/plugins/color/jquery.color.js',function(){
  $("<p>加载JavaScript完毕</p>").appendTo("body");
  $("#go").click(function(){
  $(".block").animate( { backgroundColor: 'pink' }, 1000)
  .animate( { backgroundColor: 'blue' }, 1000);
  });
   });
   })

//jquery.color.js为jQuery官方颜色插件

<button id="go">运行</button>
<div class="block"></div>


$.getJSON()

 $(function(){
  $('#send').click(function() {
  $.getJSON('test.json', function(data) {
  $('#resText').empty();
  var html = '';
  $.each( data , function(commentIndex, comment) {
  html += '<div class="comment"><h6>' + comment['username'] + ':</h6><p class="para">' + comment['content'] + '</p></div>';
  })
   $('#resText').html(html);
   })
  })
  })

test.json
[
  {
    "username": "张三",
    "content": "沙发."
  },
  {
    "username": "李四",
    "content": "板凳."
  },
  {
    "username": "王五",
    "content": "地板."
  }
]


例子2:
   $(function(){
        $('#send').click(function() {
            $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=car&tagmode=any&format=json&jsoncallback=?",
                      function(data){
                          $.each(data.items, function( i,item ){
                                $("<img class='para'/> ").attr("src", item.media.m ).appendTo("#resText");
                                if ( i == 3 ) {
                                    return false;
                                }
                          });
                     }
            );
       })
   })


http://api.flickr.com/services/feeds/photos_public.gnetags=car&tagmode=any&format=json&jsoncallback=?
得到的内容:
({
        "title": "Recent Uploads tagged car",
        "link": "http://www.flickr.com/photos/tags/car/",
        "description": "",
        "modified": "2010-01-26T16:13:42Z",
        "generator": "http://www.flickr.com/",
        "items": [
       {
            "title": "Hwy 395 4",
            "link": "http://www.flickr.com/photos/adrianjm/4306207627/",
            "media": {"m":"http://farm5.static.flickr.com/4058/4306207627_b555857078_m.jpg"},
            "date_taken": "2010-01-26T11:13:42-08:00",
            "description": "<p><a href=/"http://www.flickr.com/people/adrianjm//">adrianjm<//a> posted a photo:<//p> <p><a

href=/"http://www.flickr.com/photos/adrianjm/4306207627//" title=/"Hwy 395 4/"><img src=/"http://farm5.static.flickr.com/4058/4306207627_b555857078_m.jpg/"

width=/"240/" height=/"160/" alt=/"Hwy 395 4/" /><//a><//p> <p>This area of the 395 (not much further north than photos Hwy 395 photos 1 and 2) is significantly

greener and flatter than that of North Eastern California. <br /> <br /> Really enjoyable drive. Clear, blue skies, and nice scenery. The road was diverse enough so

that you never got bored.<//p>",
            "published": "2010-01-26T16:13:42Z",
            "author": "[email protected] (adrianjm)",
            "author_id": "59761920@N00",
            "tags": "from road trip car oregon shot south hwy eastern 395"
       },
       {
            "title": "Parade car __D_09-12-07",
            "link": "http://www.flickr.com/photos/pamelasag61/4306947712/",
            "media": {"m":"http://farm5.static.flickr.com/4011/4306947712_0a94f2fd05_m.jpg"},
            "date_taken": "2009-12-07T21:28:16-08:00",
            "description": "<p><a href=/"http://www.flickr.com/people/pamelasag61//">pamelasag61<//a> posted a photo:<//p> <p><a

href=/"http://www.flickr.com/photos/pamelasag61/4306947712//" title=/"Parade car __D_09-12-07/"><img

src=/"http://farm5.static.flickr.com/4011/4306947712_0a94f2fd05_m.jpg/" width=/"240/" height=/"150/" alt=/"Parade car __D_09-12-07/" /><//a><//p> ",
            "published": "2010-01-26T16:12:40Z",
            "author": "[email protected] (pamelasag61)",
            "author_id": "9592695@N03",
            "tags": "man car parade"
       },
       {
            "title": "2011 Ford Mustang GT Official Pace Car of the Daytona 500",
            "link": "http://www.flickr.com/photos/dream-car-tv/4306162859/",
            "media": {"m":"http://farm5.static.flickr.com/4006/4306162859_91446da327_m.jpg"},
            "date_taken": "2010-01-26T16:50:54-08:00",
            "description": "<p><a href=/"http://www.flickr.com/people/dream-car-tv//">www.Dream-car.tv<//a> posted a photo:<//p> <p><a

href=/"http://www.flickr.com/photos/dream-car-tv/4306162859//" title=/"2011 Ford Mustang GT Official Pace Car of the Daytona 500/"><img

src=/"http://farm5.static.flickr.com/4006/4306162859_91446da327_m.jpg/" width=/"240/" height=/"135/" alt=/"2011 Ford Mustang GT Official Pace Car of the Daytona 500/"

/><//a><//p> ",
            "published": "2010-01-26T15:50:54Z",
            "author": "[email protected] (www.Dream-car.tv)",
            "author_id": "35138136@N04",
            "tags": "ford car official pace mustang 500 gt daytona 2011"
       }
        ]
})



什么是JASONP格式?


$.AJAX()方法
$.ajax(options) 改方法只有一个参数,但在这个对象里包含了$.ajax()所需要的请求设置以及回调函数,参数以Key/value的形式存在,所有的参数都是可选的。常用参数如下:

url String 发送请求的地址

type string 请求方式 默认为GET,注意其他HTTP请求方法,例如PUT和DELETE也可以使用,单仅部分浏览器支持

timeout Number 设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置

data Object或String 发送到服务器的数据。将自动转换为字符串格式。。防止这种自动转换,可以查看processData选项,对象必须为KEY/VALUE格式。
例如{foo1:"bar1",foo2:"bar2"}转换为&foo1=bar1&foo2=bar2
如果是数组,jquery将自动为不同值对应同一个名称
{foo:["bar1",bar2]}转换为&foo=bar1&foo=bar2

datatype String  预期服务器返回的数据类型。
如果不指定,jquery将自动根据http包MIME信息返回responseXML或responseText ,并作为回调参数传递。

可用的类型如下:
xml:返回XML文档,可用jquery处理

html:返回纯文本HTML信息,包含的script标签会在插入DOM时执行

script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意才远程请求时(不在同一个域下),所有POST请求都将转为GET请求

域的概念是什么?


jason:返回JASON数据

jasonp:使用SONP形式调用函数时,例如myurl?callback=?,JQUERY将自动替换后一个"?"为正确的函数名,以执行回调函数

text:返回纯文本字符串


beforeSend Function  发送请求前可用修改XMLHttpRequest对象的函数,例如添加自定义HTTP头。在beforeSend中,如果返回false,可用取消本次请求。
                     XMLHttpRequest对象是唯一的参数。 function(XMLHttpRequest){this;}

complete  Function 请求完成后调用的回调函数(请求成功或失败后均调用) function(XMLHttpRequest,textStatus){this;}

success Function 请求成功后调用的回调函数,由服务器返回,并根据datatype参数进行处理后的数据 function (data,textStatus){};

error Function    请求失败时被调用的函数  function(XMLHttpRequest ,textStatus,errorThrown){} //通常情况下textStatus,errorThrown只有其中一个包含信息

global Boolean 默认为true.表示是否触发全局ajax事件.设置为false,将不会触发全部ajax事件,AjaxStart或AjaxStop可用于控制各种Ajax事件

AjaxStart或AjaxStop是什么?




序列化元素

1.serialize()方法
如果表单元素复杂,使用ajax对数据的操作也太大,缺乏弹性。所以提供了这个方法。
该方法能够将DOM元素序列化为字符串,用于AJAX请求。

不光表单可以使用此方法,其他选择器选取的元素也都能使用它。

上面的例子改进成:
    $(function(){
       $("#send").click(function(){
            $.get("get1.php", $("#form1").serialize() , function (data, textStatus){//.serialize()也会自动将编码问题解决,实现自动转码
                        $("#resText").html(data); // 把返回的数据添加到页面上
                    }
            );
       })
    })

var $data = $(":checkbox,:radio").serialize();
返回的是check=1&check=2&check=3&check=4&radio=3,仅仅对值的序列化为字符串形式


    $(function(){
       $("#send").click(function(){
            $.get("get1.php", "username="+encodeURIComponent($('#username').val())+"&content="+encodeURIComponent($('#content').val()), function (data,

textStatus){
                        $("#resText").html(data); // 把返回的数据添加到页面上
                    }
            );
       })
    })


encodeURIComponent和escape() encodeURI()的区别是什么?
unescape  不会被此方法编码的字符: @ * / +
encodeURI() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '不会被此方法编码的字符:! * ( )
encodeURIComponent      不会被此方法编码的字符:! * ( )

因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用 escape。如果你的页面是GB2312或者其他的

编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者 encodeURIComponent。

另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。


2.serializeArray()
 该方法不是返回字符串,而是将DOM元素序列化后,返回JSON格式的数据。
   $(function(){
         var fields = $(":checkbox,:radio").serializeArray();
         console.log(fields);// Firebug输出
         $.each( fields, function(i, field){
            $("#results").append(field.value + " , ");
        });
   })


3.param()方法
它是serialize()方法的核心,用来对一个数组或对象按照key/value进行序列化。

    $(function(){
          var obj={a:1,b:2,c:3};
        var  k  = $.param(obj);
        alert(k)        // 输出  a=1&b=2&c=3
    })

返回的数据为:
a=1&b=2&c=3


JQuery中的Ajax全局事件
只要是调用JQUERY触发的Ajax的请求,就会触发公用的全局事件

Ajax请求开始时,会触发ajaxStart()
Ajax请求结束时,会触发ajaxStop()

ajaxComplete(callback) Ajax请求完成时执行的函数
ajaxEroor(callback)Ajax请求发生错误时执行的函数,捕捉到的错误可以最为最后一个参数传递
ajaxSend(callback)Ajax请求发送前执行的函数
ajaxSuccess(callback)Ajax请求成功时执行的函数

例子:
#loading{
    width:80px;
    height: 20px;
    background:#bbb;
    color:#000;
    display:none;
}

<div id="loading">加载中...</div>


//共用这2个全局的ajax事件
       $("#loading").ajaxStart(function(){
          $(this).show();
       });
       $("#loading").ajaxStop(function(){
          $(this).hide();
       });


例子2:
$("status",xml)方法 通知jQuery去XML文档中寻找"status"标签。
$("status",xml).text() 寻找"status"标签的值


<style type="text/css">
        body{
           margin:0;
           padding:0;
           font-size:12px;
        }
        #messagewindow {
            height: 250px;
            border: 1px solid;
            padding: 5px;
            overflow: auto;
        }
        #wrapper {
            margin: auto;
            width: 438px;
        }
    </style>


<div id="wrapper">
        <p id="messagewindow"><span id="loading">加载中...</span></p>
        <form id="chatform" action="#">
            姓名: <input type="text" id="author" size="50"/><br />
            内容: <input type="text" id="msg"  size="50"/>   <br />
            <input type="submit" value="发送" /><br />
        </form>
    </div>

    $(function(){
            //定义时间戳
            timestamp = 0;
            //调用更新信息函数
            updateMsg();
            //表单提交
            $("#chatform").submit(function(){
                $.post("backend.php",{
                            message: $("#msg").val(),
                            name: $("#author").val(),
                            action: "postmsg",
                            time: timestamp
                        }, function(xml) {
                    //清空信息文本框内容
                    $("#msg").val("");
                    //调用解析xml的函数
                    addMessages(xml);
                });
                return false; //阻止表单提交
            });
        });
        //更新信息函数,每隔一定时间去服务端读取数据
        function updateMsg(){
            $.post("backend.php",{ time: timestamp }, function(xml) {
                //移除掉 等待提示
                $("#loading").remove();
                //调用解析xml的函数
                addMessages(xml);
            });
             //每隔4秒,读取一次.
            setTimeout('updateMsg()', 4000);
        }
        //解析xml文档函数,把数据显示到页面上
        function addMessages(xml) {
            //如果状态为2,则终止
            if($("status",xml).text() == "2") return;
            //更新时间戳
            timestamp = $("time",xml).text();
            //$.each循环数据
            $("message",xml).each(function() {
                var author = $("author",this).text(); //发布者
                var content = $("text",this).text();  //内容
                var htmlcode = "<strong>"+author+"</strong>: "+content+"<br />";
                $("#messagewindow").prepend( htmlcode ); //添加到文档中
            });
        }



php的内容
 <?php
// 配置信息:
// 1,数据库连接的具体信息
// 2,我们要存储的消息的数目
// 3,用户进到聊天室的时候消息显示的数目
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "123456";
$dbname = "chat";
$store_num = 10;
$display_num = 10;

// 错误报告
error_reporting(E_ALL);

// 头部信息
header("Content-type: text/xml;charset=gb2312");
header("Cache-Control: no-cache");


//连接mysql
$dbconn = mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname,$dbconn);

//为容易操作请求数据,我们为请求中的每个参数设置一个变量,每个变量将把请求中的参数值作为其自己的值
//foreach语句遍历所有的POST数据,并且为每个参数创建一个变量,并且给它赋值
foreach($_POST as $key => $value){
    $$key = mysql_real_escape_string($value, $dbconn);
}
 
//屏敝任何错误提示,判断action是否等于 postmsg
if(@$action == "postmsg"){
    //插入数据
 
    mysql_query("INSERT INTO messages (`user`,`msg`,`time`)
                 VALUES ('$name','$message',".time().")",$dbconn);
    //删除数据(因为我们默认值存储10条数据)
    mysql_query("DELETE FROM messages WHERE id <= ".
                (mysql_insert_id($dbconn)-$store_num),$dbconn);
}

//查询数据
$messages = mysql_query("SELECT user,msg
                         FROM messages
                         WHERE time>$time
                         ORDER BY id ASC
                         LIMIT $display_num",$dbconn);
//是否有新记录
if(mysql_num_rows($messages) == 0) $status_code = 2;
else $status_code = 1;

//返回xml数据结构
echo "<?xml version=/"1.0/"?>/n";
echo "<response>/n";
echo "/t<status>$status_code</status>/n";
echo "/t<time>".time()."</time>/n";
if($status_code == 1){ //如果有记录
    while($message = mysql_fetch_array($messages)){
        $message['msg'] = htmlspecialchars(stripslashes($message['msg']));
        echo "/t<message>/n";
        echo "/t/t<author>$message[user]</author>/n";
        echo "/t/t<text>$message[msg]</text>/n";
        echo "/t</message>/n";
    }
}
echo "</response>";
?>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章