JS-Ajax

Ajax

Ajax(ASynchronous JavaScript And XML)
    Ajax: 是一种在无需重新加载整个网页的情况下 能够更新部分网页的技术 通过在后台与服务器进行少量数据交换 Ajax可以使网页实现异步更新 这意味着可以在不重新加载整个网页的情况下 对网页的某部分进行更新 传统的网页(不使用Ajax)如果需要更新内容 必须重载整个网页页面 提升用户的体验
    异步和同步:客户端和服务器端相互通信的基础上
    	同步:
    		客户端必须等待服务器端的响应
            在等待的期间客户端不能做其他操作
    	异步:
    		客户端不需要等待服务器端的响应 
    		在服务器处理请求的过程中 
    		客户端可以进行其他的操作

原生Ajax发送GET请求

<body>
	<button onclick="sendAjax()">GET请求</button>
</body>

<script>
    function sendAjax(){
        //1.创建AJAX对象
        var xmlhttp = new XMLHttpRequest();

        //2.发送Ajax异步请求
        //open(method,url,async) 
        //     method 请求类型 GET POST
        //	   url 文件在服务器的位置 后台地址
        //	   async true(异步) false(同步)
        //send()
        //get请求参数可以拼接在URL后面 格式 ?键=值&键=值
        xmlhttp.open("GET", "url", true);
        xmlhttp.send();

        //3.接收后台响应的结果 JSON字符串
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            	//接收数据
                var jsonStr = xmlhttp.responseText;
                //把后台返回的JSON字符串 转换成JSON对象
                var jsonObj = JSON.parse(jsonStr);
            }
        }
	}
</script>

原生Ajax发送POST请求

<body>
	<button onclick="sendAjax()">POST请求</button>
</body>

<script>
    function sendAjax(){
        //1.创建AJAX对象
        var xmlhttp = new XMLHttpRequest();

        //2.发送Ajax异步请求
        //POST请求的请求参数 放在请求体中 
        xmlhttp.open('POST','url', true);
        //设置请求头
        xmlhttp.setRequestHeader('content-type','application/x-www-form-urlencoded');
        //POST请求参数
        xmlhttp.send('键=值','键=值');

        //3.接收后台响应的结果 JSON字符串
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                //接收数据
                var jsonStr = xmlhttp.responseText;
                //把后台返回的JSON字符串 转换成JSON对象
                var jsonObj = JSON.parse(jsonStr);
            }
        }
    }
</script>

JQuery的方式发送Ajax的GET请求

<body>
    <button>发送Ajax之get请求</button>
</body>

<script>
    $('button').click(function() {
        $.ajax({
            //请求方式
            'type': 'GET', 
            //请求路径
            'url': 'http://wthrcdn.etouch.cn/weather_mini',
            //请求参数
            'data': { 
                "city": "商洛"
            },
            //请求成功的回调函数 respData就是后台响应的JSON数据
            //JQuery已经转换成JSON对象了
            'success': function(respData) {
                var date = respData.data.yesterday.date;
            },
            //表示请求相应出现错误 会执行回调函数
            'error': function(errorData) {
                alert("出错了")
            },
            //声明后台返回的数据类型
            //设置接收到的响应数据格式
            'dataType': 'json'
        });
    });
</script>	

JQuery的方式发送Ajax的POST请求

<body>
    <button>发送Ajax之post请求</button>
</body>

<script>
    $('button').click(function() {
        $.ajax({
            //请求方式
            type: 'POST', 
            //请求路径
            url: 'http://localhost:8080/login', 
            //请求参数
            data: {
                "username": "zhangsan",
                "password": '123456'
            },
            contentType: 'application/x-www-form-urlencoded',
            //请求成功的回调函数 respData就是后台响应的JSON数据
            //JQuery已经转换成JSON对象了
            success: function(respData) {
                console.log(respData);
            },
            //表示请求相应出现错误 会执行回调函数
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                alert("出错啦...")
            },
            //声明后台返回的数据类型
            //设置接收到的响应数据格式
            'dataType': 'json'
        });
    });
</script>

简写Ajax请求

<body>
    <button>发送Ajax之GET请求</button>
    <button>发送Ajax获取后台返回的JSON数据</button>
    <button>发送Ajax之POST请求</button>
</body>

<script>
    //发送Ajax之GET请求
    $('button').first().click(function() {
        $.get('url', function(respData) {
            //respData就是后台响应的JSON数据
        }, 'json');
    });
    
    //发送Ajax之POST请求
    $('button').last().click(function() {
        $.post('http://localhost:8080/login', {
            //请求参数
        }, function(respData) {
            //respData就是后台响应的JSON数据
        }, 'json');
    });

    //发送Ajax获取后台返回的JSON数据
    $('button').eq(1).click(function() {
        $.getJSON('url', function(respData) {});

        $.getJSON('http://localhost:8080/login', {
            //请求参数
        }, function(respData) {});
    });
</script>

同源策略和跨域请求

同源策略:
	浏览器出于安全考虑提出的这种策略

跨域:
    协议相同 域名相同 端口号相同
    浏览器才不受同源策略的影响
    才可以正常的发送AJAX请求

解决跨域请求:
    方案1: 在前端编写
        JSONP:利用某些HTML标签他不受同源策略的限制
        比如 img script
        <img src="" alt="">
        具体利用script标签来发送异步请求 
        来解除同源策略的限制
        <script src=""></script>

        缺点:只支持get请求
        其他请求方式的跨域JSONP用不了

	方案2: 在后端编写
		cors

原生JS发送JSONP请求

callback=getJsonData 指定JSONP方式,回调的函数

JSONP的方式,后台在返回数据时,是这么放置的(JSON对象)
{"usename":"张三","password":"123456"}

JSONP的方式,那么后台返回的数据是这样
phone({"usename":"张三","password":"123456"})

<script type="text/javascript">
    //获取后台响应数据的回调函数名
    function phone(respData) {
        console.log(respData);
    }
</script> 

<script src="https://www.baifubao.com/callback?cmd=1059&callback=phone&phone=15850781443">
</script>

JQuery发送JSONP请求

<body>
    <button>发送JSONP请求</button>
</body>

<script>
    //指定了回调函数名 需要自己去定义函数
    //function hehe(respData) {
    //	alert(respData);
    //}
    $('button').click(function() {
        $.ajax({
            type: "GET",
            url: "url",
            //jsonp请求 回调函数名Jqurey会自动生成 
            jsonp: "callback",
            //可以指定回调函数 你指定了 就定义出这个函数就行了
            //jsonpCallback: 'hehe', 
            success: function(res) {
                console.log(res);
                alert(res.data.area);
            },
            //后台响应的数据格式
            dataType: "jsonp"
        });
    });
</script>

练习–笑话大全

请添加图片描述

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title><style>
			* {
				margin: 0;
				padding: 0;
			}

			body {
				background-color: #7500b0;
			}

			#title {
				font-size: 250%;
				color: white;
				margin-top: 5%;
				text-align: center;
				align: center;
			}

			hr {
				margin-top: 3%;
			}

			button {
				width: 13%;
				height: 50px;
				margin-left: 43.5%;
				margin-top: 3%;
				border: 0;
				border-radius: 15px;
				background-color: #410064;
				font-size: 120%;
				color: white;
				line-height: 50px;
				text-align: center;
			}

			button:hover {
				cursor: pointer;
			}

			#content {
				width: 60%;
				height: 35px;
				margin-left: 20%;
				margin-top: 3%;
				border: 0;
			}

			#content {
				margin-left: 15%;
				margin-top: 3%;
				list-style: none;
				width: 70%;
			}

			.c {
				border: 1px #340053 solid;
				height: 80px;
				color: white;
				text-align: left;
				background-color: #50007c;
			}
		</style>
	</head>
	<body>
		<div id="title">每日一笑</div>
		<hr>
		<button>来点段子</button>
		<div id="content">
			<!-- 根据代码来调整内容 -->
		</div>
	</body>
	<script>
		var btn = document.getElementsByTagName("button")[0];
		btn.onclick = function() {
			//修改按钮别点击后的文本内容
			btn.innerHTML = "再来点";
			//获取父元素->创建内容div
			var bigDiv = document.getElementById("content");
			//父元素下的子元素
			var smallDivs = document.getElementsByClassName("c");
			//清空之前看完的笑话内容
			if (smallDivs.length > 0) {
				bigDiv.innerHTML = "";
			}
			//创建Ajax对象
			var xmlhttp = new XMLHttpRequest;
			//发送异步请求 num=10 一次获取十条信息
			xmlhttp.open("GET", "https://autumnfish.cn/api/joke/list?num=10", true);
			xmlhttp.send();
			//接收后台响应的结果 JSON字符串数据
			xmlhttp.onreadystatechange = function() {
				if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
					//获取字符串数据
					var jsonStr = xmlhttp.responseText;
					var jsonObj = JSON.parse(jsonStr);
					//获取笑话内容 放在datas数组中
					var datas = jsonObj.data;
					//创建div标签 data文本 存放笑话数据
					for (let i = 0; i < datas.length; i++) {
						var smallDiv = document.createElement("div");
						smallDiv.setAttribute("class", "c");
						bigDiv.appendChild(smallDiv);
						var data = document.createTextNode(datas[i]);
						smallDiv.appendChild(data);
					}
				}
			}
		}
	</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值