2019-08-21 AJAX和JSON

昨天学的有点乱 今天整理一下


AJAX

全称:Asychronous JavaScript And XML

是一种异步加载数据的技术

可以通过使用Ajax,实现页面的局部更新


Ajax 的核心对象:XMLHttpRequest

GET 取得数据

数据放到了URL
不怎么安全

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>title</title>
    </head>
    <body>
        <h1></h1>
        <script type="text/javascript">
            //1创建ajax对象
            var xhr = new XMLHttpRequest()      
            //4监听请求
            xhr.onreadystatechange = function(){
                //当xhr对象属性发生改变  就会触发
                //  onreadystate
                //0.  对象已经创建  但是没有进行初始化操作
                //2.  xhr对象已经调用了open
                //3   已经返回了部分数据
                //4   数据全部返回
                if(xhr.readyState !== 4){
                    return
                }
                if(xhr.status>=200&&xhr.status<=300){
                    //数据放在了xhr.responseText的属性中(string)
                    document.querySelector('h1').innerText = xhr.responseText
                }else{
                    console.error("请求失败")
                }           
            }
            //2打开这个对象
            xhr.open("get","test.txt",true)
            //3发送请求
            xhr.send()

            
            
        </script>
    </body>
</html>

POST 发送数据

数据放到了请求体中
可以加密 安全

下方代码块缺少本地服务器 咱也不知道咋整 先搁着吧

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <script type="text/javascript">
            //1.创建一个xhr对象
            var xhr = new XMLHttpRequest()
            //5.监听数据返回
            xhr.onreadystatechange = function(){
                if(xhr.readyState !== 4){
                    return
                }
                if(xhr.status >= 200 && xhr.status <=300){
                    var resp = JSON.parse(xhr.responseText)
                    if(resp.result){
                        alert("成功")
                    }else{
                        alert("失败")
                    }
                }else{
                    console.error("请求失败")
                }
            }
            //2.配置这个对象
            xhr.open('POST','login.php',true)
            //设定请求头  指明body内的数据是什么格式
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
            //4.发送数据
            xhr.send('user=gap&password=123456')
            //      
            
        </script>
    </body>
</html>

promise基本用法

        var promise = new Promise(function(resolve,reject){
                setTimeout(function(){
                    var num = Math.floor(Math.random()*100)
                    if(num%2 ===0 ){
                        resolve(num)
                    }else{
                        reject(num)
                    }
                },3000)
            })
            promise.then(function(num){
                console.log('resolve:' + num)
            }).catch(function(num){
                console.log('reject:'+num)
            })

回调地狱

  <!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <script type="text/javascript">
        //三个同步函数
            x = getData()
            y = getMoreData(x)
            getMoreData(y)
            
            getMoreData(function(x){
                getMoreData(x,function(y){
                    getMoreData(y,function(z){
                        //process z.
                    })
                })
            })      
        </script>
    </body>
</html>

正常的打开方式

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>444</title>
        <script src="js/jquery-3.4.1.js"></script>
    </head>
    <body>
        <p></p>

        <script type="text/javascript">
            var article = ''
            $.get("./wenzhang.txt",function(p1){
                article += p1+"<br>"
                $.get("./wenzhang1.txt",function(p2){
                    article += p2+"<br>"
                    $.get("./wenzhang2.txt",function(p3){
                        article += p3 +"<br>"
                        $('p').html(article)
                    })
                })  
            })
        </script>
    </body>
</html>

用promise解决回调地狱问题(成功了/ -

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="js/jquery-3.4.1.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        
        <p></p>
        
        <script type="text/javascript">
            function p1(){
                return new Promise(function(resolve,reject){
                    $.get('./wenzhang.txt',function(p1){
                        resolve(p1)
                    })
                })
            }
            function p2(){
                return new Promise(function(resolve,reject){
                    $.get('./wenzhang1.txt',function(p2){
                        resolve(p2)
                    })
                })
            }
            function p3(){
                return new Promise(function(resolve,reject){
                    $.get('./wenzhang2.txt',function(p3){
                        resolve(p3)
                    })
                })
            }
            function p4(){
                return new Promise(function(resolve,reject){
                    $.get('./wenzhang3.txt',function(p4){
                        resolve(p4)
                    })
                })
            }
            var article = ''
            p1().then(function(p1){
                article += p1+"<br>"
                return p2()
            }).then(function (p2){
                article += p2+"<br>"
                return p3()
            }).then(function (p3){
                article += p3+"<br>"
                return p4()
            }).then(function (p4){
                article += p4+"<br>"
                $("p").html(article)
            })  
        </script>
    </body>
</html>


ajax的同源策略

一、什么是同源?

1995年由Netscape提出,现在所有浏览器都支持这一政策。
两个不同的网站无法互相访问同源策略限制的内容。

二、如何确定两个网页同源?

三个相同:
协议相同: http://或https://
域名相同: www.baidu.com
端口号相同: 80端口(默认80端口)
只有有一个不同那将不是同源。

三、设置同源的目的

设置同源策略的⽬的:保护⽤户数据安全,⽅式信息被恶意⻚⾯获取到。
A⽹站是⼀家银⾏,⽤户登录以后,又去浏览其他⽹站。如果其他⽹站可以读取A⽹站的 Cookie,会发⽣什么?

四、同源策略限制的范围

1、Cookie、localStorage、IndexDB⽆法读取。
2、DOM⽆法取得。
3、AJAX请求不能发送。

function    addScriptTag(src) {
var script  =
document.createElement('script');
        script.setAttribute("type","text/
javascript");
        script.src  =   src;
        document.body.appendChild(script);
}
window.onload = function () {
        addScriptTag('http://example.com/
ip?callback=foo');
}
function    foo(data) {
        console.log('Your   public  IP  address 
is: ' + data.ip);
};

五、ajax规避同源策略

规避同源策略:使用jsonp或者服务器端实现跨域。
一般使用服务器端实现跨域,因为jsonp既需要设置服务器端又要设置浏览器端,成本相对较高。而服务器端则只需要设置服务器端。
1、通过jsonp实现跨域请求
1)html内容:

// 1、创建script标签
            var scriptTag = document.createElement('script');
            // 2、配置标签属性
            scriptTag.type = 'text/javascript';
            scriptTag.src = 'http://10.0.156.213/data.php?cb=fn1';

            // 3、把标签拼接进文档流
            document.head.appendChild(scriptTag);
            // 回调函数
            function fn1(obj) {
                console.log(obj);
            }

2)服务器端代码(一般使用PHP写后台代码)

image

2、通过服务器端处理跨域

var xhr=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');
            xhr.open('GET','http://wthrcdn.etouch.cn/weather_mini?city=北京',true);
            xhr.send(null);
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4&&xhr.status==200){
                    console.log(xhr.responseText);
                }
            }

请求路径上的链接地址一般是公共端口。

作者:清心挽风
链接:https://www.jianshu.com/p/3d44c22813e9
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

跨域

1.JSONP

json

JavaScript Object Notation

是一种轻量级的数据交换格式

js对象的自己 与js无缝对接

json数据与js对象的转换

1.JSON => js:JSON.parse(data)
2.JS => JSON:JSON.stringify(JSObj)

搞不懂啊

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="js/jquery-3.4.1.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <input type="text">
        <ul></ul>
        <script type="text/javascript">
            function getData(data){
                var script = document.querySelector("#jsonp")
                script.parentNode.removeChild(script)
                $("ul").html("")
                for(var i = 0;i<data.length;i++ ){
                    $("li")+data.s[i]+"</li>".appendTo("ul")
                }
            }
            function getlist(wd){
                var script = document.createElement("script")
                script.id = "jsonp"
                //?????????????
                script.src = "http://sp0.baidu.com/65d7LyCz7sGUII5tET%2Bsdui6oe%2F2sRsBlvSmv0y9R8jr8dpCl4McAB3Y3vZbOSJhfHaq/su?cb=getData&wd="+wd;
                document.body.appendChild(script)
            }
            $("input").keyup(function(){
                var wd = $(this).val()
                 getlist(wd)
            })
        </script>
    </body>
</html>


CORS 跨域资源共享

ie10以上都支持

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容