欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

前端之json,ajax和jsonp

程序员文章站 2022-03-22 12:43:22
前端之json,ajax和jsonp,内容包括 json, ajax, jsonp, node.js的简单使用配置。其中,还包括 首页获取用户信息并欢迎,jsonp练习-360联想词获取示例 等。 ......

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使用方法
常用参数:

  1. url 请求地址
  2. type 请求方式,默认是'get',常用的还有'post'
  3. datatype 设置返回的数据格式,常用的是'json'格式,也可以设置为'html'
  4. data 设置发送给服务器的数据
  5. success 设置请求成功后的回调函数
  6. error 设置请求失败后的回调函数
  7. 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>