带你走进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("失败");
        }
    });
}

  

原文地址:https://www.cnblogs.com/WeWeZhang/p/5826502.html