3

私の Web サイトでは、かなりの量の AJAX と XML Http リクエストを使用しています。ランダムに見える少数の AJAX 呼び出しの場合、onreadystatechange 関数内のすべての JavaScript を適切に実行することはできませんサーバー。これが私が話していることの例です:

Javascript

xmlHttp=getXMLHttp();   //function returns an xmlhttp object to use
//get parameters ready
param="id=5"
xmlHttp.onreadystatechange=function(){
    if(xmlHttp.readyState==4){
        s=xmlHttp.responseText;
        var myJson = eval("("+s+")");
        document.getElementById('Elem1').value=myJson.Result1;
        document.getElementById('Elem2').value=myJson.Result2;
        triggerEvent(document.getElementById('Elem3'),'onblur');
        document.getElementById('Elem4').value=myJson.Result3;
        document.getElementById('Elem5').value=myJson.Result4
        var sel = document.getElementById('Elem6');
        var i;
        for(i=0;i<sel.length;++i){
            if(sel.options[i].value==myJson.Result5){
                sel.selectedIndex = i;
                break;
            }
        }
        document.getElementById('MfgCustNum').value=myJson.Result6;
        document.getElementById('MfgOrderNum').value=myJson.Result7;
        document.getElementById('OrderDatePicker').value=myJson.Result8;
        document.getElementById('ShipDatePicker').value=myJson.Result9;
        document.getElementById('CancelDatePicker').value=myJson.Result10;
        document.getElementById('PO Number').value=myJson.Result11;
        //for some reason, the following 2 lines are where I'm having issues without an alert box
 document.getElementById('NewElement').value=myJson.Result12;
     document.getElementById('NewElement2').value=myJson.Result13;
 //everything else loads properly
        sel = document.getElementById('SelectBox1')
        for(i=0;i<sel.length;++i){
            if(sel.options[i].value==myJson.Result14){
                sel.selectedIndex = i;
                break;
            }
        }
        sel = document.getElementById('SelectBox2')
        for(i=0;i<sel.length;++i){
            if(sel.options[i].value==myJson.Result15){
                sel.selectedIndex = i;
                break;
            }
        }
        sel = document.getElementById('SelectBox3')
        for(i=0;i<sel.length;++i){
            if(sel.options[i].value==myJson.Result16){
                sel.selectedIndex = i;
                break;
            }
        }
        sel = document.getElementById('SelectBox4')
        for(i=0;i<sel.length;++i){
            if(sel.options[i].value==myJson.Result17){
                sel.selectedIndex = i;
                break;
            }
        }
    }
}
xmlHttp.open("POST","../ServerCall.php",true);
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send(params);

私が実行している PHP スクリプトは、JSON 配列としてエコーされる DB に対する単純なクエリです。

    $dc->connect();
    $query = "SELECT COLUMNS FROM TABLE"
    $res = $dc->queryDb($query);
    if(!$res){
        exit();
    }
    $ary = $dc->resultsToArray($res);
    $JSON_ARRAY=array();
    foreach($ary[0] as $key=>$value){
        if(!is_numeric($key))
            $JSON_ARRAY[$key]=$value;
    }
    echo json_encode($JSON_ARRAY);

これは、コードの 3 つまたは 4 つの異なる部分で発生しているため、私にとってかなり大きな問題になりつつありますが、応答テキストを含む警告ダイアログを表示すると、すべてが適切に実行されていることが示されます。AJAX 呼び出しを非同期ではなく同期で実行しようとしましたが、役に立ちませんでした。また、settimeout を使用してコードの実行を 1 秒か 2 秒遅らせることも試みましたが、結果がまちまちで、スクリプトの実行に特定の遅延を設定する必要はありません。

編集: コメント内のいくつかの質問に答えるには: このコード スニペットでは、次の 2 行に問題があります。

 document.getElementById('NewElement').value=myJson.Result12;
 document.getElementById('NewElement2').value=myJson.Result13;

myJson.Result12 のテキストを取得するためにその行の直前に警告ボックスを配置すると、要素がページに適切に入力されます。これがないと、空白のままになり、Firefox のエラー コンソールにエラーは表示されません。

このコードは onclick から実行されています。私は DataTables を使用しており、誰かが私のテーブルの行をダブルクリックすると、ページにコンテンツが取り込まれます。繰り返しますが、今日追加した 2 つの新しい要素を除いて、すべて正常に動作しています。より大きな懸念は、これが私のコードで繰り返し発生する問題であると思われることです。

また、私は jQuery の AJAX 呼び出しを試しましたが、うまくいきませんでした。私のコードのほとんどは、JS だけで xmlHttp を使用して既に記述されていました。

4

2 に答える 2

1

考えられる理由;

onload ハンドラーから AJAX 要求を実行する必要があります。そうしないと、応答を受け取るまでにページが完全に読み込まれない可能性があります。NewElement と NewElement2 を更新しようとした時点で読み込まれていない場合、スクリプトは機能しません。

アラートは、ページの読み込みを完了するのに十分なだけスクリプトを遅らせ、スクリプトがその時点に到達する前に要素が存在できるようにします。

于 2012-08-28T16:23:01.073 に答える
0

そのため、スクリプトを一時停止するアラートボックスがなくても、データは正常に読み込まれるようになりました。以前と何が違うのかわかりませんが、エラーの再現を続けていきます。問題の原因が、コード自体が正しく機能していない以上に使用しているブラウザまたはコンピュータにあるのではないかと思います。または、データベースの応答が遅く、問題が発生している可能性があります。FWIW、私が受信しようとしていた列は、多くのデータで埋められていませんでしたが、選択しようとしたすべての列の中で最大の最大サイズでした。

皆様のご協力に感謝いたします。コメントには、AJAXの使用について確かに多くの良いアドバイスがあります。

于 2012-08-28T17:09:24.007 に答える