Вопрос о переменной области в моем jQuery - PullRequest
4 голосов
/ 12 мая 2011

У меня возникла проблема с областью действия моих переменных после получения их из внутреннего сценария PHP в виде 2-мерного массива JSON.Вот мой код:

var qns, qis, ncs, nzs, tps;

function get_questions() {
    var url = "php/pytania.php";
    $.ajax({
        cache: false,
        type: "GET",
        dataType: "text",
        url: url,
        success: function(response) {
            data = jQuery.parseJSON(response);
            qns = data.qns;
            qis = data.qis;
            ncs = data.ncs;
            nzs = data.nzs;
            tps = data.tps;
        }
    });
}

$(document).ready(function() {
    var index = 0;
    get_questions();
    $("#question_no").text(qns[index]);
});

Когда я в конце пытаюсь сослаться на мой массив qns, он отображает переменную undefined error.Это работает, однако, в рамках заявления ajax - никаких проблем там нет ...

Спасибо и берегите себя!:)

Петр.

Ответы [ 3 ]

18 голосов
/ 12 мая 2011

Проблема в том, что метод успеха вызывается асинхронно, то есть после того, как вы вызвали $ (). Ajax и пытаетесь сослаться на переменную, она еще не была назначена, так как методы обратного вызова успеха не были выполнены.

Эту проблему можно решить, установив для параметра async значение false, например:

$.ajax(
   {
      /* this option */
      async: false,
      cache: false,
      type: "GET",
      dataType: "text",
      url: url,
...

Это означает, что после вызова ajax больше ничего не будет выполняться, пока вы не получите свой ответ. Альтернативой этому является размещение кода, где вам нужно использовать массив IN самого метода обратного вызова.

4 голосов
/ 12 мая 2011

Ваша проблема в том, что вы пытаетесь использовать данные до того, как они поступят.

Вы можете добавить функцию обратного вызова, которую вы вызываете после получения данных с сервера:

var qns, qis, ncs, nzs, tps;

function get_questions(callback) {

   var url = "php/pytania.php"; 

   $.ajax({

      cache: false,
      type: "GET",
      dataType: "text",
      url: url,
      success: function(response) {

         data = jQuery.parseJSON(response);

         qns = data.qns;
         qis = data.qis;
         ncs = data.ncs;
         nzs = data.nzs;
         tps = data.tps;

         callback();

      }

   } );

}

$(document).ready(function() {

   var index = 0;

   get_questions(function(){

     $("#question_no").text(qns[index]);

   });

});

Примечание: вы можете использовать dataType: "json", тогда ответ будет проанализирован автоматически, и вам не нужно будет использовать parseJSON.

0 голосов
/ 12 мая 2011

Вы должны добавить функцию обратного вызова в ваш запрос ajax и попробовать "$ (" #question_no ") .text (qns [index]);"в функции обратного вызова. Вы пытаетесь получить доступ к переменной до того, как она была фактически загружена запросом ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...