• Ajax基础知识 浅析(含php基础语法知识)


    1.php基础语法    后缀名为.php的文件

    1 echo   向页面中输入字符串

        <?php    所有php相关代码都要写在<?php ?>这个标签之中

                echo "<div>Hello World!</div>";

    ?>

    2变量声明  如果只声明不赋值,会报错

        <?php

                $num=123;

                echo $num;

                echo "<div>编号为:".$num."</div>";

                echo '<div>编号为:.$num.</div>';

    ?>

    1) 变量的声明使用$符  由字符数字下划线组成,不可以数字开头,区分大小写

    2) 字符串拼接使用.(点语法)区别于js中的+语法

    3) “ ”双引号中的变量会被解析成变量,但在单引号中会被解析成字符串

    3 print_r()  数组、对象输出

        <?php

                $arr=array("Tom","Jack","Lily","Lucy");

                print_r ($arr);     输出数组

                echo “<br>”;      换行

                echo $arr[0];      打印数组的值,返回Tom

    ?>

    输出结果入下:

    Array ( [0] => Tom [1] => Jack [2] => Lily [3] => Lucy )

    [ ]中为数组的索引值,=>后为其对应的值

    定义字符串为索引的数组:

            $arr2=array("name"=>"Tom","age"=>"18","gender"=>"male");

            print_r ($arr2);

    输出结果为:

    Array ( [name] => Tom [age] => 18 [gender] => male )

    4 var_dump ()  输出详细信息

    $arr2=array("name"=>"Tom","age"=>"18","gender"=>"male");

           var_dump($arr2);

    array (size=3)

                  'name' => string 'Tom' (length=3)

                  'age' => string '18' (length=2)

                  'gender' => string 'male' (length=4)

    5多维数组(二维数组为例)

        <?php

                $arr=array();

                $arr[0]=array(1,2,3);

                $arr[1]=array(4,5,6);

                $arr[2]=array(7,8,9);

                print_r($arr);

    ?>

    输出结果入下:

    Array (

    [0] => Array ( [0] => 1 [1] => 2 [2] => 3 )

    [1] => Array ( [0] => 4 [1] => 5 [2] => 6 )

    [2] => Array ( [0] => 7 [1] => 8 [2] => 9 )

    )

    6 gettype( )获取传入对象的数据类型

        <?php

                $str="array()";

                echo gettype($str);     返回string

    ?>

    7循环遍历

    for循环  count()用于计算数组的长度

        <?php

                $arr=array(123,456,789);

                for($i=0;$i<count($arr);$i++){   count($arr)等同于arr.length

                      echo $arr[$i]."<br>";

                }

    ?>

    foreach循环,两种表达形式

        <?php

                $arr=array(123,456,789);

                foreach($arr as $value){      直接取值

                        echo $value."<br>";

                }

        ?>

        <?php

                $arr=array(123,456,789);

                foreach($arr as $key =>$value){     键值对取值

                       echo $key."-----".$value."<br>";

                }

    ?>

    8函数定义

    自定义函数示例:预解析过程和js相同

        <?php

                function Foo(大写)($info){    php中函数名不区分大小写

                    return $info;

                }

                $res=foo(小写)("Hello");    php中函数名不区分大小写

                echo $res;

         ?>

    系统json_encode( )函数:将数组或对象转换成json类型字符串

         <?php

                $arr=array("name"=>"Tom","age"=>"18","gender"=>"male");

                $res=json_encode($arr);

                echo gettype($res);      输出结果为string

                echo "<br>".$res;    

          ?>

    浏览器输出:{"name":"Tom","age":"18","gender":"male"}  数据类型为字符串

    9 $_GET[ ]请求  会把表单数据作为url的参数

    一般用来从服务器获取数据,会显示在浏览器的地址栏,也用于收集来自 method="get" 的表单中的值

        <?php

              $f=$_GET["flag"];

              if($f==1){

                    echo "得到数据";

              }else{

                    echo "未得到数据";

              }

         ?>

    http://localhost/text.php?flag=1

    在浏览器地址栏输入上述地址,返回得到数据,如果输入其他,则返回未得到数据,flag=1是php中设置的条件

    10 $_POST[ ]请求   不会在url中显示数据,传输数据量大于GET

    一般用来添加数据,收集带有 POST 方法的表单发送的信息,不会显示在浏览器的地址栏,并且对发送信息的量也没有限制

           <div>

               <form action="./text.php" method="post">

                   用户名:<input type="text" name="username"><br>

                   密码:<input type="text" name="password">

                   <input type="submit" value="登录">

               </form>

          </div>

    php页面:

    <?php

        $uname=$_POST["username"];    根据表单中的name属性获取值

        $passw=$_POST["password"];

    header("Content-Type:text/plain; charset=utf-8");

    设置服务器响应的文件类型,设置成text/html标签数据可解析成html格式

        if($uname=="admin"&&$passw=="123"){

            echo "登录成功";

        }else{

            echo "登录失败,用户名或密码错误";

        }

     ?>

    11输入考号查询成绩,输入admin查询所有成绩案例

                <div>

                    <form action="./text.php" method="post">

                        考号:<input type="text" name="code"><br>

                        <input type="submit" value="登录">

                    </form>

                </div>

    php页面:

    <?php

    $arr=array();

    $arr['123']=array("name"=>"Tom","chinese"=>"78","math"=>"88","PE"=>"77");            $arr['124']=array("name"=>"Jack","chinese"=>"68","math"=>"78","PE"=>"57");            $arr['125']=array("name"=>"Jim","chinese"=>"71","math"=>"93","PE"=>"80");            $arr['126']=array("name"=>"Lily","chinese"=>"94","math"=>"70","PE"=>"68");

                $code=$_POST['code'];

                if($code=="admin"){

                    foreach ($arr as $value) {  输入admin循环遍历所有成绩输出

                    echo "<ul>      

    使用双引号””变量在其中还是解析成变量,不会解析成字符串

                    <li>姓名:$value[name]</li>

                    <li>语文: $value[chinese]</li>

                    <li>数学: $value[math]</li>

                    <li>语文: $value[PE]</li>

                </ul>";

                    }

                }else{    

                     $score=$arr[$code];     输入考号输出对应的成绩           

                    echo "<ul>

    使用双引号””变量在其中还是解析成变量,不会解析成字符串

                    <li>姓名: $score[name]</li>

                    <li>语文: $score[chinese]</li>

                    <li>数学: $score[math]</li>

                    <li>语文: $score[PE]</li>

                </ul>"; 

                }

    ?>

    2.Ajax基础知识

    1传统局部更新隐藏帧做法<iframe>

             <div>

                 <form action="./text.php" method="post" target="myframe">

                    用户名:<input type="text" name="username"><br>

                    密码:<input type="text" name="password"><br>

                    <input type="submit" value="登录">

                 </form>

             </div>

             <iframe> name="myframe"></iframe>

    php页面:

       <?php

        $uname=$_POST["username"];

        $passw=$_POST["password"];

        if($uname=='admin'&&$passw=='123'){

             echo "登录成功";  

        }

     ?>

    提交登录名和密码后页面不会跳转,会在HTML页面的<iframe>标签中输出“登录成功”

    改进代码:使用<span>接收<iframe>的输出内容,同时隐藏<iframe>标签,显示登录失败提示

      <div>

         <form action="./text.php" method="post" target="myframe">

            用户名:<input type="text" name="username">

    <span id="info"></span><br>

            密码:<input type="text" name="password"><br>

                <input type="submit" value="登录">

         </form>

      </div>

      <iframe name="myframe" height="0" width="0" frameborder="0"></iframe>

    php页面:

    <?php

        $uname=$_POST["username"];

        $passw=$_POST["password"];

        if($uname=='admin'&&$passw=='123'){

    ?>

             <script type="text/javascript">

                    parent.document.getElementById('info').innerHTML='登录成功';

             </script>      

    <?php  }else{  ?>  

    使用<?php ?>标签分离js代码与php代码,必须在<?php ?>标签中内容的前后都加上空格

             <script type="text/javascript">

                    parent.document.getElementById('info').innerHTML='登录失败';

    使用<iframe>标签的父元素来获取页面中的<span>标签

             </script>

    <?php  }  ?>

     

    2Ajax实现页面的局部刷新  步骤解析见下节:(3

    <script>

        window.onload = function () {

            var btn = document.getElementById("btn");

            btn.onclick = function () {

                var uname = document.getElementById("username").value;

                var passw = document.getElementById("password").value;

                var xhr = new XMLHttpRequest();

                console.log(xhr.readyState + "-------1");  查看readState的值

                xhr.open('get','./text.php?username=' + uname + '&password=' + passw,true);  

                xhr.send(null);

                console.log(xhr.readyState + "-------2");  查看readState的值

                xhr.onreadystatechange = function () {

                console.log(xhr.readyState + "-------3");  查看readState的值

                    if (xhr.readyState == 4) {

                        if (xhr.status == 200) {

                            var data = xhr.responseText;

                            var info = document.getElementById('info');

                            if (data == '1') {

                                info.innerHTML = '登录成功';

                            } else if (data == '2') {

                                info.innerHTML = '用户名或者密码错误';

                            }

                        }

                    }

                }

            }

        }

    </script>

    php页面:

    <?php

        $uname=$_GET['username'];

        $passw=$_GET['password'];

        if($uname=='admin'&&$passw=='123'){

            echo "1";

        }else{

            echo "2";

        }

     ?>

    3Ajax实现页面的局部刷新步骤详解(上述代码详解)

    xhr对象的兼容性封装(第一步创建xhr对象)xhr.XMLHttpRequest()

    var xhr = new XMLHttpRequest();

    兼容性封装:

                var xhr = null;

                if (window.XMLHttpRequest) {   如果有这个方法属性

                    xhr = new XMLHttpRequest();    使用这个方法

                } else {

                    xhr = new ActiveXObject("Microsoft");   老版本IE的方法属性

                }

    不使用if-else,使用try-catch也可实现同样的效果:

                try {

                    xhr = new XMLHttpRequest();

                } catch (e) {

                    xhr = new ActiveXObject("Microsoft");

                }

    第二步准备发送xhr.open('get','./text.php?username=' + uname + '&password=' + passw,true);  

    open(‘get’, url , true)

    open方法中有三个参数

    ‘get’参数一:请求发送的方式常用有四种( get获取数据,post提交数据,put修改数据,delete删除数据),使用最频繁的是getpost

    url参数二:请求地址如果是get请求,那么请求参数必须在url中传递

    例如案例中是get方式,所以使用拼接字符串的方法,将需要的usernamepassword这两个请求参数传递在其中

    案例中也可使用下述方法传递字符串:

    var prama = 'username=' + uname + '&password=' + passw;  申明请求参数

    xhr.open('get', './text.php?' + encodeURI(prama), true); 

    encodeURI方法对参数进行编码,可以防止传递中文出现乱码

    如果是post请求,请求参数在第三步send()中传递,不用在openurl中传递

    此处可以直接写xhr.open('get', './text.php’, true);

    true参数三:同步或者异步标志位默认是true表示异步,false表示同步

    第三步执行发送动作  xhr.send(null);

    如果是get请求,send()中需要添加null,即不需要请求参数;

    如果是post请求,send()中需要添加请求参数(var prama),不需要encodeURI()进行转码,同时需要设置请求头,请求头必须设在open( )之后,否则会报错

    在上述案例中应该写为:

    设置请求头如下:

    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

    xhr.send('username=' + uname + '&password=' + passw);

    第四步指定回调函数

    xhr.onreadystatechange = function () { 

    该函数调用条件是readyState值发生变化(值不包括从0-1

    根据对xhr.readyState的监测一共会经历0,1,2,3,4五个值,打印结果如下:

    var xhr = new XMLHttpRequest();

    1. new XMLHttpRequest()对象创建完成:xhr.readyState == 0

    xhr.send(null);

    2.调用send()方法以后,表示已经发送了请求:xhr.readyState == 1

    xhr.onreadystatechange = function (){}

    3.浏览器已经收到了服务器相应的数据:xhr.readyState == 2

    4.正在解析数据:xhr.readyState == 3

    5.数据已经解析完成,可以使用,但数据不一定正常,需要通过status==200来判断:xhr.readyState == 4

                    if (xhr.readyState == 4) {            

                        if (xhr.status == 200) {

    status==200表示响应成功,数据是正常的

    status==404表示没有找到资源

    status==500表示服务器端错误

                            var data = xhr.responseText;     响应数据

    var data = xhr.responseXML; 早期的数据格式,用标签包裹

    XML格式数据示例代码如下:

    <?xml version="1.0" encoding="utf-8" ?>

    <booklist>

        <book>

            <name>西游记</name>

            <author>吴承恩</author>

            <desc>西天取经</desc>

        </book>

        <book>

            <name>水浒传</name>

            <author>施耐庵</author>

            <desc>108条好汉</desc>

        </book>

    </booklist>

    解析XML格式的数据直接使用DOM操作即可,示例如下:

    var data = xhr.responseXML

    var bookList = data.getElementsByTagName(“booklist”);

    var books = booklist[0].children;

    var name = book[0].children[0].innerHTML;

    通过上述方式可以获取XML格式的数据

    使用php处理XML文件需要添加响应头,告诉浏览器需要以什么格式解析

    header(“Content-Type:text/xml;”);如果没有添加默认为html响应头

    <?php

        header("Content-Type:text/xml;");

     ?>

                       }

             }

    }

    4json数据格式   数据没有变量,键必须用””双引号包裹

    {

        "name":"Tom",

        "age":18,

        "hobby":["coding","swimming","singing"],

        "body":{"high":"180cm","weight":"80kg"}

    }

     

        var str = '{"name":"Tom","age":20}';

    var obj=JSON.parse(str);  json格式字符串转换成对象,使用eval转换存在安全隐患,有可能传入大段具有执行能力的代码

    php中使用json_encode($... )将数据转换成json形式的字符串

    5原生js封装ajax()函数:传参顺序不能更改

        function ajax(url, type, param, dataType, callback) { 传参顺序不能更改

            var xhr = null;

            if (window.XMLHttpRequest) {

                xhr = new XMLHttpRequest();

            } else {

                xhr = new ActiveXObject("Microsoft.XMLHTTP");

            }

            if (type == "get") {

                url = url + "?" + param;

            }

            xhr.open(type, url, true);

            var dataPrama = null;

            if (type == "post") {

                dataPrama = param;

                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

            }

            xhr.send(dataPrama);

            xhr.onreadystatechange = function () {

                if (xhr.readyState == 4) {

                    if (xhr.status == 200) {

                        var data = xhr.responseText;

                        if (dataType == "json") {

                            data = JSON.parse(data);

                        }

                        callback(data);

                    }

                }

            }

    }

    php页面(只示例post方法):

    <?php

        $uname=$_POST['username'];

        $passw=$_POST['password'];

    echo '{"name":" '.$uname.' ","password":" '.$passw.' "}';

    此处字符串拼接特别需注意’’单引号和””双引号的衔接

    ?>

    6模仿jQuery$.ajax())方法封装ajax()函数不含jsonp

        btn.onclick = function () {

            ajax({

                url: "./login2.php",

                type: "post",

                dataType: "json",

                data: {"username": "Tom", "password": 123},

                success: function (data) {

                    console.log(data);

                    console.log(typeof data);

                }

            });

        }

        function ajax(obj) {  函数封装开始

            var defaults = {   设置默认值

                type: 'get',

                data: {},

                url: '#',

                dataType: 'text',

                async: true,

                success: function (data) {

                }

            }

            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 param = '';    创建请求参数

            for (var attr in defaults.data) {  

    将对象类型请求参数,进行字符串拼接,转换成字符串

                param += attr + '=' + defaults.data[attr] + '&';

            }

            if (param) {  删除上一步多拼接的最后一个’&’符号

                param = param.substring(0, param.length - 1);

            }

            if (defaults.type == "get") {

                defaults.url += "?" + encodeURI(param);  防止中文乱码

            }

            xhr.open(defaults.type, defaults.url, defaults.async);

            var dataPrama = null;

            if (defaults.type == "post") {

                dataPrama = param;

                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

            }

            xhr.send(dataPrama);

            if (!defaults.async)

    处理asyncfalse时,即同步请求,不调用回调函数

                if (defaults.dataType == "json") {

                    return JSON.parse(xhr.responseText);

                } else {

                    return xhr.responseText;

                }

            }

            xhr.onreadystatechange = function () {

                if (xhr.readyState == 4) {

                    if (xhr.status == 200) {

                        var data = xhr.responseText;

                        if (defaults.dataType == "json") {

                            data = JSON.parse(data);

                        }

                        defaults.success(data);

                    }

                }

            }

    }

    php页面(只示例post方法):

    <?php

        $uname=$_POST['username'];

        $passw=$_POST['password'];

    echo '{"name":" '.$uname.' ","password":" '.$passw.' "}';

    此处字符串拼接特别需注意’’单引号和””双引号的衔接

    ?>

    3.jsonp基础知识(通过动态创建<script>标签的src属性访问数据,服务器端响应的内容是函数调用)

    1)通过静态<script>标签跨域访问数据

    <script async(加上这个属性后,就不能获取数据,因为async属性表示异步加载,js要想获取数据必须是同步加载,跨域获取数据时这个属性得删除)type="text/javascript" src="http://tabb.com/tabbdata.php"></script>

    tabb.com是配置的另一台虚拟主机,形成跨域访问

    <script>

        console.log(data.name);

        console.log(data.password);     可以获取返回的js代码

    </script>

    php页面:

    <?php

        $arr=array("name"=>"Tom","password"=>"123");

        echo 'var data = '.json_encode($arr);   返回一段js代码

    ?>

    2)使用动态创建<script>标签的方法跨域访问数据(jsonp本质)

        <script>

            var script = document.createElement("script");

            script.src = "http://tabb.com/tabbdata.php?callback=abc";

            向后台动态传递函数名

            var head = document.getElementsByTagName("head")[0];

            head.appendChild(script);

            console.log(data.name);  此处会报错

    直接这样写访问不到数据,因为动态创建<script>标签,默认为异步请求访问模式

            function abc (data){ 

     通过申明一个函数,在后台调用的方法异步访问数据,函数名是任意的,但由于是全局变量,所以函数名最好是字母和随机数字相结合,类似jQuery中的名字

                console.log(data.name,data.password)

            }

    或者通过添加load事件,将获取数据的代码写在发送请求的<script>标签添加的load事件之中,也可以动态获取数据

    script.addEventListener(“load” , function(){

    console.log(data)

    } )

    其他跨域方法:window.name iframe postMessage

    </script>

    php页面:

    <?php

        $arr=array("name"=>"Tom","password"=>"123");

        echo 'var data = '.json_encode($arr);   直接访问时不能返回数据

            $fn=$_GET['callback'];  使用get请求动态获取函数名

            echo $fn.'('.json_encode($arr).')';通过调用函数的方法可以访问数据

    ?>

    3jQuery方法中jsonp的基本使用

        btn1.onclick = function () {

            $.ajax({

                url: "http://tabb.com/tabbdata.php",

                type: "get",

                dataType: "jsonp",

                jsonp:"abc", 设定jsonp中传递函数的名称,默认为callback

                success: function (data) {

                    console.log(data);

                },

                error: function () {

                    console.log("failure");

                }

            });

    }

    php页面:

    <?php

            $arr=array("name"=>"Tom","password"=>"123");

            $fn=$_GET['abc'];

            echo $fn.'('.json_encode($arr).')';

    ?>

    4模仿jQuery方法封装ajax()函数包含jsonp

        function ajax(obj) {

            var defaults = {    设置默认值

                url: '#',

                type: 'get',

                async: true,

                dataType: 'text',

                jsonp: 'callback',

                data: {},

                success: function (data) {

                }

            }

            for (var key in obj) {

                defaults[key] = obj[key];

            }

            if (defaults.dataType == 'jsonp') {   本封装的核心思想

                ajax4Jsonp(defaults);

            } else {

                ajax4Json(defaults);

            }

            function ajax4Jsonp(defaults) {   封装jsonp函数

                var cbName = 'jQuery' + ('1.12.2' + Math.random()).replace(/D/g, "") + '_' + (new Date().getTime());

    模仿jQuery方法拼接传递函数的访问参数,1.12.2jQuery版本号

                if (defaults.jsonpCallback) {

     设置传递函数访问参数可以修改,及不按照上述长字符串方法进行传递

                    cbName = defaults.jsonpCallback;

                }

                window[cbName] = function (data) {

    window添加cbName,此cbName以变为仿jQuery长字符串或传递的jsonpCallback值,同时调用这个函数

                    obj.success(data);

                }

                var param = '';

                for (var attr in defaults.data) {

                    param += attr + '=' + defaults.data[attr] + '&';

                }

                if (param) {

                    param = param.substring(0, param.length - 1);

                    param = '&' + param;  因为多了cbName所以在前面加上’&’

                }

                var script = document.createElement("script");

                script.src = defaults.url + '?' + defaults.jsonp + '=' + cbName + param;

                var head = document.getElementsByTagName("head")[0];

                head.appendChild(script);

            }

     

            function ajax4Json(defaults) {   此处封装与第二章(6)一样

                var xhr = null;

                if (window.XMLHttpRequest) {

                    xhr = new XMLHttpRequest();

                } else {

                    xhr = new ActiveXObject("Microsoft.XMLHTTP");

                }

                var param = '';

                for (var attr in defaults.data) {

                    param += attr + '=' + defaults.data[attr] + '&';

                }

                if (param) {

                    param = param.substring(0, param.length - 1);

                }

                if (defaults.type == "get") {

                    defaults.url += "?" + encodeURI(param);

                }

                xhr.open(defaults.type, defaults.url, defaults.async);

                var dataPrama = null;

                if (defaults.type == "post") {

                    dataPrama = param;

                    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

                }

                xhr.send(dataPrama);

                if (!defaults.async) {

                    if (defaults.dataType == "json") {

                        return JSON.parse(xhr.responseText);

                    } else {

                        return xhr.responseText;

                    }

                }

                xhr.onreadystatechange = function () {

                    if (xhr.readyState == 4) {

                        if (xhr.status == 200) {

                            var data = xhr.responseText;

                            if (defaults.dataType == "json") {

                                data = JSON.parse(data);

                            }

                            defaults.success(data);

                        }

                    }

                }

            }

    }

    4.模板引擎(模板+数据à静态页面)拼接字符串模板

    artTemplate(腾讯)(主要以此模板为例,性能优越)

    官方文档:https://github.com/aui/artTemplate

    简单示例代码:

        <script type="text/html" id="bookList">   注意typetext/html

            <h1>{{title}}</h1>

            {{if books}}     注意语法格式为双花括号{{}}

                    {{each books as value i}}

                        <div>{{value}}</div>

                    {{/each}}

            {{/if}}

        </script>

        <script>

            window.onload = function () {

                var data = {

                    title: '四大名著',

                    books: ['三国演义', '水浒传', '西游记', '红楼梦']

                };

                var html = template('bookList', data);

    bookList参数对应传入模板的iddata参数就是需要渲染的数据

                var con = document.getElementById('container');

                con.innerHTML=html;

            }

        </script>

  • 相关阅读:
    Git 简要教程
    SDK更新失败问题解决
    常用安卓操作
    MongoDB本地安装与启用(windows 7/10)
    windows 快捷键收集
    windows 常用命令
    Lambda Expression Introduction
    对 load_breast_cancer 进行 SVM 分类
    Support Vector Machine
    使用 ID3 对 Titanic 进行决策树分类
  • 原文地址:https://www.cnblogs.com/Tabb/p/6517514.html
Copyright © 2020-2023  润新知