2020.7.1:ajax跨域、JQuery跨域、模板引擎 artTemplate

今日学习内容:

# Ajax 关于跨域:

1. XMR 对象只能获取同源数据,我们可以通过 script 标签,用 script 标签的 src 属性引入一个外部文件,这个外部文件是不涉及到同源策略的影响的。

  - 例如:

<script src="http://www.lisi.com/data.php?city=shanghai"></script> 

2. 接口案例:( jsonp 格式是用来跨域的,xml、json、text格式是用来访问同源服务器的)

1. 淘宝提示词接口
    - 地址:https://suggest.taobao.com/sug
    - 作用描述:获取淘宝提示词接口
    - 请求类型:Get 请求
    - 参数:q:关键字、 callback:回调方法名称
    - 返回数据格式:Jsonp格式
2. 百度提示词

    - 地址: https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su
    - 作用描述:获取百度提示词
    - 请求类型:Get 请求
    - 参数:wd:关键字、cb:回调函数名称
    - 返回数据格式:jsonp 格式
接口案例

3. ajax 函数的封装:

// 跨域数据obj dataType = jsonp
function myAjax(obj) {
    if (obj.dataType == "jsonp") {
        myAjax4cross(obj);
    } else {
        myAjax4normal(obj);
    }
}
function myAjax4cross(obj) {

    var defaults = {
        type: "get",
        url: "#",
        data: {},
        success: function () {
        },
        jsonp: "callback",
        jsonpCallback: "hehe"
    };
    for (var key in obj) {
        defaults[key] = obj[key];
    }

    var params = "";
    for (var attr in defaults.data) {
        params += attr + "=" + defaults.data[attr] + "&";
    }
    if (params) {
        params = params.substring(0, params.length - 1);
        defaults.url += "?" + params;
    }
    defaults.url += "&" + defaults.jsonp + "=" + defaults.jsonpCallback;
    console.log(defaults.url);

    var script = document.createElement("script");
    script.src = defaults.url;

    window[defaults.jsonpCallback] = function (data) {
        defaults.success(data);
    }

    var head = document.querySelector("head");
    head.appendChild(script);
}
function myAjax4normal(obj) {
    
    var defaults = {
        type: "get",
        url: "#",
        dataType: "json",
        async: true,
        data: {},
        success: function (result) {
            console.log(result);
        }
    };
    for (var key in obj) {
        defaults[key] = obj[key];
    }
    var xhr = null;
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    var params = "";
    for (var attr in defaults.data) {
        params += attr + "=" + defaults.data[attr] + "&";
    }
    if (params) {
        params = params.substring(0, params.length - 1);
    }
    if (defaults.type == "get") {
        defaults.url += "?" + params;
    }
    xhr.open(defaults.type, defaults.url, defaults.async);

    if (defaults.type == "get") {
        xhr.send(null);
    } else if (defaults.type == "post") {
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(params);
    }

    if (defaults.async) {
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (xhr.status == 200) {
                    var result = null;
                    if (defaults.dataType == "json") {
                        result = xhr.responseText;
                        result = JSON.parse(result);
                    } else if (defaults.dataType == "xml") {
                        result = xhr.responseXML;
                    } else {
                        result = xhr.responseText;
                    }
                    defaults.success(result);
                }
            }
        }
    } else {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                var result = null;
                if (defaults.dataType == "json") {
                    result = xhr.responseText;
                    result = JSON.parse(result);
                } else if (defaults.dataType == "xml") {
                    result = xhr.responseXML;
                } else {
                    result = xhr.responseText;
                }
                defaults.success(result);
            }
        }
    }
};
ajax 函数的封装

调用示范:

<script>
    window.onload = function () {
        var btn = document.querySelector("#btn");
        btn.onclick = function () {
            var keywordValue = document.querySelector("#keyword").value;
            console.log(keywordValue);

            myAjax({
                url: "https://suggest.taobao.com/sug",
                data: { q: keywordValue },
                success: function (data) {
                    var liTag = "";
                    for (var i = 0; i < data.result.length; i++) {
                        var temp = data.result[i];
                        var tempSug = temp[0];
                        liTag += "<li>" + tempSug + "</li>";
                    }

                    var ulTag = document.querySelector("ul");
                    ulTag.innerHTML = liTag;
                }
            });
        }
    };
</script>

<body>
    <input type="text" id="keyword" placeholder="请输入相关的关键字">
    <input type="button" id="btn" value="查询">
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>
</body>
ajax 函数的调用示范

# JQuery 跨域的示范:( dataType 必须 = jsonp 才能跨域)

$.ajax({
                url: "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su",
                data: { wd: keywordValue },
                success: function (data) {
                    var liTag = "";
                    for (var i = 0; i < data.s.length; i++) {
                        var temp = data.s[i];
                        liTag += "<li>" + temp + "</li>";
                    }

                    var ulTag = document.querySelector("ul");
                    ulTag.innerHTML = liTag;
                },
                dataType: "jsonp",//json xml text
                jsonp: "cb",
                jsonpCallback: "hehe"
            });
JQuery 跨域的示范

 # 模板引擎 artTemplate 的使用

 - 引入 js 文件
    - 定义模板
    - 将数据和模板结合起来生成 html 片段
    - 将 html 片段渲染到界面中
使用步骤
# 基本语法
    - 得到数据中的值 —— {{value}}    
    - 循环操作 —— {{each result as value i}}{{/each}}
    - 转义 # 的使用 —— {{#value}}
    - 条件判断 —— {{if xxx}}{{/if}}

技巧:有时候有可能需要对原始数据进行加工操作
基本语法
例子:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="myUtils.js"></script>
    <script src="JQuery.js"></script>
    <script src="template-web.js"></script>

    <!-- 1. 模板的 type=text/html  2. 给模板配一个 id
            data s
        -->
    <script type="text/html" id="resultTemplate">
    <ul>
        {{each s as value i}}
        <li>
            <div>
                <span>结果{{i+1}}:</span>
                <span>{{value}}</span>
            </div>
        </li>
        {{/each}}
    </ul>
    </script>
    <script>
        window.onload = function () {
            var btn = document.querySelector("#btn");
            btn.onclick = function () {
                var keywordValue = document.querySelector("#keyword").value;
                console.log(keywordValue);
                $.ajax({
                    url: "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su",
                    data: { wd: keywordValue },
                    success: function (data) {
                        console.log(data);
                        // template 方法的含义就是将数据和模板结合起来,生成 html 片段
                        var html = template("resultTemplate", data);
                        console.log(html);
                        var divResult = document.querySelector("#divResult");
                        divResult.innerHTML = html;
                    },
                    dataType: "jsonp",
                    jsonp: "cb",
                    jsonpCallback: "hehe"
                });
            }
        };
    </script>
</head>

<body>
    <input type="text" id="keyword" placeholder="请输入相关的关键字">
    <input type="button" id="btn" value="查询">
    <div id="divResult">
        <ul>
            <li>
                <div>
                    <span>结果1:</span>
                    <span>1</span>
                </div>
            </li>
            <li>
                <div>
                    <span>结果1:</span>
                    <span>1</span>
                </div>
            </li>
            <li>
                <div>
                    <span>结果1:</span>
                    <span>1</span>
                </div>
            </li>
            <li>
                <div>
                    <span>结果1:</span>
                    <span>1</span>
                </div>
            </li>
            <li>
                <div>
                    <span>结果1:</span>
                    <span>1</span>
                </div>
            </li>
        </ul>
    </div>

</body>

</html>
例子

例子01:

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>模板引擎</title>
    <script type="text/javascript" src="template-web.js"></script>
    <script type="text/html" id="resultTemplate">

        <h1>{{title}}</h1>
        {{each books as value i}}
        <div>{{value}}</div>
        {{/each}}

    </script>
    <script>
        window.onload = function () {
            var data = {
                title: '四大名著图书信息',
                books: ['三国演义', '水浒传', '西游记', '红楼梦']
            };
            var html = template("resultTemplate", data);
            var container = document.querySelector("#container");
            container.innerHTML = html;
        }
    </script>
</head>

<body>
    <div id="container">
    </div>
</body>

</html>
例子01

例子02:

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="template-web.js"></script>
    <script type="text/html" id="test">
        {{if isAdmin}}
            <h1>{{title}}</h1>
            <h2>一共有{{count}}条数据</h2>
            <ul>
                {{each list as value i}}
                    <li>索引{{i+1}}:{{value}}</li>
                {{/each}}
            </ul>
            {{/if}}
        {{if !isAdmin}}
            <h1>没有任何数据</h1>
        {{/if}}

    </script>
    <script>
        window.onload = function () {
            var data = {
                title: '条件判断基本例子',
                isAdmin: true,
                list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
            };
            data.count = data.list.length;
            var html = template("test", data);
            document.querySelector("#content").innerHTML = html;
        }
    </script>
</head>

<body>
    <div id="content">

    </div>
</body>

</html>
例子02

例子03:

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="template-web.js"></script>
    <script type="test/html" id="test">
        <ul>
            {{each arr as value i}}
                <li>{{value}}</li>
            {{/each}}
        </ul>
    </script>
    <script>
        window.onload = function () {
            var data = ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他'];
            var temp = {};
            temp.arr = data;
            var html = template("test", temp);
            document.querySelector("#content").innerHTML = html;
        }
    </script>
</head>

<body>
    <div id="content">
    </div>
</body>

</html>
例子03

例子04:

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="template-web.js"></script>
    <script type="text/html" id="test">
        <p>不转义:{{#value}}</p>
        <p>默认转义:{{value}}</p>
    </script>
    <script>

        window.onload = function () {
            var data = {
                value: '<span style="color:#f00">hello world!</span>'
            };
            var html = template('test', data);
            document.getElementById("content").innerHTML = html;
        }

    </script>
</head>

<body>
    <div id="content"></div>
</body>

</html>
例子04

 

posted @ 2020-07-01 14:37  青山绿水ccc  阅读(204)  评论(0)    收藏  举报