zoukankan      html  css  js  c++  java
  • Ajax前台与Mod_python后台应用示例

    Ajax的好处就是可以实现无刷新动态更新。后台配合Mod_python程序,使后台处理变得非常高效简洁。【index.html】

    <HTML>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Ajax测试页面</title>
    
    <script language="JavaScript">
    
    function checkForm(){
    	var messageDiv = document.getElementById("msgDiv");
    	var product = document.getElementById("product");
    	var pvalue = product.options[product.selectedIndex].value;
        var svalue = document.getElementById("sn").value;
    
    	if(svalue == ""){
    		messageDiv.style.color = "Red";
    		messageDiv.innerHTML = "请输入序列号!";
    		return false;
    	} 
        //alert(svalue);
    	//var par = "pv=" + pvalue + "&sv=" + svalue
    	var par = "sv=" + svalue
    
        if (pvalue == 0){
    		sendRequest("mypython/pro1", par);
    		return true;
        }else{ 
    		messageDiv.innerHTML = "抱歉,该产品信息尚未入库!";
    		return false;
        }
    }
    
    
    function sendRequest(url, par){
    	//注意,这里定义的是一个局部变量,即每调用一次都创建一个新的XMLHttpRequest对象,即发送一个新的请求
    	var xmlHttp = false; 
    	if(window.XMLHttpRequest){ //for mozilla
    		xmlHttp = new XMLHttpRequest();
    	}else if(window.ActiveXObject){//for IE
    		try{
    			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    		}catch(e){
    			try{
    				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    			}catch(e){ }
    		}
    	}
    	xmlHttp.open("POST",url,true);
    	xmlHttp.onreadystatechange = function(){
    	if(xmlHttp.readyState == 4) {
    		if(xmlHttp.status == 200) {
    			//alert("123456");
    			var mdiv = document.getElementById("msgDiv");
    			mdiv.style.color = "Red";
    			mdiv.innerHTML = xmlHttp.responseText;
    		}else
    			alert("Error!" + "
    Status code is: " + xmlHttp.status + "
    Status text is: " + xmlHttp.statusText);
    		}
    	}
    	xmlHttp.setRequestHeader("Content-length", par.length);
    	xmlHttp.setRequestHeader("Content-Type","text/xml");
        //xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=utf-8");
    	xmlHttp.send(par); // 名=值&名=值&名=值...
    }
    
    
    
    </script>
    
    
    </head>
    <Body style="background-color:#e0f4df">
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <div align="center">
    
    <!--为什么不能用Form表单,因为表单必需有返回,会导致当前页面闪烁或是跳转 -->
    <!--form name="myform" id="myform" action="" method="POST" onsubmit="return checkForm()"--> 
    <table border="1px" cellspacing="0px" cellpadding="0px">
    <tr><td>请选择产品的型号:</td><td>
    <select id="product">
      <option value ="0">3D打印机</option>
      <option value ="1">3D扫描仪</option>
    </select>
    </td></tr>
    <tr><td>请输入产品序列号:</td><td>
      <input id="sn" type="text" size="14" value="" />
    </td></tr>
    <tr><td colspan="2" align="center">
    <button onClick="return checkForm()">点击查询</button>
    </table>
    <!--/form -->
    </div>
    <br/>
    <div align="center" id="msgDiv"></div>
    </Body>
    </HTML>
    

     然后就是后台的mod_python程序:【mypython.py】

    #!/usr/bin/python
    # -*-coding:UTF-8-*-
    
    from mod_python import apache, util
    from MySQLdb import *
    
    def pro1(req, sv):
        svalue = sv
        req.write(svalue)
    

    只要保证前台Ajax所Post的参数名称 与 mod_python 指定的参数名称一致(如“sv”),就可以获取前台传递过来的参数了。

    该方法可以在Firefox上完美的工作,但在其它浏览器则返回501:method not implemented 错误信息。

    搜索了很久发现是由于Ajax请求发送的标准数据类型:

    xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=utf-8")

    导致的。好像是mod_python/util.py 无法正确解析,应该是mod_python的一个bug.

    最终没有找到好的解决方法,最后只能选择一个替代方案:Form + iFrame 的方式来实现无刷新提交。【index.html】

    <HTML>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>iFrame测试页面</title>
    
    <script language="JavaScript">
    
    function checkForm(){
    	var messageDiv = document.getElementById("msgDiv");
    	var product = document.getElementById("product");
    	var pvalue = product.options[product.selectedIndex].value;
        var svalue = document.getElementById("sn").value;
    
    	if(svalue == ""){
    		messageDiv.style.color = "Red";
    		messageDiv.innerHTML = "请输入序列号!";
    		return false;
    	} 
        if (pvalue == 0){ //R2
    		return true;
        }else{ 
    		messageDiv.innerHTML = "抱歉,该产品信息尚未入库!";
    		return false;
        }
    }
    
    
    function callback(msg){
        var mdiv = document.getElementById("msgDiv");
        mdiv.innerHTML = msg;
    }
    
    
    
    </script>
    
    
    </head>
    <Body style="background-color:#e0f4df">
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <div align="center">
    
    <!--为什么不能用Form表单,因为表单必需有返回,会导致当前页面闪烁或是跳转 -->
    <form name="myform" id="myform" action="mypython/pro1" method="POST" target="i_frame" onsubmit="return checkForm()"> 
    <table border="1px" cellspacing="0px" cellpadding="0px">
    <tr><td>请选择产品的型号:</td><td>
    <select name="pv" id="product">
      <option value ="0">3D打印机</option>
      <option value ="1">3D扫描仪</option>
    </select>
    </td></tr>
    <tr><td>请输入产品序列号:</td><td>
      <input name="sv" id="sn" type="text" size="14" value="" />
    </td></tr>
    <tr><td colspan="2" align="center">
    <input type="submit" value="点击查询"></td></tr>
    </table>
    </form>
    </div>
    <br/>
    <div align="center" id="msgDiv"></div>
    <iframe name="i_frame" width="1px" height="1px" style="display:none" ></iframe>
    </Body>
    </HTML>
    

     注意,必需定义一个iframe,但width与height不能设置为0px 。然后form里面的target属性必需指定成iframe的name值(如“sv”)。Form里面需要提交到后台的节点需设置name属性。

    后台mod_python程序:【mypython.py】

    #!/usr/bin/python
    # -*-coding:UTF-8-*-
    
    from mod_python import apache, util
    from MySQLdb import *
    
    def pro1(req, sv):
        svalue = str(sv)
        return "<html><body onload="javacript: parent.callback('" + svalue + "')"></body></html>"
    

    必需使用return返回数据前台才能收到。

    可以看到返回的是一段简单的HTML代码,该代码会返回到前台的iFrame里面。且一加载就会运行一句javascript代码。该javascript代码会调用前台父页面的callback()函数把返回的信息输出到指定的DIV之中。

    该方法可以实现完美的浏览器兼容。

  • 相关阅读:
    教你如何上传项目到GitHub
    Spring Boot日志使用
    Github库名命名规范
    failed to resolve org.junit.platform
    SecureCRT 关键字高亮显示
    curl 命令
    idea中展开折叠的文件夹
    python官网打不开
    小工具下载地址汇总
    Navicat12 for Mysql激活
  • 原文地址:https://www.cnblogs.com/wzc0066/p/3303769.html
Copyright © 2011-2022 走看看