Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция не возвращает результат 
V
    Опции темы
z006
Дата 19.2.2010, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



Добрый день.
есть вопрос,и подозреваю что глупый,ибо решение где-то на поверхности,но я его не вижу...((((
суть проблемы:

имеем такой код:

Код

function a(inputname)
{
.......
.......
.......
var c=block.firstChild.nodeValue;
return c;
.......
.......
.......
}
function b(inputname)
{
var cvb=a(inputname);
alert(cvb);
}


вызываем ф-цию b,она вызывает ф-цию а с параметром.ф-ция а отрабатывает верно,если там проверять алертом значение переменной с-то все верно.но когда в ф-ции b идет вывод значения cvb - то выдает undefined.
думал может не успевает передать значение.пробовал ставить в ф-цию b setTimeout.результат одинаковый.
где тут псинка закопана?
PM MAIL   Вверх
Amphiluke
Дата 19.2.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
<script type="text/javascript">
function a(inputname){
    var block = document.getElementById("ablock");
    var c=block.firstChild.nodeValue;
    return c;
}
function b(inputname){
var cvb=a(inputname);
alert(cvb);
}
</script>
</head>

<body>
<div id="ablock">nodeValue</div>
<p onclick="b('qq');">click</p>
</body>
</html>

PM   Вверх
z006
Дата 19.2.2010, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



и правда этот пример работает.....очень странно....выкладываю весь кусок кода


Код

function check1(inputname)
{
var name=document.getElementById(inputname).value;
 url=".....................php?name="+name;
    function getXMLHttpRequest() 
     {
      var xmlhttpreq=null;
      if (window.XMLHttpRequest) //Mozilla, Safari & IE 7
       {
    xmlhttpreq = new XMLHttpRequest();
       }
      else if(window.ActiveXObject) // IE 6 and later
       {
    try 
    {
     xmlhttpreq = new ActiveXObject('Msxml2.XMLHTTP');
    }
    catch(err) 
    {
     xmlhttpreq = new ActiveXObject('Microsoft.XMLHTTP');
    }
       }
      return xmlhttpreq;
     }
    function sendRequest(method, url, param)
     {
      var request = getXMLHttpRequest();
      request.open(method, url, true);
      request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded');
      request.onreadystatechange = function() 
       {
    handleAjaxResponse(request);
       };
      request.send(param);
     }
    function isSuccess(request)
     {
      return request.status == 0 || (request.status >= 200 && request.status < 300);
     }
    function handleAjaxResponse(request)
     {
   if(request.readyState == 4) 
       {
    if(isSuccess(request))
     {
      var responseXML = request.responseXML;
      var root = responseXML.getElementsByTagName('response').item(0);
      var responseID = Array();
      var responseValue = Array();
      for (var iNode = 0; iNode < root.childNodes.length; iNode++) 
       {
        var node = root.childNodes.item(iNode);
        for (ik = 0; ik < node.childNodes.length; ik++) 
         {
          var block = node.childNodes.item(ik);
          if (block.nodeType != 1) 
          continue;
          switch(block.nodeName)
           {
        case "answer":
        var c=block.firstChild.nodeValue;
        return c;
        break;
           }
         }
       }
      for(ik=0; responseID.length; ik++)
       {
        document.getElementById(responseID.pop()).innerHTML = responseValue.pop();
       }
     }
       }
     }
sendRequest('GET', url, null);
}
function check(inputname)
{
var cvb=check1(inputname);
alert(cvb);
}


результат,прилетающий от пхп файла,простой: 0 или 1
PM MAIL   Вверх
Amphiluke
Дата 19.2.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Ну вот и покажите мне теперь где у вас написано, чтобы функция check1 возвращала бы какое-либо значение? smile 
Строка 
Цитата

Код

return c;


это возврат значения вложенной функцией handleAjaxResponse, а вот сама check1 нигде ничего не возвращает.
PM   Вверх
z006
Дата 19.2.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



вот я видимо сейчас опозорюсь с этим вопросом,но а как заставить её вернуть это значение именно от имени ф-ции check1?
если ставлю переменню с как глобальную,и переношу ретёрн так,то все-равно андефинед.
Код

sendRequest('GET', url, null);
return c;

PM MAIL   Вверх
Amphiluke
Дата 19.2.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Цитата(z006 @  19.2.2010,  23:36 Найти цитируемый пост)
если ставлю переменню с как глобальную,и переношу ретёрн так,то все-равно андефинед

Ну ясное дело. smile Функция check1 спокойно отправляет запрос и не заботится о том, чтобы ожидать ответа. Этим занимается onreadystatechange ну и ваша handleAjaxResponse.

Грубо говоря, этот alert(cvb) нужно вызывать только из handleAjaxResponse, когда readyState примет значение 4...
PM   Вверх
z006
Дата 19.2.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



это я понимаю,но я хотел чтоб у меня была одна функция,которая сможет отсылать запросы на пхп"шные файлы,и получать их ответы,а потом уже отдавать этот полученный ответ тем функциям,которые первоначально запросили его,чтоб уже в этих мелких ф-циях разбирать эти ответы как надо.грубо говоря жалкое подобие библиотеки что-ли надо... smile 
но почему-то не получается.....как его "вывернуть",чтоб оно заработало как мне надо? smile 
PM MAIL   Вверх
Amphiluke
Дата 19.2.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



P.S. Если непонятно сказал, функция check1 завершается раньше, чем будут получены данные.

Добавлено через 3 минуты и 11 секунд
У вас используются асинхронные запросы? Ну если так нужно, сделайте синхроные. Но тогда нужен будет тот ход с глобальной переменной c, который вы только что пробовали.

Добавлено через 6 минут и 37 секунд
А вообще я не вижу ничего плохого в том, чтобы по получении данных асинхронным запросом, вызвать в методе onreadystatechange нужную ф-цию обработки полученных данных. Зачем возвращаться в вызывавшую функцию? smile
PM   Вверх
z006
Дата 19.2.2010, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



ну я просто ж  не знаю в какую ф-цию надо будет передать результат.
это что,для вызова ф-ции check1 допустим по нажатию кнопки,к примеру,в onmouseup надо будет указать параметры:поле откуда берем значение,имя ф-ции,куда будем отдавать результат.
так получается?
PM MAIL   Вверх
Amphiluke
Дата 19.2.2010, 21:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Ну если вы не знаете, в какую ф-цию передавать данные, то, видимо, да, так.
Человек, который будет вызывать ф-цию check1, должен будет передать ей в параметре указатель на нужную ему callback-функцию. А метод onreadystatechange по этому указателю вызовет функцию.
Если помимо этого есть много других передаваемых параметров, их можно объединить в один объект, методом которого будет в частности и callback-функция. И тогда нужно будет лишь передавать функции check1 указатель на этот объект.

Это сообщение отредактировал(а) Amphiluke - 19.2.2010, 21:15
PM   Вверх
z006
Дата 19.2.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



я перенабросал код,но стал немного в тупик.если у меня имя функции содержится в переменной скажем funcname ,то не вызову-же я эту функцию так: funcname( с );
как её вызвать?........user posted image

Это сообщение отредактировал(а) z006 - 19.2.2010, 21:18
PM MAIL   Вверх
Amphiluke
Дата 19.2.2010, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Передавайте не имя функции в виде строки, а указатель на нее.
Либо, если передаете имя-строку, можно воспользоваться ф-цией eval для вызова по имени... Хотя это менее предпочтительный вариант, чем первый.
PM   Вверх
z006
Дата 19.2.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



поставили в тупик. smile 
опыта и знаний маловато.ушел читать литературу.за ссылки что почитать-буду благодарен.
PM MAIL   Вверх
Amphiluke
Дата 19.2.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



А что не получается-то?

PM   Вверх
z006
Дата 19.2.2010, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



по поводу вызова функции через указатель или евал
PM MAIL   Вверх
Amphiluke
Дата 19.2.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Ну вот например...
Код

function requestResultsProcessing(requestResults) {
    // обработка полученных данных
}

function check1(callbackFunction) {
    .....................
    if (request.readyState == 4) {
        .................
        var c=block.firstChild.nodeValue;
        callbackFunction(с);
    }
    .....................
}

// вызов ф-ции check1 с передачей ей указателя на ф-цию обработки данных
check1(requestResultsProcessing);


или
Код

function requestResultsProcessing(requestResults) {
    // обработка полученных данных
}

function check1(callbackFunctionName) {
    .....................
    if (request.readyState == 4) {
        .................
        var c=block.firstChild.nodeValue;
        eval(callbackFunctionName + "(" + с + ")");
    }
    .....................
}

// вызов ф-ции check1 с передачей ей имени ф-ции обработки данных
check1("requestResultsProcessing");



Это сообщение отредактировал(а) Amphiluke - 19.2.2010, 21:54
PM   Вверх
z006
Дата 19.2.2010, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



к сожалению плюсик жмакать не могу,т.к. не имею 100 постов.
поэтому просто большое человеческое спасибо.
буду разбираться уже завтра,на сегодня все.если что-я еще напишу завтра.
PM MAIL   Вверх
z006
Дата 20.2.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



странно....у меня не выходит.....вызываю по событию onkeyup=checkdata('childlogin','checklogin')  ,где checklogin это имя функции которой надо отдать результат.
Код

function checkdata(inputname,funcname)
{
....................
        case "answer":
        var c=block.firstChild.nodeValue;
        funcname(c);
           }
........................       
}
function checklogin(name)
{
alert(name);
}


в обработчике мне выдает Ошибка: funcname is not a function

где я не уловил суть?
PM MAIL   Вверх
Amphiluke
Дата 20.2.2010, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Если передаете строковое представление имени функции, вызывайте с помощью eval, как показано выше. А лучше передавайте указатель.
PM   Вверх
z006
Дата 20.2.2010, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 12.6.2009

Репутация: нет
Всего: нет



точно.передал не как строковые данные-и заработало! smile 
спасибо огромное! smile 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.