• 带你走进Ajax


     DJ-LZPR-RLYP-200
    /**
     * 搞清楚客户端与服务器的概念
     */
    客户端:用户使用的设备
    服务器:开发出来的html、css、JavaScript文件存放的设备
    
    2者的的相同点:都是计算机
    2者的区别:
        客户端是给普通人使用的电脑
        服务器是24小时不断电的超级电脑,可提供网页、文件上传下载、邮件、视频等服务
    

    网页服务:Apache、Nginx、Tomcat、IIS
    上传下载:VsFTP
    邮件服务:posfix
    

      

    /**
     * 计算机工作简介
     */
    CPU
        运算器
        控制器
    存储器
        外存    硬盘
        内存            
    输入设备  键盘、鼠标
    输出设备  显示器
    

      

    /**
     * 内存中的栈和堆
     */
    内存:应用程序只有加载到内存中,才会到达CPU,才可以运行
    栈内存:比较小,用于存储内存地址和常量等
    堆内存:比较大,用于存储对象
    内存管理:变量名=null
    

      

    /**
     * 通信协议
     */
    两台计算机之间如何通信?通过通信协议
    协议就是交流的双方事先约定好的规则
    类似于计算机之间默认的交流语言,通信协议有多种
    

      

    /**
     * HTTP通信协议
     */
    

      

    /**
     * 网络间的多方通信
     */
    IP地址:网络中计算机的唯一标识,0~255的4组数字中间用.隔开,如:192.168.1.1
    端口:计算机上应用程序占用的“位置编号”,如8080端口是默认端口
    域名:IP地址的别名,可以买卖,单个IP允许绑定多个域名,如www.baidu.com
    

      

    /**
     * 域名解析
     */
    DNS域名解析系统
    C:WindowsSystem32driversetchosts
    #代表注释符 首先访问Hosts文件是否有相应的域名,找不到再到上级DNS服务器解析域名
    

      

    /**
     * Wamp集成安装环境
     */
    W代表Windows
    a代表Apache
    m代表Mysql
    p代表PHP
    一次性安装Apache、Mysql、PHP环境,客户端服务端一体化
    官网地址  http://www.wampserver.com/
    下载地址  http://pc.xzstatic.com/2016/12/wampserver_X86_2.5.1455519048.exe
    注意区分32位和64位
    dll错误: http://xiazai.xiazaiba.com/Soft/D/DirectX_Repair_3.5_Enhanced_XiaZaiBa.zip?filename=DirectX_Repair_3.5_Enhanced_XiaZaiBa.zip
    

      

    /**
     * Wamp改端口号
     */
    ApcheApche
    httpd.conf
    搜索80,找到Listen 80
    

      

    /**
     * 软件开发过程的三种环境
     */
    Development 开发环境
    Test        测试环境
    Production  生产环境
    

      

    /**
     * 相对路径和绝对路径
     */
    相对路径 ./是当前路径 ../是上层路径
    绝对路径 实际开发中使用,因为相对路径在动态调用时会错乱
    

      

    /**
     * 搞清楚静态网站与动态网站的区别
     */
    网站:    一系列的网页就组成了一个网站
    静态网站:写好的静态的网页  缺陷:更新维护超繁琐
    动态网站:动态生成的网页,时下流行,只需要维护数据即可实现网页的维护
    

      

    /**
     * php的作用
     **/
    php类似于js,也是一种文件格式,有自己的语法规则 有自己的安装环境
    php文件只能工作在服务器环境下,没有服务器环境,php就无法工作
    php中关于json对象转成字符串:
    $array = array("username"=>"Mr","password"=>"Zhang");
    echo json_encode($array);

      

    /**
     * B/S模式 C/S模式
     */
    B/S模式   
    browser浏览器  Server服务器
    服务器更改数据,所有的浏览器都自动实现了更新
    C/S模式   
    client客户端 Server服务器
    服务器更改数据,客户端需要手动更新
    

      

    /**
     * 搞清楚同步与异步的概念
     */
    同步:只运行主线程,事件完成前等待,线程阻塞 页面白屏、数据需要全屏刷新
    异步:运行主线程,同时开辟子线程去执行事件,线程不阻塞 数据仅需局部刷新
    

      

    /**
     * Ajax中的XMLHttpRequest
     */
    原来的线程开辟一个子线程去执行事件
    执行事件的对象,也就是“小弟”就是XMLHttpRequest对象
    运用的是代理设计模式
    

      

    /**
     * Ajax诞生之前的局部刷新-iframe标签  (已过时)
     */
    /*前端*/
    <form action="http://localhost/sample.php" method="post" name="WeFrame" enctype="application/x-www-form-urlencoded" >
        <input type="text" name="code" /><br />
        <input type="submit" value="提交" /><br />
    </form>
    <iframe name = "WeFrame" width="0" height="0" frameborder="0"></iframe>
    <div id="ShowInfo" ></div>
    
    /*后端*/
    <?php这里的写法参考下文?>
    <script type="text/javascript">
        parent.document.getElementById("ShowInfo").innerHTML = "WhatTheFuck";
    </script>
    

      

    /**
     * 神奇的Ajax
     */
    Asynchronous Javascript And XML”
    异步JavaScript和XML
    异步无刷新地实现数据交互
    无刷新,就大大减少了数据量,提高了响应速度
    异步操作,不阻塞用户,提升用户体验
    创建一个小弟 XMLHttpRequest设置请求方式、目的地
    告诉它回来怎么做
    发送它
    

      

    /**
     * 代码不按先后顺序执行的情况
     */
    js是单线程队列
    先把事件放到队列末尾,到时间先完成当前任务再把事件放到队列最前方
    /*延时*/
    setTimeout(function () {
    },1000);
    /*回调函数*/
    oXMLHttpRequest.onreadystatechange = function() {
    
    }
    

      

    /**
     * json字符串和json对象的相互转换
     */
    JSON.parse('{"key":"value"}');
    JSON.stringify({"key":"value"});
    

      

    /**
     * eval()有风险,不建议使用
     */
    字符串转json    eval("("+str+")")
    风险是eval不会转换所有的字符串,遇到函数会去执行
    

     

    try{
        throw new Error("哎呀妈呀,不好了");
    }catch(error){
        console.log(error);
    }

      

    /*******************************************************/
    

      

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script type="text/javascript" src="./sample.js"></script>
    </body>
    </html>
    

      

    window.onload = function () {
        /**
         * js里调用Ajax方法
         */
        funAjax({
            method: "POST",
            sHost: "http://localhost/sample.php",
            paraJSON: {
                "code":"OK"
            }, funSuccess: function (oXMLHttpRequest) {
    
                // /*返回字符串*/
                // console.log("成功",oXMLHttpRequest.responseText);
    
                // /*返回XML*/
                // /*格式为:'<res><name>阿花</name><name>阿猫</name><name>葡萄树</name><name>'.$codeStr.'</name></res>'*/
                // var oXML = oXMLHttpRequest.responseXML;
                // console.log(oXMLHttpRequest);
                // var aRes = oXML.getElementsByTagName("res");
                // for(var i=0;i<aRes.length;i++) {
                //     var oRes = aRes[i];
                //     var aName = oRes.getElementsByTagName("name");
                //     for(var j=0;j<aName.length;j++) {
                //         var oName = aName[j];
                //         console.log("成功",oName.childNodes[0].nodeValue);
                //     }
                // }
    
                // /*返回json文本*/
                var oJSON = JSON.parse(oXMLHttpRequest.responseText);
                console.log("json解析成功",oJSON);
            }, funFailure: function (oXMLHttpRequest) {
                console.log("失败");
            }
        });
    }
    /**
     *  封装Ajax
     **/
    function funAjax(oData) {
        /*跑腿小弟的声明*/
        var oXMLHttpRequest = null;
        /*跑腿小弟的初始化*/
        try{
            /*IE7+和其他浏览器下*/
            oXMLHttpRequest = new XMLHttpRequest();
        }catch(error){
            /*IE5和IE6下*/
            oXMLHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
        }
        /*设置跑腿小弟的回调操作*/
        oXMLHttpRequest.onreadystatechange = function() {
            /*小弟的做事状态*/
            switch (this.readyState) {
                /*创建完,未open*/
                case 0:
                    break;
                /*open完,未send*/
                case 1:
                    break;
                /*send完,正处理,响应头已经可用*/
                case 2:
                    break;
                /*正处理,响应了部分数据*/
                case 3:
                    break;
                /*响应完全部数据*/
                case 4:
                    /*跑腿小弟办事是否出错*/
                    if (this.status == 200){
                        if(oData.funSuccess) oData.funSuccess(this);
                    }else{
                        if(oData.funFailure) oData.funFailure(this);
                    }
            }
        }
        /*拼接参数字符串*/
        var sParas = "";
        for (var key in oData.paraJSON) {
            sParas += key+"="+oData.paraJSON[key]+"&";
        }
        if (sParas.length) sParas = sParas.substring(0, sParas.length - 1);
        /*跑腿小弟要去跑腿了*/
        if (oData.method == "POST" || oData.method == "post") {
            /**
             * 设置XMLHttpRequest的各项参数
             * @param   请求类型
             * @param   请求文件的地址
             * @param   是否采用异步操作
             **/
            oXMLHttpRequest.open("POST", oData.sHost, true);
            /*设置头类型*/
            oXMLHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            /*发送POST小弟*/
            oXMLHttpRequest.send(sParas);
        } else if(oData.method == "GET" || oData.method == "get"){
            /**
             * 设置XMLHttpRequest的各项参数
             * @param   请求类型
             * @param   请求文件的地址
             * @param   是否采用异步操作
             **/
            oXMLHttpRequest.open("GET", encodeURI(oData.sHost+"?"+sParas+"&_="+new Date().getTime()), true);
            /*发送GET小弟*/
            oXMLHttpRequest.send(null);
        }
    }
    

      

    <?php
        /*设置GET请求为不缓存响应*/
        header("Cache-Control:no-cache");
        /*规范响应使用的字符集*/
    //    /*响应xml字符串时使用*/
    //    header("Content-Type:text/xml;charset=utf-8");
        /*响应普通字符串和json字符串时使用*/
        header("Content-Type:text/html;charset=utf-8");
    
        function funGET($str){
            return !empty($_GET[$str]) ? $_GET[$str] : null;
        }
        function funPOST($str){
            return !empty($_POST[$str]) ? $_POST[$str] : null;
        }
        function funParam($str) {
            return funPOST($str)?funPOST($str):funGET($str);
        }
    
        $codeStr = funParam('code');
    
        if($codeStr == 'OK'){
    //        /*返回xml字符串*/
    //            echo '<res><name>阿花</name><name>阿猫</name><name>葡萄树</name><name>'.$codeStr.'</name></res>';
    //        /*返回普通字符串*/
    //            echo '哎呦'.$codeStr;
            /*返回json字符串*/
            echo '{"res":[{"name":"阿花"},{"name":"阿猫"},{"name":"葡萄树"},{"name":"'.$codeStr.'"}]}';
        }else{
            echo 'Failure,code='.$codeStr;
        }
    ?>
    

      

    /*******************************************************/
    

      

    /**
     * 百度跨域调取EMS信息的接口
     */
     https://sp0.baidu.com/9_Q4sjW91Qh3otqbppnN2DJv/pae/channel/data/asyncqury?cb=jQuery1102020293423624244733_1485009269837&appid=4001&com=ems&nu=9710834110512&vcode=&token=&_=1485009269839
    

      

    /**
     * 停止事件的冒泡机制
     */
    function stopBubble(event) {
        if ( event && event.stopPropagation ) {
            /*支持W3C的stopPropagation()方法 */
            event.stopPropagation();
        } else {
            /*用IE的方式来取消事件冒泡*/
            window.event.cancelBubble = true;
        }
        return false;
    }
    
    /**
     * 阻止浏览器的默认行为 方法1 
     */
    function stopDefault(event) {
        if (event && event.preventDefault) {
            event.preventDefault();
        } else {
            window.event.returnValue = false;
        }
        return false;
    }
    
    
    /**
     * 阻止浏览器的默认行为 方法2
     */
    <a href="javascript:void(0);" >试试</a>

      

    /**
     * 关于Get与Post请求的区别
     */
    Get
    形式  host?key=value&key=value...
    参数的长度是有限度的
    只能提交参数
    Post
    形式   host
    请求体 key=value&key=value...
    理论上参数的长度是没有限度的
    可以提交参数
    也可以提交data数据
    

      

    /**
     * Get请求的注意点
     */
    缓存问题    默认是缓存响应的,
                方案1,url加时间戳参数
                方案2,php文件给出说明header("Cache-Control:no-cache");
    中文参数的编码问题   需要百分号转义 encodeURI()
    

      

    /*******************************************************/
    

      

        /* jQuery内封装的Ajax */
    
        <script type="text/javascript"src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
        <script type="text/javascript" src="./sample.js"></script>
    
        $(document).ready(function () {
        });
        $(function () {
        });
    

      

        <input type="button" id="Button" value="试试看" />
    

      

    $(function () {
        $("#Button").click(function () {
            $.ajax({
                type:"post",
                url:"http://localhost/sample.php",
                data:{page:"0"},
                dataType:"json",
                success:function (oJson) {
                    console.log(oJson);
                },error:function (oError) {
                    console.log(oError);
                }
            });
        });
    });
    

      

    $(function () {
        $("#Button").click(function () {
            $.ajax({
                type:"post",
                url:"http://localhost/sample.php",
                data:{page:"0"},
                dataType:"text",
                success:function (oText) {
                    console.log(oText);
                },error:function (oError) {
                    console.log(oError);
                }
            });
        });
    });
    

      

    $(function () {
        $("#Button").click(function () {
            $.ajax({
                type:"post",
                url:"http://localhost/sample.php",
                data:{page:"0"},
                dataType:"xml",
                success:function (oXML) {
                    console.log(oXML);
                },error:function (oError) {
                    console.log(oError);
                }
            });
        });
    });
    

      

    $(function () {
        $("#Button").click(function () {
            $.ajax({
                type:"post",
                url:"http://localhost/sample.php",
                data:{page:"0"},
                dataType:"html",
                success:function (oHtml) {
                    console.log(oHtml);
                },error:function (oError) {
                    console.log(oError);
                }
            });
        });
    });
    

      

    $(function () {
        $("#Button").click(function () {
            $.ajax({
                type:"post",
                url:"http://localhost/sample.php",
                data:{page:"0"},
                dataType:"script",
                success:function (oScript) {
                    eval(oScript);
                },error:function (oError) {
                    console.log(oError);
                }
            });
        });
    });
    

      

      

    /**
     * Ajax实例 - 固定列的瀑布流
     */
    简要介绍
    固定的列数,哪一列最短,优先排版,避免出现某一列过高或过矮,影响美感
    一个ul下浮动几个li,每个li代表一列
    图片的加载延迟问题,需要事先确定图片的宽度与高度,实际开发中需要利用递归和图片对象的预加载功能,这里利用后台给出的图片宽高数据可以取巧
    流的效果的实现,监听滚动事件,当最短的li移出可视区的时候,加载
    

      

    <?php
      /*此处省略部分参考之前写的*/
        $pageStr = funParam('$page');
        $url = "http://www.wookmark.com/api/json/popular?page=".$pageStr;
        $content = file_get_contents($url);
        echo iconv("gbk","utf-8",$content);
    ?>
    

      

    /*******************************************************/
    

      

      

    <!--固定列瀑布流-->
    <ul id="zw-pubu">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>

      

    #zw-pubu {
         800px;
        margin: 100px auto;
        padding-left: 0;
    }
    #zw-pubu > li {
        list-style: none;
         200px;
        float: left;
    }
    #zw-pubu > li > div {
        border: 2px solid #cc9f56;
        padding: 8px;
        background-color: #98cc9f;
    }
    #zw-pubu > li > div > img {
         180px;
        display: block;
    }
    #zw-pubu > li > div > p {
         180px;
        background-color: #cca293;
        margin-bottom: 0;
        padding: 5px;
    }
    

      

    /**
     * 下一次要请求的页数
     */
    var pageIndex = 0;
    /**
     * 门禁,确保一次一次地加页
     */
    var isOpen = true;
    
    /*jQuery的入口函数*/
    $(function () {
        /**
         * 初始数据
         */
        window.onscroll();
    });
    /**
     * 获取元素到页面顶部的距离
     */
    function funGetTop(element) {
        var height = 0;
        while (element) {
            height += element.offsetTop;
            element = element.offsetParent;
        }
        return height;
    }
    /**
     * 监听滚动事件
     */
    window.onscroll = function () {
        /**
         * 瀑布流的ul架子以及li架子
         */
        var oUl = document.getElementById("zw-pubu");
        var aLi = oUl.getElementsByTagName("li");
        var index = funGetShortIndex();
        var oli = aLi[index];
        /**
         * 兼容的获取可视区的滚动距离
         */
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        /**
         * 可视区的高度加滚动的距离
         */
        var value = document.documentElement.clientHeight+scrollTop;
        /**
         * 超过oli的底部到页面顶部的高度,需要加载数据
         */
        if (value>oli.offsetHeight+funGetTop(oli)&&isOpen) {
            funAddData(pageIndex++);
        }
    }
    /**
     * 当前最短oLi的index
     */
    function  funGetShortIndex () {
        /**
         * 瀑布流的ul架子以及li架子
         */
        var oUl = document.getElementById("zw-pubu");
        var aLi = oUl.getElementsByTagName("li");
        var index = 0;
        var nHeight = aLi.length?aLi[index].offsetHeight:0;
        for (var i=0;i<aLi.length;i++) {
            if (aLi[i].offsetHeight<nHeight){
                nHeight = aLi[i].offsetHeight;
                index = i;
            }
        }
        return index;
    }
    /**
     *  封装Ajax
     *  @param  oData   数据类
     **/
    function funAjax(oData) {
        /*Ajax跑腿小弟*/
        var oXMLHttpRequest = null;
        try{
            /*IE7+和其他浏览器*/
            oXMLHttpRequest = new XMLHttpRequest();
        }catch(error){
            /*IE5和IE6*/
            oXMLHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
        }
        /*小弟的回调操作*/
        oXMLHttpRequest.onreadystatechange = function() {
            /*小弟的办事状态*/
            switch (this.readyState) {
                /*创建完,未open*/
                case 0:
                    break;
                /*open完,未send*/
                case 1:
                    break;
                /*send完,正处理,响应头已经可用*/
                case 2:
                    break;
                /*正处理,响应了部分数据*/
                case 3:
                    break;
                /*响应完全部数据*/
                case 4:
                    /*小弟办事是否出错*/
                    if (this.status == 200){
                        if(oData.funSuccess) oData.funSuccess(this);
                    }else{
                        if(oData.funFailure) oData.funFailure(this);
                    }
            }
        }
        /*拼接参数字符串*/
        var sParas = "";
        for (var key in oData.paraJSON) {
            sParas += key+"="+oData.paraJSON[key]+"&";
        }
        if (sParas.length) sParas = sParas.substring(0, sParas.length - 1);
        /*叮嘱小弟详情*/
        if (oData.method == "POST" || oData.method == "post") {
            /**
             * 设置XMLHttpRequest的各项参数
             * @param   请求类型
             * @param   请求文件的地址
             * @param   是否采用异步操作
             **/
            oXMLHttpRequest.open("POST", oData.sHost, true);
            /*设置头类型*/
            oXMLHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            /*发送POST小弟*/
            oXMLHttpRequest.send(sParas);
        } else if(oData.method == "GET" || oData.method == "get"){
            /**
             * 设置XMLHttpRequest的各项参数
             * @param   请求类型
             * @param   请求文件的地址
             * @param   是否采用异步操作
             **/
            oXMLHttpRequest.open("GET", encodeURI(oData.sHost+"?"+sParas+"&"+new Date().getTime()), true);
            /*发送GET小弟*/
            oXMLHttpRequest.send(null);
        }
    }
    /**
     * 加载第number页数据
     */
    function funAddData(number) {
        isOpen = false;
        funAjax({
            method: "GET",
            sHost: "http://localhost/20161017/php/sample.php",
            paraJSON: {
                "page":number
            }, funSuccess: function (oXMLHttpRequest) {
                var oJSON = JSON.parse(oXMLHttpRequest.responseText);
                console.log("成功",oJSON);
                isOpen = true;
                if (!oJSON.length){
                  console.log("没有更多数据了");  
                }else{
                    /**
                     * 瀑布流的ul架子以及li架子
                     */
                    var oUl = document.getElementById("zw-pubu");
                    var aLi = oUl.getElementsByTagName("li");
                    for (var i=0;i<oJSON.length;i++) {
                        var oData = oJSON[i];
                        var oDiv = document.createElement("div");
                        aLi[funGetShortIndex()].appendChild(oDiv);
                        var oImg = document.createElement("img");
                        oImg.src = oData.preview;
                        oImg.style.width = "180px";
                        oImg.style.height = 180*oData.height/oData.width+"px";
                        oDiv.appendChild(oImg);
                        var oP = document.createElement("p");
                        oP.innerHTML = oData.title;
                        oDiv.appendChild(oP);
                        /**
                         * 隐藏掉宽或高为0的div
                         */
                        if (!(oData.height*oData.width)) {
                            oDiv.style.display = "none";
                        }
                        /**
                         * 隐藏掉title为""的oP
                         */
                        if (!oData.title) {
                            oP.style.display = "none";
                        }
                    }
                }
            }, funFailure: function (oXMLHttpRequest) {
                console.log("失败");
            }
        });
    }
    

      

  • 相关阅读:
    cookie.js插件
    cookie.js插件的案例
    解决mysqli的中文乱码问题
    mysqli字符编码
    小人行走的动画案例
    原生js中用Ajax进行get传参
    php操作数据库
    数据库的信息处理
    数据库的dos命令
    面向对象php 接口 抽象类
  • 原文地址:https://www.cnblogs.com/WeWeZhang/p/5826502.html
Copyright © 2020-2023  润新知