2

私は私の人生のためにこれを手に入れることができないようです。getJson2 関数を呼び出した後、変数「json」にアクセスできません。PHPスクリプトを介してjsonを動的に取得しましたが、それは機能します。しかし、それはなくなりました。json が init 関数に埋め込まれているThe InfoVis examplesのガイドとして使用するサンプルがあります。私はそれを動的に取得しようとしています。

<script language="javascript" type="text/javascript">
var labelType, useGradients, nativeTextSupport,animate,json;
function getJson2()
{
  var cd = getParameterByName("code");
  $.get("tasks.php?code="+cd, function(data){
    return data;
  })
 };
function getParameterByName(name)
{
  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(window.location.search);
  if(results == null)
    return "";
  else
    return decodeURIComponent(results[1].replace(/\+/g, " "));
}

(function() {
  var ua = navigator.userAgent,
      iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i),
      typeOfCanvas = typeof HTMLCanvasElement,
      nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'),
      textSupport = nativeCanvasSupport 
        && (typeof document.createElement('canvas').getContext('2d').fillText == 'function');
  //I'm setting this based on the fact that ExCanvas provides text support for IE
  //and that as of today iPhone/iPad current text support is lame
  labelType = (!nativeCanvasSupport || (textSupport && !iStuff))? 'Native' : 'HTML';
  nativeTextSupport = labelType == 'Native';
  useGradients = nativeCanvasSupport;
  animate = !(iStuff || !nativeCanvasSupport);
})();
debugger;
var Log = {
  elem: false,
  write: function(text){
    if (!this.elem) 
      this.elem = document.getElementById('log');
    this.elem.innerHTML = text;
    debugger;
    this.elem.style.left = (500 - this.elem.offsetWidth / 2) + 'px';
  }
};  
function init(){
json = getJson2();
    //init data
var st = new $jit.ST({  
    //id of viz container element  
    injectInto: 'infovis',  
    //set duration for the animation  
    duration: 800,  
    //set animation transition type  ..................
4

4 に答える 4

2
function getJson2()
{
  var cd = getParameterByName("code");
  $.get("tasks.php?code="+cd, function(data){
    return data;
  })
};

getJson2()何も返しません。コールバック関数$.get()は何かを返しますが、その戻り値をリッスンしているものはありません。

代わりに同期ロードが必要なようです。は、この呼び出し$.get()の省略形です: (ドキュメントを参照)$.ajax()

$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});

への設定など、$.ajax()より多くの機能をサポートします。asyncfalse

$.ajax({
  url: "tasks.php?code="+cd,
  async: false,
  dataType: 'json',
  success: function(data) {
    // data !
  }
});

つまり、次のgetJson2ようになります。

function getJson2()
{
  var cd = getParameterByName("code");
  var jsonData;

  $.ajax({
    url: "tasks.php?code="+cd,
    async: false,
    dataType: 'json',
    success: function(data) {
      jsonData = data;
    }
  });

  return jsonData;
};

var myJsonData = getJson2();

または、引き続き$.get非同期スタイルを使用し、代わりにコールバックを使用します。

function getJson2(callback)
{
  var cd = getParameterByName("code");
  $.get("tasks.php?code="+cd, function(data){
    callback(data);
  });
};

getJson2(function(data) {
  // do stuff now that json data is loaded and ready
});
于 2012-12-12T18:49:18.963 に答える
1

jQuery の $.get 呼び出しは非同期であり、実際にはデータ自体ではなく promise を返します。

これに対処するエレガントな方法は、then() メソッドを使用することです:

$.get(...).then(function(data){...});

または、ajax 設定を変更して呼び出しを同期させます。

于 2012-12-12T18:52:37.053 に答える
1

$.get呼び出しは非同期です。を呼び出すときまでreturn data;に、関数は返されてからかなり経っています。関数のスコープ外に変数を作成し、$.getコールバック ハンドラでdataその変数に代入します。

var json;

function getJson2(){
    // ...
    $.get(...., function(response){
        json = response;
    }
});

または、同期Ajax 呼び出しを行うこともできます。この場合、データを返すことはできます (ただし、もちろん、応答が受信されるまでスクリプトの実行はブロックされます)。これを行うには、 jQuerys関数asynchの引数を参照してください。$.ajax

于 2012-12-12T18:41:58.717 に答える
0
$.get("tasks.php?code="+cd, function(data){
    return data;
  })

$.get は非同期です。したがって、値が返されることはありません。コールバックを作成する必要があります。

同じ質問がここに表示されます: Return $.get data in a function using jQuery

于 2012-12-12T18:44:40.320 に答える