我正在尝试从ASP页面获取响应(我在其中创建动态javascript数组)。但是在AJAX回调之后,我无法访问javascript数组。
我已经阅读了stackoverflow文章Calling a JavaScript function returned from an Ajax response,它解决了与我类似的问题。
不确定这有什么问题。我在下面简要介绍一下我写的代码。
Function ()
{
var xmlhttp;
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 1) {
alert('connection');
}
if (xmlhttp.readyState == 3) {
alert('processing');
}
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
alert('back with the bang');
document.getElementById('dvCallback').innerHTML = xmlhttp.responseText;
eval(document.getElementsByID("runscript").innerHTML);
split1 = arrJSCalT[i].split(":");
alert(split1[1]);
}
}
xmlhttp.open("POST", "Sys_Add.asp", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send();
return false;
}
Sys_Add.asp如下。
<%
response.Expires = -1
dim strErrMsg
recCntr = 0
recCntr = rsCalT.RecordCount
recCntr = recCntr - 1
dim dicCalT
set dicCalT = CreateObject("Scripting.Dictionary")
if rsCalT.RecordCount <> 0 then
rsCalT.MoveFirst
do while not rsCalT.EOF
dicCalT.Add cstr(rsCalT(0)), cstr(rsCalT(1))
rsCalT.MoveNext
loop
end if
Call FillJSArray(dicCalT,"arrJSCalT")
Sub FillJSArray(dicVB, arrJS)
dim itr
a = dicVB.keys
b = dicVB.items
Response.write ("<script language=""javascript"" id=""runscript"" name =""runscript"">" & VbCrLf )
Response.Write ("var " & arrJS & "= new Array(" )
for i = 0 To dicVB.Count - 1
If i > 0 then
response.write (",")
End If
Response.Write ("""" & a(i) & ":" & b(i) & """")
Next
Response.Write (");" & vbCrLf )
'Response.write "alert(""running from main"");"
Response.write ("</script>" & VbCrLf)
Response.write ("so this is printed as welll")
End Sub
'END creating javascript array from asp recordset
response.Write ("Did you want this??")
%>
我在第一行得到错误split1 = arrJSCalT [i] .split(“:”); 如果我得到这方面的帮助,我将不胜感激。
...谢谢 PRASHANT ....
答案 0 :(得分:0)
这是因为
Response.write ("<script language=""javascript"" id=""runscript"" name =""runscript"">" & VbCrLf )
Response.Write ("var " & arrJS & "= new Array(" )
使数组成为新脚本的本地数组,除非在同一个function() {...}
块中调用js <script/>
部分,否则您将看不到它,因为变量范围是本地的。
附加信息: 这个:
eval(document.getElementsByID("runscript").innerHTML);
创建一个包含局部变量的脚本,这是您的数组。该数组从该脚本外部完全不可见。
但是你试着在下一行使用它:
split1 = arrJSCalT[i].split(":");
但是这一行不在您之前动态创建的块中。我不能给你一个解决方案,因为我不知道你在这个操作中想要实现什么,但我强烈推荐以下内容:
<DATAS> <DATA>1</DATA> <DATA>2</DATA> <DATA>3</DATA> <DATA>4</DATA> </DATAS>
var parser=new DOMParser();
var xmlDoc=parser.parseFromString(xmlhttp.responseText,"text/xml");
var sLocalData;
var oOpt;
for(var i=0; i< xmlDoc.getElementsByTagName("data").length; i++) {
sLocalData = xmlDoc.getElementsByTagName("title")[i].textContent;
//do your stuff here, for example:
oOpt = document.createElement("option");
oOpt.text = sLocalData;
mycombobox.appendChild(oOpt);
}
你去吧,玩得开心!问候。
答案 1 :(得分:0)
您正在尝试访问arrJSCalT变量,但它不存在。仅存在于ASP范围内,但JS不知道它。
所以,你需要告诉JS谁是arrJSCalT。您可以使用xmlhttp的属性responseText访问AJAX返回。
在split1 var之前,请将其放置:
arrJSCalT = xmlhttp.responseText;