不知道这个问题是不是很简单,方便的话不妨看下V2

是你 2004-10-26 03:25:30
感谢你查看这个贴子,如果方便的话,请帮我解决如下的问题
一个二维数组,像这样:
array(array(pid=>001,pname=>产品名1,pprice=>产品价格1),
array(pid=>002,pname=>产品名2,pprice=>产品价格2),
array(pid=>003,pname=>产品名3,pprice=>产品价格3),
)
相用JS处理成这样:
一个下拉框pid(存放产品pid),
一个下拉框list(存放产品名列表),
再一个文本框pprice(用于存放产品价格),
再一个文本框q(用于输入产品数量),
最后一个文本框result(用于存放q和pprice相乘的结果)
当输入pid时,下拉框list跳到相应的产品,并将该产品的价格显示于文本框pprice;当在文本框q输入数字时,直接在文本框result显示相乘结果(精确到小数后两位)

最重要的一点,以上的文本框在同一页面的form内可以以任意多份并独立操作,最后把所有的result加起来并显示

顺便,pprice,q两个文本框只能输入数字;
我的数组不一定非存不二维数组不可,也可弄成别的格式;
不输入pid而直接选下拉框,效果也应当一样。


非常感谢!大概就是下面代码的显示的效果,在一个页面的form内多份显示并独立操作,最后把所有的result加起来并显示就OVER了

<HTML>
<HEAD>
</HEAD>
<BODY onLoad="Init()">

<form>
<select name="pid" onChange="changelist(this.selectedIndex)">
</select>
<select name="list" onChange="changelist(this.selectedIndex)">
</select>
<input name="pprice" type="text" id="pprice" size="12" onpropertychange="calc()">*
<input name="q" type="text" id="q" size="8" onpropertychange="calc()">=
<input name="result" type="text" id="result">

<script language="JavaScript" type="text/JavaScript">
function Info(pid,pname,pprice){
this.pid=pid
this.pname=pname
this.pprice=pprice
}
//以下数据由数据库取得在服务器端产生
var PInfo =new Array(6)//这个3根据记录集的数目定
//下面是用循环来产生
PInfo[0]=new Info("001","墨盒","360.00")
PInfo[1]=new Info("002","打印纸","60.00")
PInfo[2]=new Info("003","打印机","2200.00")
PInfo[3]=new Info("004","计算机","8400.00")
PInfo[4]=new Info("005","碎纸机","720.00")
PInfo[5]=new Info("A006","碎纸机8","7890.00")
//数据结束
function Init(){
for (var i=0;i<PInfo.length;i++){
document.all.pid.options[i]=new Option(PInfo[i].pid)
document.all.list.options[i]=new Option(PInfo[i].pname)
document.all.pprice.value=PInfo[i].pprice
}
}
function calc(){
if (document.all.q.value.length>0){
document.all.result.value=document.all.pprice.value*document.all.q.value
}
}
function changelist(x){
document.all.pid.options[x].selected=true;
document.all.list.options[x].selected=true;
document.all.pprice.value=PInfo[x].pprice
}
</script>
</BODY>
</HTML>
...全文
176 17 打赏 收藏 举报
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
JK_10000 2004-10-27
  • 打赏
  • 举报
回复
回复人: duoduobaba(避雷针) ( ) 信誉:100 2004-10-27 01:52:00 得分: 0

----------
惭愧啊,俺的代码过长。
JK_10000 2004-10-27
  • 打赏
  • 举报
回复
回复人: caitang8(caitang) ( ) 信誉:97 2004-10-26 23:59:00 得分: 0

to :duoduobaba(避雷针)
想过这样改,不过一改就好多地方出错,昨回事?

--------------------------------------


原来你只是“想过”,但一直都没“相同ID的text做数组处理”??????
JK_10000 2004-10-27
  • 打赏
  • 举报
回复
回复人: caitang8(caitang) ( ) 信誉:97 2004-10-26 20:10:00 得分: 0

----------------
有这回事吗?
不懂php.所以用以下方式做了下测试:
1.将form的method改成get,将其action改成aaa.htm
2.完成按钮的onclick改成document.frm.submit();
3.运行页面,添加三笔记录,点击提交
4.查看接收页的url,如下:
res://C:\WINNT\System32\shdoclc.dll/syntax.htm#unsaved:///aaa.htm?
pid=001&list=%C4%AB%BA%D0&pprice=7890.00&q=&result=0
&pid=001&list=%C4%AB%BA%D0&pprice=7890.00&q=&result=0
&pid=001&list=%C4%AB%BA%D0&pprice=7890.00&q=&result=0
&resultTotal=0

数据都已传出,没见异常啊??!!
duoduobaba 2004-10-27
  • 打赏
  • 举报
回复
写完了才看了JK_10000(JK)的代码,汗!
是你 2004-10-27
  • 打赏
  • 举报
回复
谢谢各位,总算是搞定了。结帐!
duoduobaba 2004-10-27
  • 打赏
  • 举报
回复
<HTML>
<HEAD>
</HEAD>
<BODY onLoad="Init(3)">
<div id="bmm">
</div>
<input type="button" value="增加一行" onClick="document.all.bmm.innerHTML+=theRow;Init1(document.all.pid.length-1);hm++">
总计:<input name="summed" type="text" id="summed" readonly="true">
<script language="JavaScript" type="text/JavaScript">
function Info(pid,pname,pprice){
this.pid=pid
this.pname=pname
this.pprice=pprice
}
//以下数据由数据库取得在服务器端产生
var theRow="<div><select name='pid' onChange='changelist(this.selectedIndex)'></select><select name='list' onChange='changelist(this.selectedIndex)'>"
theRow+="</select><input name='pprice' type='text' id='pprice' size='12' onpropertychange='calc()' readonly='true'>* "
theRow+="<input name='q' type='text' id='q' size='8' onpropertychange='calc()' onkeypress='var kc=window.event.keyCode;if(kc>32 && (kc>57 || kc<48)){return false;}'>= <input name='result' type='text' id='result' onpropertychange='summed()'></div>"
var hm
var PInfo =new Array(6)//这个3根据记录集的数目定
//下面是用循环来产生
PInfo[0]=new Info("001","墨盒","360.00")
PInfo[1]=new Info("002","打印纸","60.00")
PInfo[2]=new Info("003","打印机","2200.00")
PInfo[3]=new Info("004","计算机","8400.00")
PInfo[4]=new Info("005","碎纸机","720.00")
PInfo[5]=new Info("A006","碎纸机8","7890.00")
//数据结束
function Init(idx){
hm=idx
for (var i=0;i<idx;i++){
document.all.bmm.innerHTML+=theRow;
}
Init1(-1)
}
function Init1(idx){
if(idx<0){
for (var j=0;j<document.all.pid.length;j++){
for (var i=0;i<PInfo.length;i++){
document.all.pid[j].options[i]=new Option(PInfo[i].pid);
document.all.list[j].options[i]=new Option(PInfo[i].pname);
document.all.pprice[j].value=PInfo[i].pprice;
}
}
}else{
for (var i=0;i<PInfo.length;i++){
document.all.pid[idx].options[i]=new Option(PInfo[i].pid);
document.all.list[idx].options[i]=new Option(PInfo[i].pname);
document.all.pprice[idx].value=PInfo[i].pprice;
}
}
}
function calc(){
var obj=event.srcElement.parentElement
if (obj.children[2].value.length>0 && obj.children[3].value.length>0){
obj.children[4].value=obj.children[2].value*obj.children[3].value;
}else{
obj.children[4].value=0;
}
}
function changelist(x){
var obj=event.srcElement.parentElement
obj.children[0].options[x].selected=true;
obj.children[1].options[x].selected=true;
obj.children[2].value=PInfo[x].pprice;
}
function summed(){
if (hm==1){
document.all.summed.value=document.all.result.value;
}else{
var summed=0;
for(var i=0;i<hm;i++){
if (document.all.result[i].value.length>0){summed+=parseFloat(document.all.result[i].value);}
}
document.all.summed.value=summed;
}
}
</script>
</BODY>
</HTML>
是你 2004-10-26
  • 打赏
  • 举报
回复
to :duoduobaba(避雷针)
想过这样改,不过一改就好多地方出错,昨回事?
duoduobaba 2004-10-26
  • 打赏
  • 举报
回复
相同ID的text做数组处理
是你 2004-10-26
  • 打赏
  • 举报
回复
JK_10000(JK)兄,能否再修改一下,谢谢
是你 2004-10-26
  • 打赏
  • 举报
回复
我只是用PHP打印出传过来的值:<?PHP print_r($_POST);?>错不了的。
如果增加明细的时候下面这些代码的name属性不动态改变的话,那前面的数据岂不都被覆盖掉了?


<table id="tbDetailPrepare" style="display:none">
<tr>
<td ><input type="checkbox" name="record_select" ></td>
<td >
<select name="pid" onChange="changelist(this);">
</select>
<select name="list" onChange="changelist(this);">
</select>
<input name="pprice" type="text" id="pprice" size="12" onpropertychange="calc(this);" >*
<input name="q" type="text" id="q" size="8" onpropertychange="calc(this);" >=
<input name="result" type="text" id="result" onpropertychange=calc2();>

</td>

</tr>
</table>
JK_10000 2004-10-26
  • 打赏
  • 举报
回复
没道理啊。
可能是你的处理页面有问题
是你 2004-10-26
  • 打赏
  • 举报
回复
去掉过,不过提交的数据的值总是剩最后一条, 有办法解决吗?
JK_10000 2004-10-26
  • 打赏
  • 举报
回复
function submitProcess()
{
document.frm.submit();
}
submitProcess里的内容是判断必须输入的,可以去掉
是你 2004-10-26
  • 打赏
  • 举报
回复
提交的时候有错误。我直接提交到处理页面,只有最后一行数据的值。
是不是下面的涵数有错?
function submitProcess()
{
var detailIdObjs=document.frm.getElementsByName("pid");
for(var i=0;i<detailIdObjs.length;i++)
{
if(detailIdObjs[i].value=="")
{
alert("Please input!");
detailIdObjs[i].focus();
return false;

}
}

document.frm.submit();
}
JK_10000 2004-10-26
  • 打赏
  • 举报
回复

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JK:支持民族工业,尽量少买X货</title>

<style>
TD,INPUT{ font-size:12; }
</style>
</head>

<body bgcolor=EEEEEE onload="Init();">
<form name="frm" action="about:结果页面" method=post >
<h4 align=center>JK的动态明细示例</h4>

<table align="center" bordercolor=cccccc border=1 width=100% >
<tr>
<td width=500>
</td>
<td align=right>
<input type="button" value="增加" class="bottom" onclick="addDetailProcess();"> 
<input type="button" value="删除" class="bottom" onclick="delDetailProcess();calc2();"> 
<input type="button" value="完成" class="bottom" onclick="submitProcess();">

</td>
</tr>
</table>
<div width=100% id=thedetailtableDIV>
<table align="center" bordercolor=cccccc border=1 width=100% >
<tr bgcolor=eeeeee id="trDetailTitles">
<td ><input type=checkbox onclick="selectallcheckbox(this)"></td>
<td >明细</td>
</tr>
<tbody id="tbDetailUsed" >

<tr height=0 ><td colspan=100 height=0 > 合计<input name=resultTotal></td></tr>
</tbody>

</table>
</div>
</form>

<table id="tbDetailPrepare" style="display:none">
<tr>
<td ><input type="checkbox" name="record_select" ></td>
<td >
<select name="pid" onChange="changelist(this);">
</select>
<select name="list" onChange="changelist(this);">
</select>
<input name="pprice" type="text" id="pprice" size="12" onpropertychange="calc(this);" >*
<input name="q" type="text" id="q" size="8" onpropertychange="calc(this);" >=
<input name="result" type="text" id="result" onpropertychange=calc2();>

</td>

</tr>
</table>


</body>

</html>

<script language=javascript>


function selectallcheckbox(obj) //全选或全不选
{
var tureorfalse=obj.checked;
var theDetail=tbDetailUsed.rows;
for(var i=0;i<theDetail.length-1;i++)
{
theDetail[i].all("record_select").checked=tureorfalse;
}
}


function addDetailProcess(afterRowIndex) //增加明细
{
var alltbDetailUsed= document.all("tbDetailUsed").rows;
var theFirstSelectedDetail;
if (afterRowIndex==null)
{
for(var i=0;i<alltbDetailUsed.length-1;i++)
{
if (alltbDetailUsed[i].all("record_select").checked==true) {theFirstSelectedDetail=i;break;}
}
if (theFirstSelectedDetail==null) {theFirstSelectedDetail=alltbDetailUsed.length-2;}
}
else theFirstSelectedDetail=afterRowIndex;
var newRow = document.all("tbDetailPrepare").rows[0].cloneNode(true);
var desRow = alltbDetailUsed[theFirstSelectedDetail+1];
desRow.parentElement.insertBefore(newRow,desRow );

}

function delDetailProcess() //删除明细
{
var alltbDetailUsed= document.all("tbDetailUsed").rows;
if (confirm("确定选择正确并且要将这些明细删除")==false) return false;
for(var i=0;i<alltbDetailUsed.length-1;i++)
{
if (alltbDetailUsed[i].all("record_select").checked==true)
{
document.all("tbDetailUsed").deleteRow(i);
i=i-1;
}
}
}

function submitProcess()
{
var detailIdObjs=document.frm.getElementsByName("pid");
for(var i=0;i<detailIdObjs.length;i++)
{
if(detailIdObjs[i].value=="")
{
alert("Please input!");
detailIdObjs[i].focus();
return false;

}
}

document.frm.submit();
}


</script>




<script language="JavaScript">
function Info(pid,pname,pprice){
this.pid=pid
this.pname=pname
this.pprice=pprice
}
//以下数据由数据库取得在服务器端产生
var PInfo =new Array(6)//这个3根据记录集的数目定
//下面是用循环来产生
PInfo[0]=new Info("001","墨盒","360.00")
PInfo[1]=new Info("002","打印纸","60.00")
PInfo[2]=new Info("003","打印机","2200.00")
PInfo[3]=new Info("004","计算机","8400.00")
PInfo[4]=new Info("005","碎纸机","720.00")
PInfo[5]=new Info("A006","碎纸机8","7890.00")
//数据结束
function Init(){
for (var i=0;i<PInfo.length;i++){
tbDetailPrepare.all.pid.options[i]=new Option(PInfo[i].pid)
tbDetailPrepare.all.list.options[i]=new Option(PInfo[i].pname)
tbDetailPrepare.all.pprice.value=PInfo[i].pprice
}
}
function calc(obj){
var currentTr=obj.parentElement.parentElement;
currentTr.all.result.value=currentTr.all.pprice.value*currentTr.all.q.value ;
}
function changelist(obj){
var currentTr=obj.parentElement.parentElement;
var x=obj.selectedIndex;
currentTr.all.pid.options[x].selected=true;
currentTr.all.list.options[x].selected=true;
currentTr.all.pprice.value=PInfo[x].pprice
}

function calc2(){

var theResults=document.getElementsByName("result");
var totalTemp=0;
for(var i=0;i<theResults.length-1;i++)
{
totalTemp=totalTemp*1+theResults[i].value*1;
}
document.frm.all.resultTotal.value=totalTemp;

}

</script>
是你 2004-10-26
  • 打赏
  • 举报
回复
这下应该有点难度了吧
xiangyyy 2004-10-26
  • 打赏
  • 举报
回复
相关推荐
发帖
JavaScript

8.7w+

社区成员

Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
帖子事件
创建了帖子
2004-10-26 03:25
社区公告
暂无公告