0

ユーザーが情報を表示する状態を選択できる次の簡単なフォームがあります。

<form style="position:absolute; top:65px; left:650px">
    Select State to View:
    <select id="myList" onchange="load_state_data(); xml = getStateInfo();">
      <option selected="selected"></option>
        <?php
            foreach($stateNames as $state){
                echo('<option>'.$state.'</option>');
            }
        ?>
    </select>
</form>

私のJavaScriptは次のとおりです。

function load_state_data() {
    var state_name = $("#myList option:selected").val();
    $.ajax({
        type: 'post',
        url: 'state_data.php',
        dataType: "xml",
        data: {
            state_name: $("#myList option:selected").val()
        },
        success: function (data) {
            //clear out previous values
            for (j = 0; j < 5; j++) {
                $('#top_name_' + j).html("");
                $('#top_score_' + j).html("");
            }

            $(data).find('TOP').each(function (index) {
                $('#top_name_' + index).html($(this).find('COMPANY_NAME').text());
                $('#top_score_' + index).html($(this).find('Q_SCORE').text());
            });

            //initialize my temp arrays for reverse ordering the results
            var botName = new Array();
            var botScore = new Array()

            //clear out previous values
            for (j = 0; j < 5; j++) {
                $('#bot_name_' + j).html("");
                $('#bot_score_' + j).html("");
            }

            $(data).find('BOTTOM').each(function (index) {
                //$('#bot_name_'+index).html($(this).find('COMPANY_NAME').text());
                //$('#bot_score_'+index).html($(this).find('Q_SCORE').text());
                botName[index] = $(this).find("COMPANY_NAME").text();
                botScore[index] = $(this).find("Q_SCORE").text();
                j = index;
            });
            var newOrderName = botName.reverse();
            var newOrderScore = botScore.reverse();
            for (i = 0; i < newOrderName.length; i++) {
                $('#bot_name_' + i).html(newOrderName[i]);
                $('#bot_score_' + i).html(newOrderScore[i]);
            }

            //clear the variables from memory
            delete botName;
            delete botScore;
            delete newOrderName;
            delete newOrderScore;


            //cycle through results and save my locations to an array of the map markers
            var inst_info = new Array();
            $(data).find('INST_MARKER').each(function (index) {
                inst_info[index] = [parseFloat($(this).find('LAT').text()),
                parseFloat($(this).find('LONG').text()),
                $(this).find('COMPANY_NAME').text(), $(this).find('Q_SCORE').text()];
            });

            $(data).find('INST_COUNT').each(function () {
                $('#num_total').html($(this).find('NUM_TOTAL').text());
                $('#num_null').html($(this).find('NUM_NULL').text());
            });
            return (inst_info);
        },
        error: function (data) {
            alert('There was an error. Please try again shortly.');
        }
    });
};

このスクリプトで生成されたinst_infoにアクセスして、呼び出し元のページに戻る必要があります(上記のフォームを参照)。これは可能ですか?もしそうなら、どのように?inst_info = function load_state_dataを使用してみましたが、機能しません。

4

2 に答える 2

2

これは実際には不可能です。イベントハンドラーはある時点で非同期に起動し、値を「返す」コードはありません。イベントハンドラーload_state_data()で発生することはすべて、メインのjavascriptコードから分離されます。これは、いつ発生するか、発生するかどうかは誰にもわからないためです。イベントハンドラーでやりたいことは何でもする必要があります。

于 2012-07-25T22:45:22.427 に答える
1

このスクリプトで生成されたinst_infoにアクセスして、呼び出し元のページに戻る必要があります(上記のフォームを参照)。これは可能ですか?もしそうなら、どのように?

いいえ。は、非同期リクエストinst_infoの成功イベントのコールバック関数で作成されます。そこから利用可能になり、状態情報を設定する関数を呼び出すことができます。

load_state_dataこれはすべて、関数が戻った後、将来発生します。ただし、データのPromiseを返す場合があります。このPromiseには、データが利用可能になるとすぐに実行されるように他のコールバック関数を登録できます。


    //clear the variables from memory
    delete ...

このコードは機能しません。delete演算子の誤用です。とにかくこれを行う必要はありません。JavaScriptはガベージコレクションされた言語です。

于 2012-07-25T22:49:46.307 に答える