0

以下のコードを IE で実行すると、問題なく動作します。

reqGetSubMenuRef22.responseTextしかし、mozilla ff では、 line1 で null が指定されているため、layerId の値が空白になっています。

function ajaxFunctionCallGetSubMenuRef22(url)
{
    if (window.XMLHttpRequest) { // Non-IE browsers and IE>=7
      reqGetSubMenuRef22 = new XMLHttpRequest();

      reqGetSubMenuRef22.onreadystatechange = processStateChangeGetSubMenuRef22;
      try {
        reqGetSubMenuRef22.open("GET", url, true);
        (( reqGetSubMenuRef22.setRequestHeader && method == "GET" ) ?  reqGetSubMenuRef22.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") : reqGetSubMenuRef22 );
      } catch (e) {
        alert(e);
      }
      reqGetSubMenuRef22.send(null);
    } 
    else if (window.ActiveXObject) { // IE    
      reqGetSubMenuRef22 = new ActiveXObject("Microsoft.XMLHTTP");
      if (reqGetSubMenuRef22) {
        reqGetSubMenuRef22.onreadystatechange = processStateChangeGetSubMenuRef22;
        reqGetSubMenuRef22.open("GET", url, true);
        reqGetSubMenuRef22.send();
      }
    }
}

function processStateChangeGetSubMenuRef22() 
{

    if (reqGetSubMenuRef22.readyState == 4) { // Complete
      if (reqGetSubMenuRef22.status == 200) { // OK response
            var textToSplit = reqGetSubMenuRef22.responseText; //line1

        if(textToSplit != null && textToSplit != '') {
                subMenuRef = textToSplit;
                }
            else {
                subMenuRef='';
                }

        layerId=subMenuRef;
4

1 に答える 1

0

processStateChangeGetSubMenuRef22(ところで、最高の関数名ではありません)はコールバックです。reqGetSubMenuRef22のコンテキストで呼び出されるので、 を使用するのではなく、 を使用しif (reqGetSubMenuRef22.readyState === 4)てみてくださいif (this.readyState === 4 && this.status === 200)。関数は変数 のイベント
のハンドラとして参照されるため、関数は のメソッドになり、論理的に (この場合) で参照されます。readystatechangereqGetSubMenuRef22reqGetSubMenuRef22this

類推してこれを明確にするために、あなたはあなたの居間をSome Blvd Nr.の居間と呼んでいません。123、どこの町、どこの国でもいいですか?人が来ると、ここが私のリビングルーム、これが私たちの家、これが私が住んでいる場所だと言います...

またreqGetSubMenuRef22、コード内のグローバル変数のようです。これに対処する必要があります。MDNの JS の詳細を参照してくださいthis。また、ajax 呼び出しの場合は、closures.


function readyStateCallback()
{
    if (this.readyState === 4 && this.status === 200)
    {
        console.log(this.responseText);
        //JSON string?:
        var resp = JSON.parse(this.responseText);
        //just txt:
        var resp = this.responseText;
        //HTML?
        document.getElementById('showResponseHere').innerHTML = this.responseText;
        //many more things you can do here...
    }
}

なぜreqGetSubMenuRef22もう機能しないのですか:

function sendRequest(str)
{
    var reqGetSubMenuRef22;//<-- local scope, only accessible in function
    var i;//local, too but different
    //try catch stuff: reqGetSubMenuRef22 is now an ajax object
    for (i=0;i<str.length;i++)
    {
        console.log(i);//just an example, you'll see why
    }
    reqGetSubMenuRef22.onreadystatechange = readyStateCallback;//reqGetSubMenuRef22 is still local
    //setup reqGetSubMenuRef22, then:
    reqGetSubMenuRef22.send();
}//end function

sendRequest 関数が戻ると、すべてのローカル変数が GC され、変数iはメモリから消去されます。reqGetSubMenuRef22もあるはずですが、イベントが関連付けられており、このイベントは、グローバルスコープまたは別の既存のスコープで宣言されている関数をトリガーします。
JS がオブジェクトの onreadystatechange イベントをリッスンしているため、オブジェクトは存続しreqGetSubMenuRef22ます。そのため、その名前はもはや何にも関連付けられていませんが、オブジェクトはまだ非常に「そこに」あります。グローバル オブジェクト (別名ウィンドウ) がreadyStateCallback関数を呼び出すのではなく、ajax オブジェクト ( reqGetSubMenuRef22) が呼び出します。thisしたがって、関数を呼び出すオブジェクトを常に指す を使用して、その関数内から ajax オブジェクトにアクセスできます。(同じ関数をそのように呼び出しますreadyStateCallback();、これはグローバルオブジェクトを指します ( window)) コールバックがそのジョブで終了した後this、または ajax オブジェクトは、発生する予定の他のイベントがない限り、またはプログラム内のどこかでまだ参照されていない限り、ガベージコレクトされます。

私はこのようなことを説明するのが苦手で、ここで物事を大幅に単純化しすぎて、至る所で近道をしていることを十分に認識しています. thisただし、JavaScript で読み進めてください。
ところで: 関数が返された後も生き続けているオブジェクトは、実際には一種のクロージャーです: 変数はスコープ外になりますが、参照することはできます。要するに、これはいくつかの非常に強力な構造を可能にするので、これも調べてみることをお勧めします!

于 2012-07-18T09:52:50.913 に答える