• 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对象(当然这只是示例,仅处理了一级属性的情况,如果有多级属性,大家自己去扩展吧,无非就是字符串上做些文章)

  • 相关阅读:
    c# Action,Func,Predicate委托
    c# 匿名方法
    IIS网站无法启动,提示 另一个程序正在使用此文件
    c# Http下载
    mciSendString详解(转)
    【NOIP2006PJ】数列(sequence)题解
    2020.04.29【NOIP普及组】模拟赛C组30总结
    【USACO 2019 December Silver】Milk Visits题解
    【USACO 2019 February Bronze】Measuring Traffic 题解
    【USACO 2019 February Bronze】Measuring Traffic 题解
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/3016662.html
Copyright © 2020-2023  润新知