怎样将循环读取到的数据,填充到select下拉菜单中?

homel 2010-05-13 04:22:29
需求是这样的:
文本框 :输入相关数据
下拉菜单:(备注,下拉菜单中的数据,是根据文本框中输入的数据作为参数,从数据库中读取数据,然后无刷新显示出来的")

<form name="form1">

会计主目: <input type="text" name="acc_main" onfocus="getpara()">
会计子目:<select name="sub_acc"></select>


一下是我写的关于填充下拉菜单的js代码:
但是总有问题,请高手赐教:
function getpara()
{

if(document.form1.acc_main.value.length==0){return;}//为空返回
var id=document.form1.acc_main.value.split(">")[1];
createXMLHttpRequest();
url='search_subaccinfo.asp?id='+id+'&s='+ new Date().getTime();
xmlHttp.open('GET',url,true);
xmlHttp.onreadystatechange=function(){homel(xmlHttp)};
xmlHttp.send(null);
}

function homel(x)
{
if (x.readyState==4){
if(x.status==200||x.status==0){
var s=x.responseText;
for(var i=0;i<=s.length;i++)
{
var obj=document.form1.sub_acc;
obj.options[obj.options.length]=new Option(s);
}
}
}
}


2.search_subaccinfo.asp

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
Response.CharSet="GBK"
Response.ContentType="text/xml"
%>
<!--#include file="../conn/connready.asp"-->
<%
err.clear
on error resume next
dim ret,rule'return是保留字
rule=request.QueryString("id")
dim sid()
sql="select aid,subacc_name_en,subacc_name_cn,subacc_code from subacc_info where aid in (select subacc_id from acc_ref_info where acc_main_id="&rule&")"
'response.Write sql
set rs=server.CreateObject("Adodb.recordset")
rs.open sql,conn,1,1
i=0
do while not rs.eof
redim preserve sid(i)
sid(i)=rs(2)
response.Write sid(i)
rs.movenext
i=i+1
loop

rs.close
set rs=nothing


%>


可能循环填充到select下拉菜单中那些代码有问题,所以都不对..
请大侠赐教,谢谢..
...全文
662 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
toury 2010-05-14
  • 打赏
  • 举报
回复

function $(id){return document.getElementById(id)}
function homel(x){
if (x.readyState==4){
if(x.status==200||x.status==0){
var s=x.responseText;
//alert(s)//这个字串格式对了吗?
if(s==''){return}
if(s.indexOf('@error:')!=-1){ alert('出现错误:'+s.replace('@error:','')); return; }
if (s=="NULL"){alert('查无此项!请改变关键字再试。');}
else{
//debugger;//加入这句,IE下调试用,用后删除
var o=$('aa'); o.length=1//delete all
var arr=ret.split(","), arr1=[], z=0, opt=null;
for(z=0; z<arr.length; z++){
arr1=arr[z].split("|")
opt=document.createElement("OPTION")
opt.value=arr1[0]; opt.text=arr1[1];
o.options.add(opt)
}
}
}
}
}


在IE里运行网页---提示是否调试时点确定----F11单步调试,看看那个null的提示指向谁?
homel 2010-05-14
  • 打赏
  • 举报
回复
to toury:
不好意思,我忘记告诉你了,填充到select中有值,就是ie会提示js错误
.............
homel 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 toury 的回复:]
homel,AJAX返回的数据你alert(s)一下,应该是这样的字串:
"a|1,b|2,c|3"
就是说,[,]之间分割的是记录数,[|]分割的是名值对;如果不是这样的结构,回到后台去,让它生成这样的字串就OK了

我给你段后台的例子:

HTML code
<!--#include file=你的连库文件.asp-->
<%
response.charset="gb……
[/Quote]

前面的我理解
我的后台如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
Response.CharSet="GBK"
Response.ContentType="text/xml"
%>
<%err.clear
on error resume next
dim rule
rule=request.QueryString("id")
dim sid(),sname()
sql="select aid,subacc_name_en,subacc_name_cn,subacc_code from subacc_info where aid in (select subacc_id from acc_ref_info where acc_main_id="&rule&")"
response.Write sql
set rs=server.CreateObject("Adodb.recordset")
rs.open sql,conn,1,1
i=0
do while not rs.eof
redim preserve sid(i),sname(i)
sid(i)=rs(0)
sname(i)=selectlanguage_fun(userdefault_language,""&rs(2)&"",""&rs(3)&"")
response.Write sid(i)&"|"&sname(i)&","
rs.movenext
i=i+1
loop

rs.close
set rs=nothing
%>


没有判断返回值s为空的情况
....
我copy了你给的代码,但是还是会提示那个"undifend" is null or not a object
aier520 2010-05-14
  • 打赏
  • 举报
回复
还个还是要ajax来实现,我以前做过几个
toury 2010-05-14
  • 打赏
  • 举报
回复
homel,AJAX返回的数据你alert(s)一下,应该是这样的字串:
"a|1,b|2,c|3"
就是说,[,]之间分割的是记录数,[|]分割的是名值对;如果不是这样的结构,回到后台去,让它生成这样的字串就OK了

我给你段后台的例子:
<!--#include file=你的连库文件.asp-->
<%
response.charset="gbk"
dim aaaaaaa
aaaaaaa=Request.QueryString("aaaaaaa")
if strSearch<>"" then
Response.Write GetData(aaaaaaa): Response.End
end if

private function GetData(str)
on error resume next
set rsAjax=server.CreateObject("adodb.recordset")
sql="SELECT ID, sName FROM 表 WHERE 字段 LIKE '%"&str&"%'"
rsAjax.open sql,conn,1,1
s=""
do while not rsAjax.eof
if s="" then s=rsAjax(0)&"|"&rsAjax(1) else s=s&","&rsAjax(0)&"|"&rsAjax(1)
rsAjax.movenext
loop
if s="" then s="NULL"
release rsAjax
release conn
if err then s="@error:"&err.description
GetData=s
end function

sub release(o)
if not isobject(o) then exit sub
if o.state<>0 then o.close
set o=nothing
end sub
%>

json格式的数据组合我就不贴了,你的需求不用那么麻烦,呵呵
homel 2010-05-14
  • 打赏
  • 举报
回复
To toury:

var o=$('aa'); o.length=1//delete all
var arr=s.split(","), arr1=[], z=0, opt=null;
for(z=0; z<arr.length; z++){
arr1=arr[z].split("|")//js错误总是提醒"undifend" is null or not a object
opt=document.createElement("OPTION")
opt.value=arr1[0]; opt.text=arr1[1];
o.options.add(opt)
}

我尝试了判断
if (arr1!="")
{}
的判断,但是还是有??
homel 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chinmo 的回复:]
for(var i=0;i<=bb.length;i++)
{
var obj=document.form1.aa;
obj.options[obj.options.length]=new Option(bb[i]);
}
你别每次都定义var obj=document.form1.aa;放外面
换成
var obj=document.form1.aa;
obj.o……
[/Quote]

恩,多谢
toury 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 homel 的回复:]

to toury:
呵呵,不好意思
弄了半天,是我的错...............
[/Quote]
哈哈,常有的事。我以前经常、现在也时常有这样的短路时分:))
homel 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 homel 的回复:]
引用 17 楼 chinmo 的回复:
汗!很简单的一个问题还折腾这么久啊

更汗...
[/Quote]
汗颜啊
homel 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chinmo 的回复:]
汗!很简单的一个问题还折腾这么久啊
[/Quote]
更汗...
  • 打赏
  • 举报
回复
汗!很简单的一个问题还折腾这么久啊
homel 2010-05-14
  • 打赏
  • 举报
回复
to toury:
呵呵,不好意思
弄了半天,是我的错...............
homel 2010-05-14
  • 打赏
  • 举报
回复
to toury:
忘记告诉你了:
后台我套用的就是你的代码:
<%rule=request.QueryString("id")
if rule<>"" then
response.write GetData(rule)
response.End()
end if
private function GetData(rule)
on error resume next
set rsAjax=server.CreateObject("adodb.recordset")
sql="select aid,subacc_name_en,subacc_name_cn,subacc_code from subacc_info where aid in (select subacc_id from acc_ref_info where acc_main_id="&rule&")"
rsAjax.open sql,conn,1,1
s=""
do while not rsAjax.eof
if s="" then s=rsAjax(0)&"|"&rsAjax(1) else s=s&","&rsAjax(0)&"|"&rsAjax(1)
rsAjax.movenext
loop
if s="" then s="NULL"
release rsAjax
release conn
if err then s="@error:"&err.description
GetData=s
end function
sub release(o)
if not isobject(o) then exit sub
if o.state<>0 then o.close
set o=nothing
end sub
%>


不过前台js脚本我用的是这个:
function homel(x)
{
if (x.readyState==4){
if(x.status==200||x.status==0){
var s=x.responseText;
var bb=s.split(",")
var arr=[];
var obj=document.form1.aa;
obj.options.length=0//重置下拉菜单
if(s==''){
obj.options[obj.options.length]=new Option("没有会计子目");
}
else
{
for(var i=0;i<=bb.length;i++)
{
arr=bb[i].split("|")
if(arr!="")
{
value=arr[0];
text=arr[1];
obj.options[obj.options.length]=new Option(value+">"+text);
}
}
}
}
}
}


我看了我用的前台的js代码,我看不出异常来...
可能是当局者迷吧
.............
toury 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 homel 的回复:]

to toury:
null的指向是这句代码:
arr1=arr[z].split("|")
[/Quote]
后台代码一定有问题。我贴给你的是我用了N年的,从没有出过你说的问题,呵呵。
err.clear
on error resume next
dim rule
rule=request.QueryString("id")
dim sid(),sname()
sql="select aid,subacc_name_en,subacc_name_cn,subacc_code from subacc_info where aid in (select subacc_id from acc_ref_info where acc_main_id="&rule&")"
response.Write sql
set rs=server.CreateObject("Adodb.recordset")
rs.open sql,conn,1,1
i=0
do while not rs.eof
redim preserve sid(i),sname(i)
sid(i)=rs(0)
sname(i)=selectlanguage_fun(userdefault_language,""&rs(2)&"",""&rs(3)&"")
response.Write sid(i)&"|"&sname(i)&","
rs.movenext
i=i+1

loop

rs.close
set rs=nothing
红字部分不要这样写。

这样,把你的传参和SQL语句套用到我8楼的代码里再试试
homel 2010-05-14
  • 打赏
  • 举报
回复
to toury:
null的指向是这句代码:
arr1=arr[z].split("|")
  • 打赏
  • 举报
回复
for(var i=0;i<=bb.length;i++)
{
var obj=document.form1.aa;
obj.options[obj.options.length]=new Option(bb[i]);
}
你别每次都定义var obj=document.form1.aa;放外面
换成
var obj=document.form1.aa;
obj.options.length=0//重置下拉单
for(var i=0;i<=bb.length;i++)
{
obj.options[obj.options.length]=new Option(bb[i]);
}
toury 2010-05-13
  • 打赏
  • 举报
回复
function $(id){return document.getElementById(id)}
function homel(x){
if (x.readyState==4){
if(x.status==200||x.status==0){
var s=x.responseText;

if(s==''){return}
if(s.indexOf('@error:')!=-1){ alert('出现错误:'+s.replace('@error:','')); return; }
if (s=="NULL"){alert('查无此项!请改变关键字再试。');}
else{
var myjson=eval("("+s+")"); //alert(myjson)
var o=$('aa');
o.length=1;//如果有'--请选择--'的OPTION则保留;否则o.length=0
var arr=myjson.mydata, opt=null, optC=null, sid='', sName='';
for (var i=0;i<arr.length;i++){
opt=document.createElement("OPTION");
sid=arr[i].id; sName=arr[i].Name;
opt.value=sid; lastvalue=sid;
opt.text=sName;
o.options.add(opt);
}

}
}
}
}
}
这个是AJAX返回JSON数据的写法;
===================================================
用下面用蓝字替换上面的红字是AJAX返回带分隔符字串的写法:
字符串类似于:s="a|1,b|2,c|3........."这样的
var o=$('aa'); o.length=1//delete all
var arr=ret.split(","), arr1=[], z=0, opt=null;
for(z=0; z<arr.length; z++){
arr1=arr[z].split("|")
opt=document.createElement("OPTION")
opt.value=arr1[0]; opt.text=arr1[1];
o.options.add(opt)
}

homel 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chinmo 的回复:]
var s=x.responseText;
for(var i=0;i<=s.length;i++)
{
var obj=document.form1.sub_acc;
obj.options[obj.options.length]=new Option(s);
}
很简单的一个问题
你这里你用alert(s)输出你就知道返回的信息了,建议你返回的实现用用逗号,或……
[/Quote]

chinmo,我已经根据你的提示更改了相关代码:

function homel(x)
{
if (x.readyState==4){
if(x.status==200||x.status==0){
var s=x.responseText;
var bb=s.split(",");

for(var i=0;i<=bb.length;i++)
{
var obj=document.form1.aa;
obj.options[obj.options.length]=new Option(bb[i]);
}
}
}
}

效果也基本实现,但是在用户体验上,感觉填充select下拉菜单时总是慢半拍....
猜我是几娃 2010-05-13
  • 打赏
  • 举报
回复
还是5颗星猛。。一语中的。。
应该就是 s 的值是整个 x.responseText ,没有分解的问题
  • 打赏
  • 举报
回复
var s=x.responseText;
for(var i=0;i<=s.length;i++)
{
var obj=document.form1.sub_acc;
obj.options[obj.options.length]=new Option(s);
}
很简单的一个问题
你这里你用alert(s)输出你就知道返回的信息了,建议你返回的实现用用逗号,或者用|这样的分割,然后js里用split就得到一个数组了,就可以循环输出了得到了

28,409

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧