• jQuery之ajax数据交互(语法及示例)


    一、jajx基础语法

     1.1写法 $.ajax({
           url:'地址',
           data:{
           参数:xxx,  
           参数:xxx
           },
          type:'POST/GET',
          success:function(str){ //成功回调函数
           alert(str);
           },
          error:function (err){ //失败回调函数
           alert(err);
           }
          });

    其中,data:{}是传输数据用的,后台的PHP程序接收并处理对应的数据。

    例:

     1 $('.login').click(function (){
     2     $.ajax({
     3         url:'post.php',
     4         data:{
     5             user:$('.user').val(),
     6             pass:$('.pass').val()
     7         },
     8         type:'POST',
     9         success:function(str){
    10             alert(str);
    11         },
    12         error:function (err){
    13             alert(err);
    14         }
    15     });
    16 });

    此段代码,传输了用户输入的用户名和密码。

    PHP的处理:

    <?php
    $user=$_POST["user"];
    $pass=$_POST["pass"];
    
    if($user=="abc"&&$pass=="123"){
        echo "登录成功";
    }else{
        echo "用户名或者密码错误";
    }
    ?>

    校验用户名和密码,并返回对应的结果。

    1.2上传数据:onload

      HTML:

    <input type="file" />

      JAVASCRIPT:

    1 window.onload=function (){
    2     var oInp=document.body.children[0];
    3     
    4     oInp.onchange=function (){
    5         SomeJavaScriptCode;
    6     }
    7 };

    1.3  ajax交互分4步
      1)填写地址
      2)返回结果
      3)解析结果
      4)展示数据

     

    二、ajax的应用

    1.仿爱奇艺官网『今日焦点』板块的红框部分(简版)

    制作要求:用ajax方式传输数据到页面(自制一个假数据库)

    涉及部分知识点:eval  字符串转数组    *eval 解析json有问题  必须加括号

     HTML代码如下:

    <ul></ul>

    *版本1:每行只有一个标题

    假数据库a.txt写法:

    [{href:"http://www.baidu.com/",img:"img/4.jpg",text:"文字介绍111"},{href:"http://www.taobao.com/",img:"img/8.jpg",text:"文字介绍222"},{href:"http://www.taobao.com/",img:"img/8.jpg",text:"文字介绍222"}]

    jQ代码如下(写在<ul>下面,body里面):

     1 $.ajax({
     2     url:'a.txt',
     3     success: function(str){
     4         var arr=eval('('+str+')');        //把字符串转成数组
     5 //        alert(typeof str);
     6         $(arr).each(function(index, element) {    //循环有多少条数据
     7             //有多少条数据就创建多少个li
     8             $('<li>'
     9                 +'<a href="'+$(arr).get(index).href+'">'
    10                     +'<img src="'+$(arr).get(index).img+'" />'
    11                     +'<p>'+$(arr).get(index).text+'</p>'
    12                 +'</a>'
    13             +'</li>').appendTo('.ul1');
    14         });
    15     }
    16 });

    ——————————我是拓展内容的分割线——————————

    如果HTML里面有多个 <ul></ul> ,现在想在多个 <ul></ul> 里面插入不同的内容,如果不封装的话是这样来实现的:

     1 $.ajax({
     2     url:'a.txt',
     3     success: function(str){
     4         var arr=eval('('+str+')');        //把字符串转成数组
     5         $(arr).each(function(index, element) {    //循环有多少条数据
     6             //有多少条数据就创建多少个li
     7             $('<li>'
     8                 +'<a href="'+$(arr).get(index).href+'">'
     9                     +'<img src="'+$(arr).get(index).img+'" />'
    10                     +'<p>'+$(arr).get(index).text+'</p>'
    11                 +'</a>'
    12             +'</li>').appendTo('.ul1');
    13         });
    14     }
    15 });
    16 $.ajax({
    17     url:'b.txt',
    18     success: function(str){
    19         var arr=eval('('+str+')');        //把字符串转成数组
    20 
    21         $(arr).each(function(index, element) {    //循环有多少条数据
    22             //有多少条数据就创建多少个li
    23             $('<li>'
    24                 +'<a href="'+$(arr).get(index).href+'">'
    25                     +'<img src="'+$(arr).get(index).img+'" />'
    26                     +'<p>'+$(arr).get(index).text+'</p>'
    27                 +'</a>'
    28             +'</li>').appendTo('.ul2');
    29         });
    30     }
    31 });

    这样写两遍相同的代码,代码就过于冗长。这时就需要把两段代码封装起来。

    封装需要制定函数的名字(方便调用),需要指定给函数传那些参数(obj和url)。

    封装之后的写法:

     1 <script>
     2 function newsList(obj,url){
     3     $.ajax({
     4         url:url,
     5         success: function(str){
     6             var arr=eval('('+str+')');        //把字符串转成数组
     7             
     8             $(arr).each(function(index, element) {    //循环有多少条数据
     9                 //有多少条数据就创建多少个li
    10                 $('<li>'
    11                     +'<a href="'+$(arr).get(index).href+'">'
    12                         +'<img src="'+$(arr).get(index).img+'" />'
    13                         +'<p>'+$(arr).get(index).text+'</p>'
    14                     +'</a>'
    15                 +'</li>').appendTo(obj);
    16             });
    17         }
    18     });
    19 }
    20 newsList('.ul1','a.txt');
    21 newsList('.ul2','b.txt');
    22 </script>

    封装了函数,如果想执行,就调用并向里面传参数obj和url,传两次就执行了两次。

    —————————————拓展完毕—————————————

    *版本2:每行有多个标题,在数据库中两个新闻的标题和内容是写在一个json里面的,把这一个json拆分,并分成多个标题显示在页面上。

    假数据库a.txt写法:(不允许手动换行,只能自动换行,这里为了阅读方便使用了手动换行)

     [{href:"http://www.baidu.com/",text:"男子被骗子追债"},
      {href:"http://www.baidu.com/",text:"男子被骗子追债"},
      {href:"http://www.baidu.com/",text:"男子被骗子追债"},
      {href:"http://www.baidu.com/",text:"男子被骗子追债"},
      {href:["http://www.baidu.com/","http://www.jd.com/","http://www.taobao.com/"],text:["男子被骗子追债","男子被骗子追债2","男子被骗子追债3"]}]

     jQ代码:

     1 $.ajax({
     2     url:'a.txt',
     3     success: function(str){
     4         var arr=eval('('+str+')');                  //把字符串转成数组
     5         
     6         $(arr).each(function(index, element) {     //循环有多少条数据
     7             //有多少条数据就创建多少个li
     8             var oLi=$('<li></li>').appendTo('ul');
     9 //            alert(typeof $(arr)[index].href);   弹出每项的数据类型,如果只有一项就是字符串,有两项就是object
    10             if(typeof $(arr)[index].href=='string'){
    11                 $('<a href="'+$(arr)[index].href+'">'+$(arr)[index].text+'</a>').appendTo(oLi);
    12             }else{
    13                 var arrHref=$(arr)[index].href;
    14                 for(var i=0; i<arrHref.length; i++){   //循环下标
    15                     $('<a href="'+$(arr)[index].href[i]+'">'+$(arr)[index].text[i]+'</a>').appendTo(oLi);
    16 
    17                 }
    18             }
    19         });
    20     }
    21 });

    在14行循环下标的时候使用了js的for循环,而没有使用jQ的each循环,因为for循环更容易看懂,使用each会添加i , k两个新变量,理解起来的难度会增加一些。使用each的写法如下:

     1 $.ajax({
     2     url:'a.txt',
     3     success: function(str){
     4         var arr=eval('('+str+')');
     5         
     6         $(arr).each(function(index, element) {
     7             var oLi=$('<li></li>').appendTo('ul');
     8             
     9             if(typeof $(arr)[index].href=='string'){
    10                 $('<a href="'+$(arr)[index].href+'">'+$(arr)[index].text+'</a>').appendTo(oLi);
    11             }else{
    12                 var arrHref=$(arr)[index].href;
    13                 $(arrHref).each(function(i, k) {
    14                     $('<a href="'+k+'">'+$(arr)[index].text[i]+'</a>').appendTo(oLi);
    15                 });
    16             }
    17         });
    18     }
    19 });

    2.仿爱奇艺banner图部分(简版)

    3.仿微博热门话题的部分(简版)

    要点:点击换一换按钮之后,要从数据库中随机抽出一些内容来展示,需要用到随机数的方法。

    HTML代码:

    <input class="change" type="button" value="换一换" />
    <ul></ul>

    jQ代码:

     1 function change(){
     2     $.ajax({
     3         url:'b.txt',
     4         success: function(str){
     5             $('ul').html('');    //先清空,在添加,否则每次添加都会添加到原有内容的后面了
     6             
     7             var arr=eval('('+str+')');
     8             
     9             arr.sort(function (){
    10                 return Math.random()-0.3;
    11             });
    12             
    13             for(var i=0; i<3; i++){
    14                 $('<li><a href="'+$(arr)[i].href+'">'+$(arr)[i].text+'</a><span>'+$(arr)[i].count+'</span></li>').appendTo('ul');
    15             }
    16             
    17             
    18         }
    19     });
    20 }
    21 change();   //这句的意思是:在打开网页的时候就运行一次change函数,否则在刚打开网页的时候页面是空白的,需要点击一下才可以加载内容。
    22 $('.change').click(change);

    三、jsonp基础语法

    jsonp的作用:从别人的服务器获取数据,就用jsonp方法

      例如:让用户通过微信账户登录自己的APP、让用户通过微博账号登录自己的网站,我们就可以用jsonp的方法来从微博/微信的服务区获取需要的信息。

    举例:在百度的搜索框,输入关键词之后,会自动弹出其他推荐的联想词。我们来看看这个联想词的数据是从哪里调用出来的。

    通过su?wd=……这个文件我们可以看到,比如我们搜索关键字a,百度就会从 https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&json=1&p=3&sid=1452_21125_19898_20929&req=2&csor=1&cb=jQuery110209266088668740502_1490508233752&_=1490508233755  

    这个地址来调用a相关的联想词。

    打开这个网址,显示的信息如下:

    精简一下这个网址,提取出我们想要的联想词信息。

    https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&json=1&p=3&sid=1452_21125_19898_20929&req=2&csor=1&cb=jQuery110209266088668740502_1490508233752&_=1490508233755

    其中,wd=a的意思是关键词是a,删除蓝字部分,让最后的cb=show

    网址精简成:

    https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=show

    cb就是callback的缩写,是返回的数据,这里我们把这个返回的数据命名为show

    访问这个网址,显示如下:

    让页面弹出联想词,我们可以使用如下语句:

    1 <script>
    2 function show(json){
    3     alert(json.s);
    4 }
    5 </script>
    6 <script src="https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=show"></script>

    第六行的作用就是调用show函数,相当于在线版本的show()。

    几个json原生写法及jQ写法的例子

    1.显示关键字成龙的联想词

    1 <script>
    2 window.sogou={
    3     sug:function (){
    4         alert(arguments[0][1]);
    5     }
    6 }
    7 </script>
    8 <script src="https://www.sogou.com/suggnew/ajajjson?key=成龙&type=web"></script>

    2.利用搜狗的数据,制作一个实时的搜索联想词显示页面

     1 <body>
     2     <input type="text" value="" id="txt" />
     3     <ul id="ul"></ul>
     4 <script>
     5 var oTxt=document.getElementById('txt');
     6 var oUl=document.getElementById('ul');
     7 
     8 window.sogou={
     9     sug:function (arr){
    10         for(var i=0; i<arr[1].length; i++){
    11             var oLi=document.createElement('li');
    12             oLi.innerHTML=arr[1][i];
    13             oUl.appendChild(oLi);
    14         }
    15     }
    16 };
    17 
    18 oTxt.oninput=function (){
    19     oUl.innerHTML='';
    20     var oS=document.createElement('script');
    21     oS.src='https://www.sogou.com/suggnew/ajajjson?key='+oTxt.value+'&type=web';
    22     document.body.appendChild(oS);
    23 }
    24 </script>
    25 </body>

    3.利用jQ弹出百度搜索的a的联想词

     1 $.ajax({
     2     url:'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',
     3     data:{
     4         wd:'a'
     5     },
     6     jsonp:'cb',
     7     dataType:'jsonp',
     8     success: function(json){
     9         alert(json.s);
    10     }
    11 });

    4.利用jQ弹出搜狗的联想词

     1 $.ajax({
     2     url:'https://www.sogou.com/suggnew/ajajjson',
     3     data:{
     4         key:'a',
     5         type:'web'
     6     },
     7     dataType:'jsonp',
     8     jsonp:'callBack',
     9     success:function(){
    10     },
    11     error:function (){
    12     }
    13 });

    四、字符串和json相互转换

    4.1字符串转json

     1 <script>
     2 var str='https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=show';
     3 var arr=str.split('?');
     4 
     5 var url=arr[0];
     6 
     7 var arr2=arr[1].split('&');
     8 
     9 var json={};
    10 
    11 for(var i=0; i<arr2.length; i++){
    12     var arr3=arr2[i].split('=');
    13     
    14     json[arr3[0]]=arr3[1];
    15 }
    16 
    17 console.log(json);
    18 </script>

    4.2json转字符串

     1 <script>
     2 //a=1&b=2
     3 var json={a:1,b:2};
     4 
     5 var arr=[];
     6 
     7 for(var name in json){
     8     arr.push(name+'='+json[name]);
     9     //a=1,b=2
    10 }
    11 
    12 var str=arr.join('&');
    13 
    14 alert(str);
    15 </script>
  • 相关阅读:
    Kafka usecase
    kafka 的quick start(windows平台)
    kafka介绍
    问题记录 为ubuntu16.04添加windows字体(解决JIRA图表乱码的问题)
    问题记录,如何解决confluence的office预览的时候的乱码问题
    为gitlab10.x增加使用remote_user HTTP头的方式登录
    基于spring-cloud的微服务(4)API网关zuul
    基于spring-cloud的微服务(3)eureka的客户端如何使用IP地址来进行注册
    基于spring-cloud的微服务(2) eureka服务提供方的注册和消费方的消费
    WebView 上传文件 WebChromeClient之openFileChooser函数
  • 原文地址:https://www.cnblogs.com/cnyaokai/p/6617320.html
Copyright © 2020-2023  润新知