
16.05.2014, 11:51
|
Новичок на форуме
|
|
Регистрация: 04.01.2013
Сообщений: 9
|
|
не работает функция
Добрый день, подскажите пожалуйста как решить проблему:
аяксом я выгружаю сайдбар(асайд) с возможностью так же выгрузить подкаталоги в определенный div. Похожий список мне нужно выгрузить когда пользователь создает продукт, но в другом блоке и с другим оформлением. Получается почти полное дублирование кода. Я решил написать функцию, выдает undefined. Не могу понять почему.Информация с сервера приходит но по выскакивающему алерту создается ощущение, что сначала отрабатывает алерт, а потом идет запрос на сервер. Заранее спасибо за ответ
script>
func = function get_rubric($_id, $_class)
{
$.ajax({
url: '/Ajax/create/'+$_id,
dataType: 'json',
success: function(data)
{
console.log(data);
var html = "";
for (key in (data.info))
{
html +='<li class='+$_class+'><a id="' + data.info[key].id + '" class="num' + data.info[key].id_child +
'" href="#">' + data.info[key].name + '<span>' + data.info[key].id_parent + '</span></a></li>';
}
return html;
}
});
}
$(document).ready(function()
{
var html =func(0,"files");
alert(html);
//выдает undefined
......
|
|

16.05.2014, 12:17
|
Профессор
|
|
Регистрация: 22.04.2014
Сообщений: 151
|
|
очень странная конструкция. ajax сам по себе ничего не возвращает. разве что объект xhr раньше.
функции тоже так объявлять не правильно. либо func = function(){ тело фукнции}, либо function func() {тело функции}.
чтобы получить что то от func, она должна сделать вам return. у вас в ней этого нет.
как уже писал, ajax вам тоже ничего не вернет. надо делать вызов в succes объекта ajax. в этот месте данные уже пришли и с ними можно начинать работать.
|
|

16.05.2014, 12:57
|
Новичок на форуме
|
|
Регистрация: 04.01.2013
Сообщений: 9
|
|
как здесь цитату вставить?
"очень странная конструкция. ajax сам по себе ничего не возвращает. разве что объект xhr раньше"
Верно, это уже от отчаяния, часа 3 убил на это, по отдельности вызовы работают, а собрать в функцию не получается, и так пробовал и так. В php я немного разбираюсь, делал по образу и подобию, поставил ретурн в конец, но тогда html is not defined , т.е. success выполнился и в области видимости ретурна данных уже нет.
По именованию функции
Именованные (FunctionDeclaration) Анонимные (FunctionExpression)
function имя(параметры) {
...
} var имя = function(параметры) {
…
}
...
var имя = new Function(параметры, '...')
"надо делать вызов в succes объекта ajax. в этот месте данные уже пришли и с ними можно начинать работать."
Подскажите каким образом. Вернемся к началу задачи: при загрузке документа я кидаю на вход функции 2 параметра, она отрабатывает аякс запрос и возвращает html(который я закину в div-но это не существенно).Проблема с областями видимости, я не могу заранее определить data.info и подобные переменные, которые придут в аякс запросе, а если не определять их - not defined. Здесь я и прошу помощи
|
|

16.05.2014, 13:33
|
Профессор
|
|
Регистрация: 21.12.2012
Сообщений: 869
|
|
Естественно алерт происходит раньше. алерт вызывается сразу, а запрос идет какое то время, по моему логично
Что выдает console.log(data); ? приходит тебе json?
Последний раз редактировалось krasovsky, 16.05.2014 в 13:36.
|
|

16.05.2014, 13:42
|
Профессор
|
|
Регистрация: 22.04.2014
Сообщений: 151
|
|
script>
set_html = function ($_id, $_class)
{
$.ajax({
url: '/Ajax/create/'+$_id,
dataType: 'json',
success: function(data)
{
html = '';
for (key in (data.info))
{
html +='<li class='+$_class+'><a id="' + data.info[key].id + '" class="num' + data.info[key].id_child +
'" href="#">' + data.info[key].name + '<span>' + data.info[key].id_parent + '</span></a></li>';
}
}
});
}
var html = '';
$(document).ready(function()
{
set_html(0,"files");
//выдает undefined
......
не знаю где именно у вас потом используется html, я бы делал вызов необходимого действия после получения ответа в success ajax.
|
|

16.05.2014, 13:49
|
Новичок на форуме
|
|
Регистрация: 04.01.2013
Сообщений: 9
|
|
Да, данные приходят
Сейчас попробовал сделать подобным образом:
var html = ""
function get_rubric($_id, $_class)
{
$.ajax({
success: function(data)
{
for (key in (data.info))
{
html +='тра та та"
}
window.html = html;
}
});
// return html; здесь ретурн роли не играет, он все равно не видит html в success
}
$(document).ready(function()
{
var что-то там = get_rubric(0,"files");
// alert(html);
console.log(html);
задумка- когда отрабатывает success, передает в глобальную область видимости значение html. При загрузке DOM я вызываю функцию и потом использую переменную html, в которую записались мои данные.  Но на деле не получается, в конечном html пустая строка
|
|

16.05.2014, 14:03
|
Новичок на форуме
|
|
Регистрация: 04.01.2013
Сообщений: 9
|
|
извините, несколько раз прочел ваше сообщение, но смысла не уловил
get_rubric = function ($_id, $_class)
{
$.ajax({
success: function(data)
{
for (key in (data.info))
{
html +='набираем данные';
}
}
});
return html;
}
var html = ""
$(document).ready(function()
{
var html = get_rubric(0,"files");
$('#sidebar').html(html);
....
не работает html пустая строка
Мне нужно вызывать функцию и вставлять данные в два разных блока на странице Первый в сайдбаре при загрузке, второй по клику в body(все это опять же не существенно)
Последний раз редактировалось vikvikst474, 16.05.2014 в 14:05.
|
|

16.05.2014, 14:19
|
Профессор
|
|
Регистрация: 22.04.2014
Сообщений: 151
|
|
get_rubric = function ($_id, $_class,b)
{
$.ajax({
success: function(data) {
var html = '';
for (key in (data.info)) {
html +='набираем данные';
}
$(b).html(html);
}
});
}
$(document).ready(function()
{
get_rubric(0,"files",'#sidebar');
....
|
|

16.05.2014, 14:27
|
Новичок на форуме
|
|
Регистрация: 04.01.2013
Сообщений: 9
|
|
Опередили меня на 5 минут, обдумал ваши слова и сделал так
get_rubric = function ($_id, $_class)
{
$.ajax({
success: function(data)
{
for (key in (data.info))
{
html +='набираем данные';
}
$('#sidebar').html(html);
}
});
}
Работает. , добавляем третим параметром div и нормально. Нерадует, что решение не ...слишком красивое, но рабочее.
меня учили, что закинув в функцию параметры, нужно получить ответ и с ним уже работать.
ps: поищу еще способ как сделать вышеописанное красиво, если будут мысли пожалуйста пишите!
Последний раз редактировалось vikvikst474, 16.05.2014 в 14:30.
|
|

16.05.2014, 14:51
|
Новичок на форуме
|
|
Регистрация: 04.01.2013
Сообщений: 9
|
|
решил еще раз сформулировать задачу, т.к. первоначальное сообщение не совсем понятно и имеет ошибки
get_rubric = function ($_id, $_class)
{
$.ajax({
success: function(data)
{
for (key in (data.info))
{
html +='набираем данные';
}
//отсюда нужно передать html в ретурн ниже, т.е, чтобы функция завершила работу и вернула данные отправителю
}
});
return html;
//не работает, success отработал и html здесь нет
}
$(document).ready(function()
{
var html = get_rubric(0,"files");
//нужно вернуть значение из функции в переменную и положить в нижеуказанный div
$('#sidebar').html(html);
Задача:нужно вернуть значение из функции в переменную и положить в нижеуказанный div
ps^смотрю документацию по jquery ajax, но пока не нашел решения
pss:забыл сказать depp спасибо: Спасибо!
|
|
|
|