• Ajax+PHP简单实例


    一直用jQuery库,如果不用,还会使用Ajax吗?

    参考书:1.PHP与jQuery开发实例;2.Ajax基础教程 (图灵程序设计丛书就是好)

    把书1里jQuery代码换成原生JS,实例1是选择省份出现城市列表,实例2改成了联动下拉框。

    一、实例1

    html代码:

    <form>
        <p>
            <label for="province">省份:</label>
            <select id="choice" name="province">
                <option value="">请选择</option>
                <option value="JiangSu">江苏省</option>
                <option value="AnHui">安徽省</option>
         </select>
        </p>
        <div id="result"></div>    
    </form>                

    js代码:

                var xmlHttp;
                function createXMLHttpRequest() {
                    if (window.ActiveXObject) {
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    else if (window.XMLHttpRequest) {
                        xmlHttp = new XMLHttpRequest();
                    }
                }
    function doSearch(event) { var province = document.getElementById("choice").value; createXMLHttpRequest(); xmlHttp.onreadystatechange = handleStateChange; xmlHttp.open("GET", "data.php?province="+province, false); xmlHttp.send(null); }

           //也常取名callBack
    function handleStateChange() { if(xmlHttp.readyState == 4){ if(xmlHttp.status == 200){ parseResults(); } } } function parseResults() { document.getElementById("result").innerHTML = xmlHttp.responseText; }
           //下拉框值改变出发事件
    var evtObject = document.getElementById("choice"); if(evtObject.addEventListener){ evtObject.addEventListener("change",doSearch,false); } else if(evtObject.attachEvent){ evtObject.attachEvent("onchange",doSearch); }

    PHP代码:

    <?php
        if($_GET['province']=='JiangSu'){
            $citys = array('南京', '苏州','南通','无锡');    
            echo getHTML($citys);
        }
        else if($_GET['province']=='AnHui'){
            $citys = array('合肥', '芜湖','黄山','宣城');
            echo getHTML($citys);
        }
        function getHTML($citys){
             $strResult = '<ul>';
            for($i=0; $i<count($citys); $i++){
            $strResult.='<li>'.$citys[$i].'</li>';
            }
            $strResult.='</ul>';
        
        return $strResult;
        }
    ?>

    插曲:原书实例中result是<p id="result"></p>,结果在ie6下 innerHTML 报错,所以换成了div。

    二、联动下拉框

    XMLHttpRequest对象提供了2个可以用来访问服务器响应的属性:1. responseText; 2. responseXML。

    第二个实例采用从XML文件中读取数据。

    XML代码

    <?xml version="1.0" encoding="UTF-8"?>
    <provinces>
        <province index="1" name="JiangSu">
            <name>江苏</name>
            <citys>
                <city>南京</city>
                <city>苏州</city>
                <city>南通</city>
                <city>无锡</city>
            </citys>
        </province>
        <province index="2" name="AnHui">
            <name>安徽</name>
            <citys>
                <city>合肥</city>
                <city>芜湖</city>
                <city>黄山</city>
                <city>宣城</city>
            </citys>
        </province>
    </provinces>

    PHP代码:

    <?php
        header("Content-Type: text/xml"); //必须指明,responseXML才能接收
        libxml_use_internal_errors(true); //抑制xml错误,便于代码自行处理错误
        $objXML = simplexml_load_file('data.xml');
        if(!$objXML){
            $errors = libxml_get_errors();
            foreach($errors as $error){
                echo $errors->message,'<br/>';
            }
        } else {
            if($_GET['province']=='JiangSu'){
                foreach($objXML->province as $province){
                    if($province->name == "江苏"){            
                        echo $province->citys->asXML();  //asXML(),返回xml字符串
                    }
                }    
            } else if ($_GET['province']=='AnHui'){
                foreach($objXML->province as $province){
                    if($province->name == "安徽"){            
                        echo $province->citys->asXML();
                    }
                }    
            }
        }
    ?>

     html代码:

        <form>
                <p>
                    <label for="province">省份:</label>
                    <select id="choice" name="province">                
                        <option value="JiangSu">江苏省</option>
                        <option value="AnHui">安徽省</option>
                    </select>
                    <label for="citys">城市:</label>
                    <select id="city" name="citys">  
                    </select>
                </p>     
            </form>

    JS代码:

    var xmlHttp;
                function createXMLHttpRequest() {
                    if (window.ActiveXObject) {
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    else if (window.XMLHttpRequest) {
                        xmlHttp = new XMLHttpRequest();
                    }
                }
                function doSearch(event) {
                    
                    var province = document.getElementById("choice").value;
                    createXMLHttpRequest();
                    xmlHttp.onreadystatechange = handleStateChange;
                    xmlHttp.open("GET", "data.php?province="+province, false);                
                    xmlHttp.send(null);
                }
                function handleStateChange() {
                    
                    if(xmlHttp.readyState == 4){
                        if(xmlHttp.status == 200){
                            //clearPreviousResults();                        
                            parseResults();
                        }
                    }
                }        
                function parseResults() {
                    var xmlDoc = xmlHttp.responseXML;            
                    // var htmlStr="";
                    var cityName;
                    if(xmlDoc.getElementsByTagName("city")[0].text){
                        cityName = "text";    //IE6下 要用text 取 内容
                    } else {
                        cityName = "textContent";    //chrome下 要用textContent 取内容
                    }            
                    for(var i=0;i<xmlDoc.getElementsByTagName("city").length;i++){
                        document.getElementById("city").options[i] = new Option(xmlDoc.getElementsByTagName("city")[i][cityName],i)                  
                    }               
                }
                doSearch(); //加载页面的时候先执行一次,因为去掉了“请选择”
                var evtObject = document.getElementById("choice");
                if(evtObject.addEventListener){        
                    evtObject.addEventListener("change",doSearch,false);
                }
                else if(evtObject.attachEvent){        
                    evtObject.attachEvent("onchange",doSearch);
                }

    插曲:ie6下,取城市名 得用 xmlDoc.getElementsByTagName("city")[0].text,而Chrome下用textContent,因此我用字符串cityName代替,并且取城市名的时候用了数组写法,不能用“.”取值。 select 在ie6下 设置innerHTML,页面没效果,但值存在。

    以上2个实例在ie6和chrome下均可运行。哎,兼容性的确让人头疼,第二个实例JS部分花了好长时间才完全调好。时间太晚了,都没劲写感想了,洗洗睡了.......

  • 相关阅读:
    JSON数据的中文乱码问题
    使用json-lib进行Java和JSON之间的转换
    struts2 struts.xml配置文件详解
    php位运算的应用(转)
    oracle数据库导入导出的dmp(转)
    Java多线程-工具篇-BlockingQueue(转)
    javaweb之Filter详解(转)
    MYSQL写入数据时报错ERROR 1366 (HY000): Incorrect string value: 'xE8x8BxB1xE5xAFxB8...' for c 插入中文不能插入
    插入中文错误ERROR 1406 (22001): Data too long for column 'name' at row 1
    SQL语句处理一些修改、新增、删除、修改属性操作(MySql)
  • 原文地址:https://www.cnblogs.com/zhyxBlog/p/3301906.html
Copyright © 2020-2023  润新知