zoukankan      html  css  js  c++  java
  • javascript:巧用eval函数组装表单输入项为json对象

    在ajax方式做web开发时,经常会遇到会保存前,收集表单输入项,组成json对象,然后把对象直接post到服务端的场景

    常规做法是在js里写类似如下的代码:

    var myObj = {};  
    
    myObj.x = document.getElementById("x").value;  
    
    myObj.y = document.getElementById("y").value; 
     
    //...  
    
    //然后ajax post或get提交
    

    表单元素不多的时候,这样还好,但是如果一个表单有好几十项甚至更多输入项的时候,写这种代码就太费劲了。

    好在javascript中有一个邪恶的eval函数,可以帮我们完成一些类似c#反射的工作,比如下面这样:

     eval('A={}');
     if (A.b==undefined)
     {
      A.b = {};
     }
     eval('A.b.c = 1');
     alert(A.b.c);
    

     这样,我们就动态创建了一个复合对象A,明白其中原理后,可以对表单做些改进:

    运单号:<input type="text" name="AwbPre" value="112" style="40px"/>-<input type="text" name="AwbNo"  value="12312311"/><br/>
    结算方式:
    <select name="SettlementMode" style="100px">
    	<option value="CASH" selected="selected">现金</option>
    	<option value="MONTH">月结</option>
    </select>
    <br/>
    不需要赋值的属性:<input type="input" name="NotMe" value="NotMe ..." isModel="false"/>
    
    
    <script type="text/javascript">
    
    
    	function setFormModel(modelName){
    		eval(modelName + "={}");
    		var inputArr = document.getElementsByTagName("INPUT");
    		for(var i=0;i<inputArr.length;i++){
    			var isModel = inputArr[i].getAttribute("isModel");
    			var itemName = inputArr[i].name;
    			var itemValue = inputArr[i].value;			
    			if(isModel!="false"){
    				eval(modelName + "." + itemName + "='" + itemValue + "';");
    			}			
    		}
    
    		var selectArr = document.getElementsByTagName("SELECT");
    		for(var i=0;i<selectArr.length;i++){
    			var isModel = selectArr[i].getAttribute("isModel");
    			var itemName = selectArr[i].name;
    			var itemValue = selectArr[i].value;			
    			if(isModel!="false"){
    				eval(modelName + "." + itemName + "='" + itemValue + "';");
    			}			
    		}
    		return modelName;		
    	}
    
    	setFormModel("AwbModel");
    
    	alert("单号:" + AwbModel.AwbPre + "-" + AwbModel.AwbNo + "\n结算方式:" + AwbModel.SettlementMode + "\n不该有的属性:" + AwbModel.NotMe);
    
    </script>
    

     这样,只要form元素的name属性正确设置,需要收集表单对象时,调用一下setFormModel函数,就能快速得到一个json对象(当然这只是示例,仅处理了一级属性的情况,如果有多级属性,大家自己去扩展吧,无非就是字符串上做些文章)

  • 相关阅读:
    Redis下载及安装(windows版)
    orcal 游标使用
    ORCAL查看表空间情况
    通过解密f5的cookie信息获得服务器真实内网IP
    jsonp挖掘技巧
    PoCBox
    burpsuite爆破401认证
    lkwa靶场之盲RCE
    redis未授权访问
    docker删除镜像+端口占用
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/3016662.html
Copyright © 2011-2022 走看看