JavaScript-day43

Day43 插件、Ajax、JSON、扫雷

1. 插件

1.1 概述
插件是对功能的扩展 ,比如jQuery中没有的,或者是对已有的进行扩展,都是插件
不同的插件完成不同的功能,

jquery不可能包含所有的功能,我们可以通过插件扩展jquery的功能。
jquery有着丰富的插件,使用这些插件能给jquery提供一些额外的功能。
注意,如果需要引入的插件,是基于jQuery的插件,则我们再使用时,必须先引入jQuery,再引入插件,再进行编码

1.2 jQuery.color.js
Animate中,不能进行颜色操作,该插件就可以解决这个问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #dv{
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script src="./js/jquery.color.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                $("#dv").animate({
                    width:"300px",
                    'background-color':'green'
                },500);
            });
        });
    </script>
</head>
<body>
    <button id="btn">按钮</button>
    <div id="dv"></div>
</body>
</html>

只需要引入color的js 即可,否则颜色是不能动画设置的
1.3 jQuery.lazyload.js
很多网站都会用到‘图片懒加载’这种方式对网站进行优化,即延迟加载图片或符合某些条件才开始加载图片。
懒加载原理:浏览器会自动对页面中的img标签的src属性发送请求并下载图片。通过动态改变img的src属性实现。它可以延迟加载长页面中的图片在浏览器可视区域外,图片不会被载入,直到用户将页面滚动到它们所在的位置。
与图片预加载的处理方式相反,在包含很多大图片长页面中延迟加载图片可以加快页面加载速度,尤其是移动端。浏览器将会在加载可见图片之后即进入就绪状态,在淘宝商品详情页、漫画网站很多图片的情况下还可以帮助降低服务器负担。

<script src="jquery.min.js"></script>
<script src="jquery.lazyload.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 3000px;
        }
    </style>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script src="./js/jquery.lazyload.min.js"></script>
    <script>
        $(function(){
            // 滚动条到图片的时候,就自动加载
            $("img").lazyload();
        });
    </script>
</head>
<body>
    <div></div>
    <img data-original="./images/1.jpg" alt="">
</body>
</html>

1.4 日历插件

<!DOCTYPE html
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>js网页日期插件</title>

	<script src="./js/jquery-1.11.1.min.js"></script>
	<script type="text/javascript" src="js/laydate.js"></script>
	<script type="text/javascript">
		$(function () {
			laydate.skin('dahong');//切换皮肤,请查看skins下面皮肤库
			$('#date').click(function () {
				laydate({
					elem: '#date',
					format: 'YYYY年MM月DD日 hh:mm:ss',
					festival: true, //显示节日
					istime: true, // 显示时间
					choose: function (datas) { //选择日期完毕的回调
						// alert('得到:' + datas);
					}
				});
			});

			function a(){
				x = 222;
			}
			// ---------
		});


	</script>
</head>

<body>
	<input placeholder="请输入日期" readonly id='date' class="laydate-icon">

</body>

</html>

2. JS-Ajax

2.1 概述
2.1.1 老版本ajax请求
代web程序最初的目的就是将信息(数据)放到公共服务器上,让所有的网络用户都可以通过浏览器访问。
在这里插入图片描述
我们一般都是通过以下方式让浏览器发送服务器请求,获得服务器数据
1、地址栏输入地址
2、特定元素的href 或者src属性
3、表单提交

弊端:这些方案我们很难通过代码的方式进行编程,而且每次请求都会刷新网
2.1.2 什么是ajax
1、AJAX( Asynchronous JavaScript and XML)异步的 JavaScript 和 XML。
2、AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
3、AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
4、AJAX 可以使网页实现异步更新
5、AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
在这里插入图片描述
在这里插入图片描述
2.1.3 异步和同步
我们在使用 ajax 一般都会使用异步处理。
异步处理呢就是我们通过事件触发到 ajax,请求服务器,在这个期间无论服务器有没有响应,客户端的其他代码一样可以运行。
同步处理:我们通过实践触发 ajax,请求服务器,在这个期间等待服务器处理请求, 在这个期间客户端不能做任何处理。当 ajax 执行完毕才会继续执行其他代码。
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕同步需要等待返回结果才能继续,异步不必等待,一般需要监听异步的结果
同步是在一条直线上的队列,异步不在一个队列上 各走各的
jquery 的 async:false,这个属性
默认是true:异步,false:同步。举例:
同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到忙完才去吃饭。
2.1.4 运行机制
在这里插入图片描述
2.2 代码模板

 /**
         *  1 获取ajax引擎对象 XMLHttpRequest
         *  2 配置请求连接的URL,代表浏览器要发出的请求以及目的地,还有就是是否异步
         *      这个请求不是直接发送,而是配置给ajax引擎,有它去发送
         *  3 监视XMLHttpRequest对象的请求流程,根据不同的请求结果,做出不同的响应
         *  4 发送请求,上面都是准备,这里才是真正的发送
         */
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function () {
            var btn = document.getElementById("btn");
            btn.onclick = function () {
        /**
         *  1 获取ajax引擎对象 XMLHttpRequest
         *  2 配置请求连接的URL,代表浏览器要发出的请求以及目的地,还有就是是否异步
         *      这个请求不是直接发送,而是配置给ajax引擎,有它去发送
         *  3 监视XMLHttpRequest对象的请求流程,根据不同的请求结果,做出不同的响应
         *  4 发送请求,上面都是准备,这里才是真正的发送
         */
                // 1 获取ajax引擎对象 XMLHttpRequest
                var xmlhttp;
                if (window.XMLHttpRequest) {
                    // code for IE7+, Firefox, Chrome, Opera, Safari
                    xmlhttp = new XMLHttpRequest();
                } else {
                    // code for IE6, IE5
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
                // 2 配置请求连接的URL
                xmlhttp.open("GET", "text.txt", true);
                // 3 监听请求状态
                xmlhttp.onreadystatechange = function () {
                    // 为4 和 200 说明请求成功
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                        document.getElementById("saveData").innerHTML = xmlhttp.responseText;
                    }
                }

                // 4 发送请求
                xmlhttp.send();
                // post请求 如果需要传递参数 必须设置请求头
                // xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                // 参数 键=值&键=值
                // xmlhttp.send("fname=Bill&lname=Gates");
            }
        }


    </script>
</head>

<body>
    <button id="btn">获取数据</button>
    <div id="saveData"></div>
    <input type="text" name="" id="">
</body>

</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.3 代码应用
更改URL和请求方式,以及是否异步

  // 2 配置请求连接的URL
    xmlhttp.open("GET", "test.xml", true);

更改请求成功或者失败后要做的事

// 为4 和 200 说明请求成功
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200)

如果是get请求,这里不用动,如果是post请求 就需要更改

  // 4 发送请求
     xmlhttp.send();

更改为这样

xmlhttp.setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);
xmlhttp.send(“fname=Bill&lname=Gates”);
只需要更改传递的参数即可

 // post请求 如果需要传递参数 必须设置请求头
// xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// 参数 键=值&键=值
// xmlhttp.send("fname=Bill&lname=Gates");

2.4 注意
不支持file协议
在这里插入图片描述
我们应该这样运行
右键,浏览器打开
2.5 responseText和responseXML
2.5.1 responseText
在这里插入图片描述
responseText 是可以接收任何数据的,因为数据都是以字符串进行传递,不管你是什么格式,用responseText接收到,都是字符串
比如接收到的是json/xml等 我们一般会再次把这个字符串转换为对应的对象进行操作
大部分情况我们都是用json进行操作
在这里插入图片描述
在这里插入图片描述
2.5.2 responseXML

如果返回的是xml格式的字符串,并且我们需要以DOM的方式来操作这些XML标签,那么就直接使用responseXML 会自动把XML格式的字符串转换为对象
在这里插入图片描述

<users>
    <user>
        <id>1</id>
        <name>张三</name>
    </user>
    <user>
        <id>2</id>
        <name>李四</name>
    </user>
</users>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function () {
            var btn = document.getElementById("btn");
            btn.onclick = function () {
                /**
         *  1 获取ajax引擎对象 XMLHttpRequest
         *  2 配置请求连接的URL,代表浏览器要发出的请求以及目的地,还有就是是否异步
         *      这个请求不是直接发送,而是配置给ajax引擎,有它去发送
         *  3 监视XMLHttpRequest对象的请求流程,根据不同的请求结果,做出不同的响应
         *  4 发送请求,上面都是准备,这里才是真正的发送
         */
                // 1 获取ajax引擎对象 XMLHttpRequest
                var xmlhttp;
                if (window.XMLHttpRequest) {
                    // code for IE7+, Firefox, Chrome, Opera, Safari
                    xmlhttp = new XMLHttpRequest();
                } else {
                    // code for IE6, IE5
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
                // 2 配置请求连接的URL
                xmlhttp.open("GET", "test.xml", true);
                // 3 监听请求状态
                xmlhttp.onreadystatechange = function () {
                    // 为4 和 200 说明请求成功
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                        // 得到XML格式的字符串
                        console.log(xmlhttp.responseText);
                        // 得到DOM对象
                        console.log(xmlhttp.responseXML);
                        // 得到DOM对象,最大的是Users
                        var xmlObj = xmlhttp.responseXML;
                        // 获取users下的所有user
                        var users = xmlObj.getElementsByTagName("user");
                        console.log(users);
                        // 遍历user,获取里面的ID和Name标签内容
                        for(var i = 0; i < users.length; i++){
                            // 获取ID标签对象
                            var idObj = users[i].getElementsByTagName('id')[0];
                            // 获取name标签对象
                            var nameObj = users[i].getElementsByTagName("name")[0];
                            // 获取ID标签中的内容
                            var idValue = idObj.innerHTML;
                            var nameValue = nameObj.innerHTML;
                            // 拼接格式
                            var  str = idValue+" : "+nameValue+" <br>";
                            document.getElementById("saveData").innerHTML += str;
                        }
                       // document.getElementById("saveData").innerHTML = xmlhttp.responseText;
                    }
                }

                // 4 发送请求
                xmlhttp.send();
                // post请求 如果需要传递参数 必须设置请求头
                // xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                // 参数 键=值&键=值
                // xmlhttp.send("fname=Bill&lname=Gates");
            }
        }


    </script>
</head>

<body>
    <button id="btn">获取数据</button>
    <div id="saveData"></div>
    <input type="text" name="" id="">
</body>

</html>

2.6 案例-三级联动
思路 :
1 三个下拉列表,省,市,县
2 绑定onchange事件,发生更改触发
3 打开页面默认加载所有省份,并显示在省下拉列表中
4 当省下拉列表发生更改时,加载对应的城市,显示在市下拉列表中
5 当市下拉列表发生更改时,加载对应的区县,并显示在县下拉列表中

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = init;
        function init() {
            /**
             * 思路 : 
                    1 三个下拉列表,省,市,县
                    2 绑定onchange事件,发生更改触发
                    3 打开页面默认加载所有省份,并显示在省下拉列表中
                    4 当省下拉列表发生更改时,加载对应的城市,显示在市下拉列表中
                    5 当市下拉列表发生更改时,加载对应的区县,并显示在县下拉列表中
             */
            // 打开页面默认加载所有省份,并显示在省下拉列表中
            initProvince();
            var pn = document.getElementById('province');
            pn.onchange = getCities;
            // 市下拉列表
            var c = document.getElementById('city');
            c.onchange = getCounties;
        }
        // 加载省
        function initProvince() {
            // 1 ajax引擎
            var xhr = createXMLHttrRequest();
            // 2 配置
            xhr.open('GET', 'Area.xml', true);
            // 3 监听
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    // console.log(xhr.responseXML);
                    // 文档对象
                    var xmlDoc = xhr.responseXML;
                    // 获取省
                    var pns = xmlDoc.getElementsByTagName("province");
                    // 省下拉列表
                    var pn = document.getElementById('province');

                    // 遍历所有的省份,拼成option
                    // <option value="北京">北京</option>
                    var nodes = '';
                    for (var i = 0; i < pns.length; i++) {
                        var nameValue = pns[i].getAttribute('name');
                        nodes += '<option value="' + nameValue + '">' + nameValue + '</option>';
                    }
                    // 设置到省下拉列表中
                    pn.innerHTML += nodes;

                }
            }

            // 4 发送请求
            xhr.send();
        }

        // 省下拉列表事件,用于获取城市
        function getCities() {
            var c = document.getElementById('county');
            // 清空原内容,只保留一个
            c.options.length = 1;
             // 市下拉列表
             var c = document.getElementById('city');
            // 清空原内容,只保留一个
            c.options.length = 1;
      
            // 如果点击的是北京 this.value 就是北京
            // console.log(this.value);
            var optionValue = this.value;
            if (optionValue == 1) {
                return;
            }
            // 1 ajax引擎
            var xhr = createXMLHttrRequest();
            // 2 配置
            xhr.open('GET', 'Area.xml', true);
            // 3 监听
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    // console.log(xhr.responseXML);
                    // 文档对象
                    var xmlDoc = xhr.responseXML;
                    // console.log(xmlDoc.querySelector('province[name="'+optionValue+'"]'));
                    // 获取省
                    var pn = xmlDoc.querySelector('province[name="' + optionValue + '"]');
                    // 获取所有城市
                    var cs = pn.getElementsByTagName('city');

                    // <option value="北京">北京</option>
                    var nodes = '';
                    for (var i = 0; i < cs.length; i++) {
                        var nameValue = cs[i].getAttribute('name');
                        nodes += '<option value="' + nameValue + '">' + nameValue + '</option>';
                    }

                    // 设置到省下拉列表中
                    c.innerHTML += nodes;

                }
            }

            // 4 发送请求
            xhr.send();
        }



        // 市事件,加载区县
        function getCounties() {
          
             var c = document.getElementById('county');
            // 清空原内容,只保留一个
            c.options.length = 1;
            // 如果点击的是北京 this.value 就是北京
            // console.log(this.value);
            var optionValue = this.value;
            if (optionValue == 1) {
                return;
            }
            // 1 ajax引擎
            var xhr = createXMLHttrRequest();
            // 2 配置
            xhr.open('GET', 'Area.xml', true);
            // 3 监听
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    // console.log(xhr.responseXML);
                    // 文档对象
                    var xmlDoc = xhr.responseXML;
                    // console.log(xmlDoc.querySelector('province[name="'+optionValue+'"]'));
                    // 获取城市
                    var city = xmlDoc.querySelector('city[name="' + optionValue + '"]');
                    // 获取所有城市
                    var cs = city.getElementsByTagName('county');

                    // <option value="北京">北京</option>
                    var nodes = '';
                    for (var i = 0; i < cs.length; i++) {
                        var nameValue = cs[i].getAttribute('name');
                        nodes += '<option value="' + nameValue + '">' + nameValue + '</option>';
                    }

                    // 设置到省下拉列表中
                    c.innerHTML += nodes;

                }
            }

            // 4 发送请求
            xhr.send();
        }
        // 获取XMLHttpRequest对象
        function createXMLHttrRequest() {
            if (window.XMLHttpRequest) {
                return new XMLHttpRequest();
            } else {
                return new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
    </script>
</head>

<body>
    <select name="" id="province">
        <option value="1">---请选择省份---</option>

    </select>
    <select name="" id="city">
        <option value="1">---请选择城市---</option>
    </select>
    <select name="" id="county">
        <option value="1">---请选择区县---</option>
    </select>
</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = init;
        var xmlDoc;
        function init() {
            /**
             * 思路 : 
                    1 三个下拉列表,省,市,县
                    2 绑定onchange事件,发生更改触发
                    3 打开页面默认加载所有省份,并显示在省下拉列表中
                    4 当省下拉列表发生更改时,加载对应的城市,显示在市下拉列表中
                    5 当市下拉列表发生更改时,加载对应的区县,并显示在县下拉列表中
             */
            // 打开页面默认加载所有省份,并显示在省下拉列表中
            initProvince();
            var pn = document.getElementById('province');
            pn.onchange = getCities;
            // 市下拉列表
            var c = document.getElementById('city');
            c.onchange = getCounties;
        }
        // 加载省
        function initProvince() {
            // 1 ajax引擎
            var xhr = createXMLHttrRequest();
            // 2 配置
            xhr.open('GET', 'Area.xml', true);
            // 3 监听
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    // console.log(xhr.responseXML);
                    // 文档对象
                    xmlDoc = xhr.responseXML;
                    // 获取省
                    var pns = xmlDoc.getElementsByTagName("province");
                    // 省下拉列表
                    var pn = document.getElementById('province');

                    // 遍历所有的省份,拼成option
                    // <option value="北京">北京</option>
                    var nodes = '';
                    for (var i = 0; i < pns.length; i++) {
                        var nameValue = pns[i].getAttribute('name');
                        nodes += '<option value="' + nameValue + '">' + nameValue + '</option>';
                    }
                    // 设置到省下拉列表中
                    pn.innerHTML += nodes;

                }
            }

            // 4 发送请求
            xhr.send();
        }

        // 省下拉列表事件,用于获取城市
        function getCities() {
            var c = document.getElementById('county');
            // 清空原内容,只保留一个
            c.options.length = 1;
            // 市下拉列表
            var c = document.getElementById('city');
            // 清空原内容,只保留一个
            c.options.length = 1;

            // 如果点击的是北京 this.value 就是北京
            // console.log(this.value);
            var optionValue = this.value;
            if (optionValue == 1) {
                return;
            }
            // 获取省
            var pn = xmlDoc.querySelector('province[name="' + optionValue + '"]');
            // 获取所有城市
            var cs = pn.getElementsByTagName('city');
            // <option value="北京">北京</option>
            var nodes = getOptions(cs);
            // 设置到省下拉列表中
            c.innerHTML += nodes;
        }
        // 市事件,加载区县
        function getCounties() {
            var c = document.getElementById('county');
            // 清空原内容,只保留一个
            c.options.length = 1;
            // 如果点击的是北京 this.value 就是北京
            // console.log(this.value);
            var optionValue = this.value;
            if (optionValue == 1) {
                return;
            }
            // 获取城市
            var city = xmlDoc.querySelector('city[name="' + optionValue + '"]');
            // 获取所有区县
            var cs = city.getElementsByTagName('county');
            // <option value="北京">北京</option>
            var nodes = getOptions(cs);
            // 设置到省下拉列表中
            c.innerHTML += nodes;
        }
        function getOptions(obj){
            var nodes = '';
            for (var i = 0; i < obj.length; i++) {
                var nameValue = obj[i].getAttribute('name');
                nodes += '<option value="' + nameValue + '">' + nameValue + '</option>';
            }
            return nodes;
        }
        // 获取XMLHttpRequest对象
        function createXMLHttrRequest() {
            if (window.XMLHttpRequest) {
                return new XMLHttpRequest();
            } else {
                return new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
    </script>
</head>

<body>
    <select name="" id="province">
        <option value="1">---请选择省份---</option>

    </select>
    <select name="" id="city">
        <option value="1">---请选择城市---</option>
    </select>
    <select name="" id="county">
        <option value="1">---请选择区县---</option>
    </select>
</body>

</html>

jQuery写法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script>
        $(function () {
            var xmlDoc;
            $.get('Area.xml', function (data) {
                xmlDoc = data;
                //找到省份
                //根据xmlDoc获取的文档找到province对象,遍历
                $(xmlDoc).find("province").each(function () {
                    //获取省份
                    var val = $(this).attr('name');
                    // console.log(val);   
                    //拼接到省份下拉列表
                    // <option value="北京">北京</option> 格式
                    $('#province').append('<option value="' + val + '">' + val + '</option>');

                });
            });
            //获取city
            //点击省份获取city
            $('#province').change(function () {
                //清空下拉列表
                $("#city option:gt(0)").remove();
                $("#county option:gt(0)").remove();
                var val = $(this).val();//获取省份
                //    console.log(val);
                // 通过省份值找到city对象
                $(xmlDoc).find("province[name='" + val + "'] city").each(function () {
                    //获取city值
                    var val = $(this).attr('name');
                    $('#city').append('<option value="' + val + '">' + val + '</option>');
                });
            });
            //county
            //点击city获取county
            $('#city').change(function () {
                //清空下拉列表

                $("#county option:gt(0)").remove();
                var val = $(this).val();//获取city
                //    console.log(val);
                // 通过city值找到county对象
                $(xmlDoc).find("city[name='" + val + "'] county").each(function () {
                    //获取county值
                    var val = $(this).attr('name');
                    $('#county').append('<option value="' + val + '">' + val + '</option>');
                });
            });
        })
    </script>
</head>

<body>
    <select name="" id="province">
        <option value="1">---请选择省份---</option>

    </select>
    <select name="" id="city">
        <option value="1">---请选择城市---</option>
    </select>
    <select name="" id="county">
        <option value="1">---请选择区县---</option>
    </select>

</body>

</html>

3. jQuery-Ajax

3.1 概述

1、如果没有 jQuery,AJAX 编程还是有些难度的。
2、编写常规的 AJAX 代码并不容易,因为不同的浏览器对 AJAX 的实现并不相同。这意味着您必须编写额外的代码对浏览器进行测试。不过,jQuery 团队为我们解决了这个难题,我们只需要一行简单的代码,就可以实现 AJAX 功能。
3、jQuery 提供多个与 AJAX 有关的方法。
4、通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、XML 或 JSON - 同时您能够把这些外部数据直接载入网页的被选元素中。
3.2 Load
jQuery load() 方法
jQuery load() 方法是简单但强大的 AJAX 方法。

load() 方法从服务器加载数据,并把返回的数据放入被选元素中。
谁调用的这个方法,就把返回数据放入谁的里面

可选的 callback 参数规定当 load() 方法完成后所要允许的回调函数。回调函数可以设置不同的参数:
responseTxt - 包含调用成功时的结果内容
statusTXT - 包含调用的状态
xhr - 包含 XMLHttpRequest 对象
下面的例子会在 load() 方法完成后显示一个提示框。如果 load() 方法已成功,则显示"外部内容加载成功!",而如果失败,则显示错误消息:
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                $("#content").load('text.txt');
                // 把test.html文档,全部载入#content中
                $("#content").load('test.html');

                // 只加载dv
                $("#content").load('test.html #dv');
                $("#content").load('test.html #dv',function(data){
                    // 加载后的回调函数,data是加载的文件的整个文档对象
                    console.log(data);
                });
            });
        });
    </script>
</head>
<body>
    <button id='btn'>获取数据</button>
    <div id="content"></div>
</body>
</html>

3.3 Get
两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。

GET - 从指定的资源请求数据
POST - 向指定的资源提交要处理的数据
GET 基本上用于从服务器获得(取回)数据。注释:GET 方法可能返回缓存数据。

POST 也可用于从服务器获取数据。不过,POST 方法不会缓存数据,并且常用于连同请求一起发送数据。

如需学习更多有关 GET 和 POST 以及两方法差异的知识,请阅读我们的 HTTP 方法 - GET 对比 POST。
在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                // 如果是xml data就是DOM对象,就等于使用responseXML获取
                // 反之 就是字符串,等于 responseText 获取
                // 第一个参数是URL , 第二个参数是成功之后的回调函数
                $.get('test.html',function(data){
                    console.log(data);
                });
            });
        });
    </script>
</head>
<body>
    <button id='btn'>获取数据</button>
</body>
</html>

3.4 Post
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                // 如果是xml data就是DOM对象,就等于使用responseXML获取
                // 反之 就是字符串,等于 responseText 获取
                // 第一个参数是URL ,第二个参数是传递的数据, 第三个参数是成功之后的回调函数
                // 第一个参数必须写
                $.post('test.html',{xxx:'222'},function(data){
                    console.log(data);
                });
            });
        });
    </script>
</head>
<body>
    <button id='btn'>获取数据</button>
</body>
</html>

在这里插入图片描述
3.5 Ajax

ajax() 方法用于执行 AJAX(异步 HTTP)请求。
所有的 jQuery AJAX 方法都使用 ajax() 方法。该方法通常用于其他方法不能完成的请求。

type:
要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。
async:
要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行。
cache:
要求为Boolean类型的参数,默认为true(当dataType为script时,默认为false),设置为false将不会从浏览器缓存中加载请求信息。
data:
要求为Object或String类型的参数,发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换,可以查看  processData选项。对象必须为key/value格式,例如{foo1:“bar1”,foo2:“bar2”}转换为&foo1=bar1&foo2=bar2。如果是数组,JQuery将自动为不同值对应同一个名称。例如{foo:[“bar1”,“bar2”]}转换为&foo=bar1&foo=bar2。
dataType:
要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。可用的类型如下:
xml:返回XML文档,可用JQuery处理。
html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。
:返回JSON数据。
jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。
text:返回纯文本字符串。
complete:
要求为Function类型的参数,请求完成后调用的回调函数(请求成功或失败时均调用)。参数:XMLHttpRequest对象和一个描述成功请求类型的字符串。

function(XMLHttpRequest, textStatus){
this; //调用本次ajax请求时传递的options参数
}

success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
(1)由服务器返回,并根据dataType参数进行处理后的数据。
(2)描述状态的字符串。

  function(data, textStatus){
        //data可能是xmlDoc、jsonObj、html、text等等
        this;  //调用本次ajax请求时传递的options参数
     }

error:
要求为Function类型的参数,请求失败时被调用的函数。该函数有3个参数,即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下:

  function(XMLHttpRequest, textStatus, errorThrown){
      //通常情况下textStatus和errorThrown只有其中一个包含信息
      this;   //调用本次ajax请求时传递的options参数
   }

contentType:
要求为String类型的参数,当发送信息至服务器时,内容编码类型默认为"application/x-www-form-urlencoded"。该默认值适合大多数应用场合。

常用的属性 :
Url,async,type,success,error,data

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script>
        $(function () {
            var xmlDoc;
            $("#btn").click(function () {
                $.ajax({
                    // 请求的路由(就是到哪里去)
                    url: 'Area.xml',
                    // 请求类型,POST/GET
                    type: 'POST',
                    // 是否异步,true 异步,false 同步
                    async: true,
                    // 传递的数据
                    data:{xxx:2,s:1},
                    // 成功之后的回调函数
                    success: function (data, textStatus) {
                        // 因为请求的是XML 所以得到文档对象,其他得到字符串
                        console.log(data);
                        xmlDoc = data;
                    },
                    // 失败之后的回调函数
                    error: function (xhr) {
                        console.log("加载失败 : "+xhr.status);
                    },
                });
                // 如果ajax之外,需要用到ajax中加载的数据,或者其他操作的数据
                // 则 需要同步编程,否则导致这里使用不了,未赋值
                console.log(xmlDoc);
            });
        });
    </script>
</head>

<body>
    <button id='btn'>获取数据</button>
</body>

</html>

4. JSON

4.1 概述
JSON: JavaScript Object Notation(JavaScript 对象表示法)
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
JSON 是轻量级的文本数据交换格式
JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
JSON 具有自我描述性,更易理解
4.2 语法
JSON 语法是 JavaScript 对象表示语法的子集。
数据在名称/值对中、数据由逗号分隔、大括号保存对象、中括号保存数组。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

Var json = { ‘name’:’张三’, ‘age’:18 };

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script>
        $(function(){
            // JSON对象 和JS对象的字面量写法是一致的,不过一般key我们放到''中
            var json = {
                // 值为字符串,需要加 ''
                'name':'张三',
                // 值是数字 不用加 ''
                'age':18,
                // 值是 boolean / null 等 也不用加 ''
                'sex':true
            };
            // 访问属性
            console.log(json.name);
            // 设置值
            json.name='李四';
            // 访问属性
            console.log(json['name']);
            // 设置值
            json['name']='王五';
            // 添加新属性
            json.id=1;
            json['addr']='石家庄';

         
        });
    </script>
</head>
<body>
    
</body>
</html>

4.3 JSON数组
JSON 数组在中括号中书写。
JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。
JavaScript 中,数组值可以是以上的 JSON 数据类型,也可以是 JavaScript 的表达式,包括函数,日期,及 undefined。
对象属性的值可以是一个数组:

var jsons = [
          {
                'name':'张三1',
                'age':18
            },{
                'name':'张三2',
                'age':18
            },{
                'name':'张三3',
                'age':18
            }
        ];

        var json = {
            'name':'张三',
            'like':['篮球','体育','吃','玩']
        };
        console.log(json.like[0]);

4.4 JSON转字符串
因为数据传递都是以字符串进行传递,如果我们想要把JSON传递到后端,需要先转换为对应的JSON格式的字符串,然后传递该字符串即可

 var json = {
            'name':'张三',
            'age':15
        };
        // object
        console.log(typeof json);
        // 转换为字符串
        var jsonStr = JSON.stringify(json);
        // string
        console.log(typeof jsonStr);

4.5 字符串转JSON
如果后端传递到页面的是一个JSON格式的字符串,我们需要把该字符串转换为JSON对象,方便我们获取数据等操作

// 转换为JSON对象
        var obj = JSON.parse(jsonStr);
        // object
        console.log(typeof obj);
$.get('person.txt',function(data,status){
            console.log(status);
            // string
            console.log(typeof data);
            if(status == 'success'){
                // 转对象 该字符串,必须是JSON格式
                var jsonObj = JSON.parse(data)
                // object
                console.log(typeof jsonObj);
                console.log(jsonObj.name);
            }
        });

4.6 eval

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./js/jquery-1.11.1.min.js"></script>
    <script>
        var t = '2+3';
        // 2+3
        console.log(t);
        // eval : 可以直接运算字符串中的运算操作
        // 5
        console.log(eval(t));

        // 同时eval 也可以把JSON数组格式的字符串转换为JSON数组对象
        var str = "[{name:1},{name:2}]";
        // 转换为数组JSON对象
        var jsons = eval(str);
        console.log(jsons);
        // 访问数据
        console.log(jsons[0].name);


        $.get('person.txt',function(data,status){
            console.log(status);
            // string
            console.log(typeof data);
            if(status == 'success'){
                // 转对象 该字符串,必须是JSON数组格式
                var jsonObj = eval(data)
                console.log( jsonObj);
                console.log(jsonObj[0].name);
            }
        });

        $.get('https://www.baidu.com/s?wd=java',function(data){
            console.log(data);
        });
    </script>
</head>
<body>
    
</body>
</html>

4.7 JSONP
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
为什么我们从不同的域(网站)访问数据需要一个特殊的技术( JSONP )呢?这是因为同源策略。
同源策略,它是由 Netscape 提出的一个著名的安全策略,现在所有支持 JavaScript 的浏览器都会使用这个策略。
如客户想访问 :
https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction
假设客户期望返回数据:[“customername1”,“customername2”]。
真正返回到客户端的数据显示为: callbackFunction([“customername1”,“customername2”])。

只能通过请求访问自己域中的数据,访问其他域中的,就会被终止,除非对应的服务器中设置了可以跨域访问才行
在这里插入图片描述
后端可以通过在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值