freeCodeCamp 旅途18 - JSON 和 AJAX

JSON APIS and AJAX

用户界面是用来帮助人们如何使用程序,而应用编程接口(APIs)是用来帮助程序与其他程序交互。APIs 是计算机间相互通信的工具,专门用于发送和接受数据。当你理解了如何发送请求和处理数据后,你就可以在页面中使用 API 了,程序员们通常会使用 AJAX 技术来发起 API 请求。

AJAX 术语 是 Asynchronous JavaScript And XML 的首字母缩写,它不是一个单一技术,而是一系列技术的组合。它向服务器发出异步请求以传输数据,然后将返回的数据加载到页面中。正是因为 AJAX 是异步的,所以浏览器不会停止加载页面来等待服务器的响应,也无需刷新整个页面就可以将更新的数据插入页面。

异步能在多方面提升用户的体验,由于浏览器不用在渲染页面的时候等待服务器做出响应,因而页面的加载速度更快。请求和传输都在后台进行,不会中断用户当前的操作。当浏览器接受到新的数据的时候,只有特定的区域会刷新,这些特性很大程度上增强了单页应用程序的用户体验。

浏览器和服务器之间传输的数据通常使用一种叫 JSON(JavaScript Object Notation)的格式。JSON 类似于 JavaScript 的对象字面量语法,只是它是以字符串的形式传输,一旦接收,就可以将其转换成对象在脚本中使用。

JSON 和 Ajax:使用 onclick 属性处理点击事件

你希望代码仅在页面完成加载后执行。为此,你可将名为DOMContentLoaded的 JavaScript 事件附加到文档中。

document.addEventListener('DOMContentLoaded',function() { 
  // 当用户点击 id 为getMessage的元素时会触发事件
  document.getElementById('getMessage').onclick=function(){};
});

JSON 和 Ajax:通过单击事件更改文本

onclick事件处理器中添加代码,改变message元素内的文字为 "Here is the message"。

document.addEventListener('DOMContentLoaded',function(){
    document.getElementById('getMessage').onclick=function(){
      document.getElementsByClassName("message")[0].innerHTML = "Here is the message";
    }
  });

JSON 和 Ajax:使用 XMLHttpRequest 方法获取 JSON

API(或叫应用程序编程接口)是计算机用来互相通信的工具。JSON 语法与 JavaScript 对象字面符号非常相似,JSON 具有对象属性以及其当前值,夹在{}之间。

但是,JSON 是由 API 以bytes形式传输的,你的程序以string接受它。它们能转换成为 JavaScript 对象,但默认情况下它们不是 JavaScript 对象。 JSON.parse方法解析字符串并构造它描述的 JavaScript 对象。

document.addEventListener('DOMContentLoaded',function(){
    document.getElementById('getMessage').onclick=function(){
      const req = new XMLHttpRequest();
      req.open("GET", '/json/cats.json', true);
      req.send();
      req.onload = function(){
        const json = JSON.parse(req.responseText);
        document.getElementsByClassName("message")[0].innerHTML = JSON.stringify(json);
      }
    };
  });

JSON 和 Ajax:访问来自 API 的 JSON 数据

[ ] -> 方括号表示数组
{ } -> 大括号表示对象
" " -> 双引号表示字符串,它们还用于表示 JSON 中的键名

document.addEventListener('DOMContentLoaded',function(){
    document.getElementById('getMessage').onclick=function(){
      req=new XMLHttpRequest();
      req.open("GET",'/json/cats.json',true);
      req.send();
      req.onload=function(){
        json=JSON.parse(req.responseText);
        document.getElementsByClassName('message')[0].innerHTML=JSON.stringify(json);
        console.log(json[2].codeNames[1])
      };
    };
  });

JSON 和 Ajax:将 JSON 数据转换为 HTML

document.addEventListener('DOMContentLoaded',function(){
    document.getElementById('getMessage').onclick=function(){
      req=new XMLHttpRequest();
      req.open("GET",'/json/cats.json',true);
      req.send();
      req.onload=function(){
        json=JSON.parse(req.responseText);
        var html = "";
        json.forEach(function(val){
          var keys = Object.keys(val);
          html += "<div class='cat'>"
          keys.forEach(function(key){
            html += "<strong>" + key + "</strong>: " + val[key] + "<br>";
          })
          html += "</div><br>";
        });
        document.getElementsByClassName('message')[0].innerHTML=html;
      };
    };
  });

JSON 和 Ajax:渲染数据源的图像

document.addEventListener('DOMContentLoaded',function(){
    document.getElementById('getMessage').onclick=function(){
      req=new XMLHttpRequest();
      req.open("GET",'/json/cats.json',true);
      req.send();
      req.onload=function(){
        json=JSON.parse(req.responseText);
        var html = "";
        json.forEach(function(val) {
          html += "<div class = 'cat'>";
           html += "<img src='"+ val.imageLink + "' alt='" + val.altText + "'>";
           html += "</div><br>";
        });
        document.getElementsByClassName('message')[0].innerHTML=html;
      };
     };
  });

JSON 和 Ajax:预先过滤 JSON 以获得所需的数据

document.addEventListener('DOMContentLoaded',function(){
    document.getElementById('getMessage').onclick=function(){
      req=new XMLHttpRequest();
      req.open("GET",'/json/cats.json',true);
      req.send();
      req.onload=function(){
        json=JSON.parse(req.responseText);
        var html = "";
        json = json.filter(function(val){
          return (val.id !== 1);
        });
         json.forEach(function(val) {
           html += "<div class = 'cat'>"
           html += "<img src = '" + val.imageLink + "' " + "alt='" + val.altText + "'>"
           html += "</div>"
         });
         document.getElementsByClassName('message')[0].innerHTML=html;
       };
     }; 
  });

JSON 和 Ajax:根据地理位置数据找到用户的 GPS 坐标

if(navigator.geolocation){
    navigator.geolocation.getCurrentPosition(function(position){
      document.getElementById("data").innerHTML="latitude: " + position.coords.latitude + "<br>longitude: " + position.coords.longitude; 
    })
}

JSON 和 Ajax:使用 XMLHttpRequest 方法发送数据

document.addEventListener('DOMContentLoaded',function(){
    document.getElementById('sendMessage').onclick=function(){
      var userName=document.getElementById('name').value;
      var req=new XMLHttpRequest();
      req.open("POST",url,true);
      req.setRequestHeader('Content-Type','text/plain');
      req.onreadystatechange=function(){
      if(req.readyState==4 && req.status==200){
        document.getElementsByClassName('message')    [0].innerHTML=req.responseText;
      }
    };
    req.send(userName);
    };
  });
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,183评论 0 3
  •   2005 年,Jesse James Garrett 发表了一篇在线文章,题为“Ajax: A new App...
    霜天晓阅读 890评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,098评论 1 32
  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 5,202评论 2 54
  • 一、 认识Ajax 1、 初识 ajax 我们平常上网,不管是注册账号,还是浏览网页,其本质就是通过客户端向服务器...
    宠辱不惊丶岁月静好阅读 1,006评论 0 2