0

いくつかの値を渡すのに問題があります。

私はこの構造を持っています。問題が何であるかを理解しようとしているので、今は非常に単純です。

私が望むのは、 JSON データをexamplesやのような変数に入れることですchapters。ファイルからの情報は完全に読み込まれます。alertまたはで確認できますconsole.log

// global variables
var JSONObject = false;
var chapters = false; // or Array depends on what I'm trying
var examples = false; // or Array depends on what I'm trying
var ajax_request = false;
var url_json = "js/database.json";

// start the process, for now
load_json_data();
console.log( JSONObject ); // outputs false

function load_json_data() {

    // new request
    ajax_request = new XMLHttpRequest();

    // do the request
    ajax_request.open( "GET", url_json, true );
    ajax_request.send( null );

    // function to parse the JSON data
    ajax_request.onload = parse_json;

    // return value
    return true;
}

function parse_json() {
    if ( ajax_request.readyState === 4 && ajax_request.status === 200 ) {
        // parse the JSON file
        JSONObject = JSON.parse( ajax_request.responseText );

        // do something with the loaded data
        temp();
    }
    return true;
}

function temp() {
    console.log( JSONObject ); // outputs the JSON content if async = true
                               // with async false, it never reaches this function
// here all the information is available and chapters and sections have values
chapters = JSONObject.chapters;
examples = JSONObject.examples;
}

別の名前で呼ばれるこの関数は、JSON ファイルから取得した値を登録して、ページ内にコントロールを作成するtempなどの他の関数で使用するという考え方です。別個の関数である必要はありません。同じ関数に含まれている可能性がありますが、できる限りきちんといくつかのことを試していたので、現在は含まれています。construct_select()selectparse_json()temp()

load_jsonparse_json、および中央関数から必要なその他の関数を実行したいのですが、そのためには、それらの関数が値を他の変数に渡す必要があります。

通常、スクリプトのフローを制御し、すべての決定を下す関数を 1 つ用意しようとします。残りの関数は、必要な処理を実行し、必要に応じて状態 (true/false) または値を返します。

適切に説明したことを願っていますが、さらに情報が必要な場合はお知らせください。

更新 1: 問題は非同期プロセスに関連していると思いますがonload、解析関数を呼び出す前に使用して解決されているはずではありませんか? また、async パラメータを false に変更しても改善しません。

更新 2: 関数がイベント リスナーによって呼び出された場合、または実行された場合、JSONObjectその関数で使用できます。方法や理由はまだわかりませんが、最終的にやりたいことに役立ちます。1 つの関数でフローを制御し、何を実行するかを決定することはまだ許可されていませんが、それをイベントに任せることはできます。リスナーによってトリガーされるのではなく、関数で使用できるグローバル変数に値を渡すことができるかどうかをまだ調べています。

4

1 に答える 1

0

これをチェックしてください:

isArray(obj){
  if(Object.prototype.toString.call(obj) === '[object Array]'){
    return true;
  }
  else{
   return false;
  }
}
function logIt(data){
  var dc = data.chapters, de = data.examples;
  if(isArray(dc)){
    console.log(dc.join());
  }
  else{
    console.log(dc);
  }
  if(isArray(de)){
    console.log(dc.join());
  }
  else{
    console.log(de);
  }
}
function getJSON(url, callback, method, data, async){
  var req, m;
  m = !method ? 'GET' : method.toUppercase();
  if(!data)data = null;
  if(!async)async = true;
  if(window.XMLHttpRequest){
    req = new XMLHttpRequest;
  }
  else{
    req = new ActiveXObject('Microsoft.XMLHTTP');
  }
  req.open(m, url, async);
  req.onreadystatechange = function(){
    if(req.readyState == 4 && req.status == 200){
      callback(eval('('+req.responseText+')'));
    }
  }
  req.send(data);
}
getJSON('js/database.json', logIt);

右側のスクロール バーに注目してください。問題は、リクエストが発生した後に何が起こるかを確認する必要があることですonreadystatechange。したがって、オブジェクトに何かを割り当ててもonreadystatechage、他の JavaScript が自動的にアクセスできるとは限りません。解決策は、コードを内部に持つコールバックを使用することです。この場合、このコールバックには単一の引数が必要responseTextです。これは、評価された に渡され、文字列として返されます。この String を JavaScript に変換するに.eval()は、 内で使用されますgetJSON.phpではなく、ページに情報を保存することをお勧めします.json。PHP は次のようになります。

<?php
  if(isset($_POST['textInput']) && trim($_POST['textInput']) !== ''){
    echo json_encode($_POST);
  }
?>
于 2013-07-17T02:25:08.793 に答える