JS Переменная вне функции?

Здравствуйте.

Я плохо знаком с JS, но возникла необходимость реализовать несколько функций на этом языке и я столкнулся с небольшой проблемой:



Вообщем есть скрипт выполняемый после $(document).ready(function(), он получает данные от php скрипта в формате json и вставляющий их в определенный div



$.getJSON('json.php?place=1&page=1', function(data){<br/>
 $.each(data, function (i, item) {<br/>
 $(&quot;#slideInner&quot;).append(item.title);<br/>
 });<br/>
 });<br/>




Данные берутся из базы и их количество может меняться. Так вот меня интересует, как можно посчитать количество полученных записей. И как потом использовать это значение вне функции.



Просто если сделать так:



$.getJSON('json.php?place=1&page=1', function(data){<br/>
 $.each(data, function (i, item) {<br/>
 $(&quot;#slideInner&quot;).append(item.title);<br/>
var records = 10;<br/>
 });<br/>
 });<br/>
alert (records);<br/>




Алерт ничего не выведет, так как зона видимости переменной records ограничена.



Извиняюсь за глупый вопрос, и не совсем грамотную его постановку, но пишу в 6-ть утра не спав уже около 20часов.

Спасибо за ответы.
  • Вопрос задан
  • 6197 просмотров
Пригласить эксперта
Ответы на вопрос 5
@mx2000
1. кол-во записей можно отдавать в самом JSON в качестве метаинформации о данных, например так:
{"count": 100, "data": { ... 100 записей ... } }

2. как альтернативный вариант, можно итерироваться по JSON-структуре:
var records = -1; // начальное значение, "данные еще не посчитаны".

$.getJSON('json.php?place=1&page=1', function(data) {
records = 0;
$.each(data, function (i, item) {
$("#slideInner").append(item.title);
records++;
});
alert(records); // будет актуальное кол-во записей.
});

alert (records); // будет -1


ЕМНИП, $.getJSON() выполняется асинхронно, следовательно алерт в вашей версии будет вызываться раньше, чем данные будут получены, поэтому имеет смысл генерить некое событие «данные получены» или указывать функцию-продолжение в callback'е getJSON().
Ответ написан
Комментировать
kashey
@kashey
Программирую большую половину жизни
В JS все не так как нормальных языках.
изначально переменные имеют глобальную область видимости. Как будто бы они создаются в начале программы.
Ключевое var переводит их в локальную видимость — как будто бы они создаются в начале вашей функции(а не строчки или скобочки)

получается что$.each(data, function (i, item) {
$("#slideInner").append(item.title);
var records = 10; <-- обьявлена как VAR. За пределами этой функции она не определена.
});

Сейчас вам достаточно убрать var у records.
Ответ написан
У массивов есть свойство length. Если data массив, то просто data.length. Работает некорректно, если из массива удалять строки, да jQuery-вский each не лучшим образом работает. Или, может, точнее сказать, что строки удалять нельзя.

Или просто поставить счетчик в each.

Чтобы работало:

var records = 0;
$.getJSON('json.php?place=1&page=1', function(data){
$.each(data, function (i, item) {
$("#slideInner").append(item.title);
records = 10;
});
});
alert (records);


Использовать глобальные переменные не рекомендую, но глобальная переменная объявляется без var:
records = 10; — мы объявили глобальную переменную и присвоили ей значение 10. Ну или:
window.records = 10; — я так делаю, что бы точно знать, что я не забыл поставить var, а здесь именно тот редкий случай, когда нужна глобальная переменная, но я не видел, что бы так кто-то еще писал.
Ответ написан
— Количество записей считаем с помощью for… in
— Сделайте records глобальной и она будет видна везде.
Ответ написан
Комментировать
taliban
@taliban
php программист
вообще посмотрите в каком виде Ваш json, если начинается с [ то это массив и, как писали выше, у него будет свойство length, иначе это обьект, и как писали еще выше можете длину передать руками.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы