Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.05.2014, 11:51
Новичок на форуме
Отправить личное сообщение для vikvikst474 Посмотреть профиль Найти все сообщения от vikvikst474
 
Регистрация: 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
......
Ответить с цитированием
  #2 (permalink)  
Старый 16.05.2014, 12:17
Профессор
Отправить личное сообщение для depp Посмотреть профиль Найти все сообщения от depp
 
Регистрация: 22.04.2014
Сообщений: 151

очень странная конструкция. ajax сам по себе ничего не возвращает. разве что объект xhr раньше.
функции тоже так объявлять не правильно. либо func = function(){ тело фукнции}, либо function func() {тело функции}.
чтобы получить что то от func, она должна сделать вам return. у вас в ней этого нет.
как уже писал, ajax вам тоже ничего не вернет. надо делать вызов в succes объекта ajax. в этот месте данные уже пришли и с ними можно начинать работать.
Ответить с цитированием
  #3 (permalink)  
Старый 16.05.2014, 12:57
Новичок на форуме
Отправить личное сообщение для vikvikst474 Посмотреть профиль Найти все сообщения от vikvikst474
 
Регистрация: 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. Здесь я и прошу помощи
Ответить с цитированием
  #4 (permalink)  
Старый 16.05.2014, 13:33
Профессор
Отправить личное сообщение для krasovsky Посмотреть профиль Найти все сообщения от krasovsky
 
Регистрация: 21.12.2012
Сообщений: 869

Естественно алерт происходит раньше. алерт вызывается сразу, а запрос идет какое то время, по моему логично
Что выдает console.log(data); ? приходит тебе json?

Последний раз редактировалось krasovsky, 16.05.2014 в 13:36.
Ответить с цитированием
  #5 (permalink)  
Старый 16.05.2014, 13:42
Профессор
Отправить личное сообщение для depp Посмотреть профиль Найти все сообщения от depp
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 16.05.2014, 13:49
Новичок на форуме
Отправить личное сообщение для vikvikst474 Посмотреть профиль Найти все сообщения от vikvikst474
 
Регистрация: 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 пустая строка
Ответить с цитированием
  #7 (permalink)  
Старый 16.05.2014, 14:03
Новичок на форуме
Отправить личное сообщение для vikvikst474 Посмотреть профиль Найти все сообщения от vikvikst474
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 16.05.2014, 14:19
Профессор
Отправить личное сообщение для depp Посмотреть профиль Найти все сообщения от depp
 
Регистрация: 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');

....
Ответить с цитированием
  #9 (permalink)  
Старый 16.05.2014, 14:27
Новичок на форуме
Отправить личное сообщение для vikvikst474 Посмотреть профиль Найти все сообщения от vikvikst474
 
Регистрация: 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.
Ответить с цитированием
  #10 (permalink)  
Старый 16.05.2014, 14:51
Новичок на форуме
Отправить личное сообщение для vikvikst474 Посмотреть профиль Найти все сообщения от vikvikst474
 
Регистрация: 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 спасибо: Спасибо!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена значения в store страно работает I3ev ExtJS 0 09.12.2012 14:22
НЕ работает функция length Golovastik Серверные языки и технологии 4 14.02.2011 17:31
Не работает функция инфоокна tomAlba Общие вопросы Javascript 0 30.01.2011 00:54
ява-скрипт выборочно работает-не работает zeta777 Internet Explorer 0 20.01.2010 11:41
Не работает eval в IE ..::Silence::.. Общие вопросы Javascript 8 25.03.2009 13:16