-1

ASPページから応答を取得しようとしています(その中で動的JavaScript配列を作成しています)。しかし、AJAX コールバックの後、javascript 配列にアクセスできません。

私はスタックオーバーフローの記事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(":"); でエラーが発生します。これについて支援をいただければ幸いです。

ありがとう... プラシャント....

4

2 に答える 2

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(":");

しかし、この行は以前の動的作成ブロックの外にあります。この操作で何を実現しようとしているのかわからないため、解決策を提供することはできませんが、次のことを強くお勧めします。

  • asp ページから XML ドキュメントを取得し、配列のコンテンツなど、必要なすべてのデータ (およびデータのみ) を返します。XML リターンの例:
<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);
}
  • このようなスクリプトを追加するために eval を使用しないでください。あなたは非常に危険で、醜く、不明確なことをしています

さあ、楽しんでください!よろしく。

于 2012-06-18T14:14:58.783 に答える
0

arrJSCalT 変数にアクセスしようとしていますが、存在しません。ASP スコープにのみ存在しますが、JS はそれを知りません。

そのため、arrJSCalT である JS に伝える必要があります。xmlhttp のプロパティ responseText を使用して、AJAX リターンにアクセスできます。

split1 変数の前に、これを配置します。

arrJSCalT = xmlhttp.responseText;
于 2012-06-18T14:15:36.863 に答える