前端之json,ajax和jsonp
json
json是 javascript object notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于javascript对象的一种数据格式,目前这种数据格式比较流行,逐渐替换掉了传统的xml数据格式。
javascript对象字面量:
var oman = { name:'tom', age:16, talk:function(s){ alert('我会说'+s); } }
json格式的数据:
{ "name":"tom", "age":18 }
与json对象不同的是,json数据格式的属性名称需要用双引号引起来,用单引号或者不用引号会导致读取数据错误。
json的另外一个数据格式是数组,和javascript中的数组字面量相同。
["tom",18,"programmer"]
配置服务器环境-node.js的简单使用
c:\users\username>node -v v7.4.0 c:\users\username>e: e:\>cd e:\pycharm\pycharm_save\cp15\05前端\05jquery和js库\04jquery第四天 e:\pycharm\pycharm_save\cp15\05前端\05jquery和js库\04jquery第四天>node server.js static file server running at => http://localhost:8888/ ctrl + c to shutdown
使用node.js运行的小型服务器文件:server.js
/* nodejs static http server - http://github.com/thedigitalself/node-static-http-server/ by james wanga - the digital self licensed under a creative commons attribution 3.0 unported license. a simple, nodejs, http development server that trivializes serving static files. this server is heavily based on work done by ryan florence(https://github.com/rpflorence) (https://gist.github.com/701407). i merged this code with suggestions on handling varied mime types found at * (http://*.com/questions/7268033/basic-static-file-server-in-nodejs). to run the server simply place the server.js file in the root of your web application and issue the command $ node server.js or $ node server.js 1234 with "1234" being a custom port number" your web application will be served at http://localhost:8888 by default or http://localhost:1234 with "1234" being the custom port you passed. mime types: you can add to the mimetypes has to serve more file types. virtual directories: add to the virtualdirectories hash if you have resources that are not children of the root directory */ var http = require("http"), url = require("url"), path = require("path"), fs = require("fs") port = process.argv[2] || 8888; var mimetypes = { "htm": "text/html", "html": "text/html", "jpeg": "image/jpeg", "jpg": "image/jpeg", "png": "image/png", "gif": "image/gif", "js": "text/javascript", "css": "text/css"}; var virtualdirectories = { //"images": "../images/" }; http.createserver(function(request, response) { var uri = url.parse(request.url).pathname , filename = path.join(process.cwd(), uri) , root = uri.split("/")[1] , virtualdirectory; virtualdirectory = virtualdirectories[root]; if(virtualdirectory){ uri = uri.slice(root.length + 1, uri.length); filename = path.join(virtualdirectory ,uri); } fs.exists(filename, function(exists) { if(!exists) { response.writehead(404, {"content-type": "text/plain"}); response.write("404 not found\n"); response.end(); console.error('404: ' + filename); return; } if (fs.statsync(filename).isdirectory()) filename += '/index.html'; fs.readfile(filename, "binary", function(err, file) { if(err) { response.writehead(500, {"content-type": "text/plain"}); response.write(err + "\n"); response.end(); console.error('500: ' + filename); return; } var mimetype = mimetypes[path.extname(filename).split(".")[1]]; response.writehead(200, {"content-type": mimetype}); response.write(file, "binary"); response.end(); console.log('200: ' + filename + ' as ' + mimetype); }); }); }).listen(parseint(port, 10)); console.log("static file server running at\n => http://localhost:" + port + "/\nctrl + c to shutdown");
ajax
ajax技术的目的是让javascript发送http请求,与后台通信,获取数据和信息。ajax技术的原理是实例化xmlhttp对象,使用此对象与后台通信。ajax通信的过程不会影响后续javascript的执行,从而实现异步。
同步和异步
现实生活中,同步指的是同时做几件事情,异步指的是做完一件事后再做另外一件事,程序中的同步和异步是把现实生活中的概念对调,也就是程序中的异步指的是现实生活中的同步,程序中的同步指的是现实生活中的异步。
局部刷新和无刷新
ajax可以实现局部刷新,也叫做无刷新,无刷新指的是整个页面不刷新,只是局部刷新,ajax可以自己发送http请求,不用通过浏览器的地址栏,所以页面整体不会刷新,ajax获取到后台数据,更新页面显示数据的部分,就做到了页面局部刷新。
同源策略
ajax请求的页面或资源只能是同一个域下面的资源,不能是其他域的资源,这是在设计ajax时基于安全的考虑。特征报错提示:
xmlhttprequest cannot load https://www.baidu.com/. no 'access-control-allow-origin' header is present on the requested resource. origin 'null' is therefore not allowed access.
$.ajax使用方法
常用参数:
- url 请求地址
- type 请求方式,默认是'get',常用的还有'post'
- datatype 设置返回的数据格式,常用的是'json'格式,也可以设置为'html'
- data 设置发送给服务器的数据
- success 设置请求成功后的回调函数
- error 设置请求失败后的回调函数
- async 设置是否异步,默认值是'true',表示异步
以前的写法:
$.ajax({ url: 'js/data.json', type: 'get', datatype: 'json', data:{'aa':1} success:function(data){ alert(data.name); }, error:function(){ alert('服务器超时,请重试!'); } });
新的写法(推荐):
$.ajax({ url: 'js/data.json', type: 'get', datatype: 'json', data:{'aa':1} }) .done(function(data) { alert(data.name); }) .fail(function() { alert('服务器超时,请重试!'); }); // data.json里面的数据: {"name":"tom","age":18}
jsonp
ajax只能请求同一个域下的数据或资源,有时候需要跨域请求数据,就需要用到jsonp技术,jsonp可以跨域请求数据,它的原理主要是利用了script标签可以跨域链接资源的特性。
jsonp的原理如下:
<script type="text/javascript"> function aa(dat){ alert(dat.name); } </script> <script type="text/javascript" src="....../js/data.js"></script>
页面上定义一个函数,引用一个外部js文件,外部js文件的地址可以是不同域的地址,外部js文件的内容如下:
aa({"name":"tom","age":18});
外部js文件调用页面上定义的函数,通过参数把数据传进去。
json简单使用示例(在sever.js被node运行的条件下,有一个叫data.json的文件存储数据)
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>document</title> <script type="text/javascript" src="js/jquery-1.12.4.min.js"></script> <script type="text/javascript"> $(function () { $.ajax({ url: 'data.json', type: 'get', datatype: 'json' }) .done(function (dat) { $('#username').html(dat.name); $('#userage').html(dat.age); }) .fail(function () { alert('服务器超时!'); }) }) </script> </head> <body> <p>姓名:<span id="username"></span></p> <p>年龄:<span id="userage"></span></p> </body> </html>
生鲜首页获取json数据制作欢迎用户登录
<script type="text/javascript"> $(function () { $.ajax({ url:'js/data.json', type:'get', datatype:'json' }) .done(function(dat){ $('.user_login_btn').hide(); $('.user_info em').html(dat.name); $('.user_info').show(); }) .fail(function(){ alert('服务器超时!') }) }) </script> <body> <!-- 页面顶部 --> <div class="header_con"> <div class="header"> <div class="welcome fl">欢迎来到天天生鲜!</div> <div class="top_user_info fr"> <div class="user_login_btn fl"> <a href="">登录</a> <span>|</span> <a href="">注册</a> </div> <div class="user_info fl"> 欢迎您:<em>张三</em> </div> <div class="user_link fl"> <span>|</span> <a href="">我的购物车</a> <span>|</span> <a href="">我的订单</a> </div> </div> </div> </div> </body>
jsonp的简单使用
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>document</title> <script type="text/javascript" src="js/jquery-1.12.4.min.js"></script> <script type="text/javascript"> $.ajax({ url: 'js/data.js', type: 'get', datatype: 'jsonp', jsonpcallback: 'fnback' }) .done(function (dat) { alert(dat.name); }) </script> </head> <body> </body> </html> //data.js //fnback({'name':'tom'});
jsonp练习-360联想词获取
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>document</title> <script type="text/javascript" src="js/jquery-1.12.4.min.js"></script> <script type="text/javascript"> // https://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8 // &format=json&fields=word&word=d $(function () { $('#input01').keyup(function () { var $val = $(this).val(); $.ajax({ url: 'https://sug.so.360.cn/suggest?', type: 'get', datatype: 'jsonp', data: {'word': $val} }) .done(function (data) { //console.log(data); // 清空元素里面的内容 $('#list01').empty(); var dat = data.s; for (var i = 0; i < dat.length; i++) { var $newli = $('<li>'); $newli.html(dat[i]); $newli.appendto($('#list01')); } }) }) }) </script> </head> <body> <input type="text" name="" id="input01"> <ul id="list01"></ul> </body> </html>