/*打印动态函数*/ printFun(funName,expString,digital[x][0]); } }else{ var digital = parseDigital(express); var symbol = parseSymbol(express); var expString = constructFunBody(digital,symbol);
var funName = "cal"+digital[0]+"()";
for(jx = 1;jx < digital.length;jx++){ funNameTotal[getInputIndex(digital[jx])] += funName+";"; } printFun(funName,expString,digital[0]); } }/** *初始化input数组 */ var objInput = document.getElementsByTagName("INPUT");//取得所有input数组 var funNameTotal = new Array(); /** * *初始化主函数 */ function init(){ try{ /*取得INPUT集合*/ var inputLen = objInput.length;
*定义正则表达式
*/
var digitalExp = /\W+/i;
//var symbolExp = /^(\+)*(\-)*(\*)*(\/)*(\>)*(\=)*$/i;
var symbolExp = /\w*/i;/**
*校验表达式的合法性
*/
function validExp(exp){
if(exp == "") return false;
if(exp == ";") return false;
if(exp == " ") return false;
if(exp.test(/\0/)) return false;
return true;
}/**
*去除空格函数
*/
function String.prototype.Trim(){
return this.replace(/\s*/g,"");
}/**
*
*字符串转换浮点数
*/
function char2double(str){
if (str=="")
return 0.00;
else return parseFloat(str);
}/**
*
*字符串转换浮点数
*/
function char2int(str){
if (str=="")
return 0;
else return parseInt(str);
}/**
*
*拆分数字数组
*/
function parseDigital(express){
return express.split(digitalExp);
}/**
*
*拆分公式数组
*/
function parseSymbol(express){
return express.split(symbolExp);
}/**
*
*打印输出计算函数
*/
function printFun(funName,funBody,inputName){
var s;
s = '<'+'script language=javascript>';
s += 'function '+funName+'{';
s += 'with(document.all){';
s += funBody+';';
//s += 'FormatNumber('+inputName+',2);';
s += '}';
s += '}';
s += '<'+'/script>';
document.writeln(s);
}/**
*构造数学计算表达式String constructFunBody(digital,symbol),两个参数均为数组
*/
function constructFunBody(digital,symbol){
var tempChar = '';//转换后的计算表达式
var tempbnlj1 = "value";
var tempbnlj2 = "value";
/*判断计算dataFld 或者value*/
if(digital[0] == digital[1]){
tempbnlj1 = "dataFld";
}
else if(digital[0] == digital[2]){
tempbnlj2 = "dataFld";
}
/*构造计算表达式*/
for(m = 0; m < digital.length; m++){
if(symbol[m] != null){
if (m == 0)
tempChar += digital[m]+".value"+symbol[m];
else
tempChar += "char2double("+digital[m]+"."+tempbnlj1+")"+symbol[m];
}else
tempChar += "char2double("+digital[m]+"."+tempbnlj2+")";
}
return tempChar;
}
/**
*绑定动态函数
*/
function bondExpFun(inputName,funNameTotal){
try{
with(document.all){
for(n = 0; n < inputName.length; n++){
if(funNameTotal[n] == "")
continue;
if(inputName[n].readOnly != true ){
inputName[n].onchange = new Function(funNameTotal[n]);
}
else
inputName[n].onpropertychange = new Function(funNameTotal[n]);
}
}
}catch(E){}
}/**
*取索引函数;根据inputname取得objInput中的索引值
*/
function getInputIndex(inputname){
for(kv = 0;kv < objInput.length;kv++){
if(objInput[kv].name == inputname){
return kv;
break;
}
}
}/**
*
*解析express表达式,打印动态生成的函数,并将其绑定到相应的INPUT
*/
function parseFun(express){
/*包含一个以上的表达式时*/
if(express.indexOf(';') > -1){
var expArray = express.split(';');
var digital = new Array();
var symbol = new Array(); /*将拆分结果分别存入两个临时数组*/
for(kx = 0; kx <expArray.length; kx++){
digital[kx] = parseDigital(expArray[kx]);
symbol[kx] = parseSymbol(expArray[kx]);
}
/*遍历表达式数组,输出动态函数*/
for(x = 0;x < digital.length; x++){
/*构造动态函数expString*/
var expString = constructFunBody(digital[x],symbol[x]);
/*动态动态函数名funName*/
var funName = "cal"+digital[x][0]+"()";
for(jx = 1;jx < digital[x].length;jx++){
funNameTotal[getInputIndex(digital[x][jx])] += funName+";";
}
/*打印动态函数*/
printFun(funName,expString,digital[x][0]);
}
}else{
var digital = parseDigital(express);
var symbol = parseSymbol(express); var expString = constructFunBody(digital,symbol);
var funName = "cal"+digital[0]+"()";
for(jx = 1;jx < digital.length;jx++){
funNameTotal[getInputIndex(digital[jx])] += funName+";";
}
printFun(funName,expString,digital[0]);
}
}/**
*初始化input数组
*/
var objInput = document.getElementsByTagName("INPUT");//取得所有input数组
var funNameTotal = new Array();
/**
*
*初始化主函数
*/
function init(){
try{
/*取得INPUT集合*/
var inputLen = objInput.length;
/*根据input数组长度初始化动态函数数值funNameTotal为空*/
for(ix = 0 ;ix < inputLen ;ix++){
funNameTotal[ix] = "";
}
/*遍历INPUT,如果存在计算公式,则解析之*/
for(k = 0; k < inputLen; k++){
if(typeof(objInput[k].exp) == "undefined"&&objInput[k].exp != '')
continue;
var express = objInput[k].exp;
//if(exp != ""){
parseFun(express.Trim());
//}
}
/*绑定所有动态函数*/
bondExpFun(objInput,funNameTotal);
}catch(E){}
}
计算关系a3=a1+a2;<input name=a1>
<input name=a2>
<input name=a3 exp="a3=a1+a2">