Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: return из замыкания
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » return из замыкания

Страниц (1): [1]
 

1. Panoptik - 24 Мая, 2012 - 15:37:33 - перейти к сообщению
есть обыкновенная форма
CODE (html):
скопировать код в буфер обмена
  1. <form onsubmit='return myfunc();'></form>

и собственно функция
CODE (javascript):
скопировать код в буфер обмена
  1. function myfunc() {
  2.   var  result = false;
  3.   //ajax request
  4.   $.getJSON('my.site.ru',{},function(data) {
  5.     //тут обработка результатов
  6.     if(data.error == 'ok') {
  7.       //мои действия и выход из всей большой функции позволяя форме просабмититься
  8.       return true;
  9.     }
  10.   });
  11.   return result;
  12. }

получается ретурн делается внутри замыкания и форма не хочет сабмититься.
вопрос: как правильно вернуть true в данной ситуации?
2. caballero - 24 Мая, 2012 - 15:56:34 - перейти к сообщению
здесь асинхронный вызов
return result; у тебя сработает раньше чем отработает ajax и независимо от того как он сработает
return true; просто не имеет смысла
3. Panoptik - 24 Мая, 2012 - 15:59:29 - перейти к сообщению
как же выйти из положения?
4. DeepVarvar - 24 Мая, 2012 - 16:00:44 - перейти к сообщению
CODE (javascript):
скопировать код в буфер обмена
  1. function myfunc() {
  2.   var  result = false;
  3.   //ajax request
  4.   $.getJSON('my.site.ru',{},function(data) {
  5.     //тут обработка результатов
  6.     if(data.error == 'ok') {
  7.       //мои действия и выход из всей большой функции позволяя форме просабмититься
  8.       result = true;
  9.     }
  10.   });
  11.   return result;
  12. }

(Добавление)
А не, не прав...
5. Panoptik - 24 Мая, 2012 - 16:04:32 - перейти к сообщению
DeepVarvar пишет:
А не, не прав...
это прискорбно

жуткая неделя. голова не варит вообще(
6. Мелкий - 24 Мая, 2012 - 16:16:47 - перейти к сообщению
DeepVarvar пишет:
А не, не прав...

Да нет, только 1 строка пропущена.
После result = true; надо инициировать отсылку формы повторно. $(/*подходящий идентификатор*/).submit();

+, возможно, убрать слово var, т.е. сделать глобальной. В каллбеках регулярно путаю области видимости.
7. Panoptik - 24 Мая, 2012 - 16:21:12 - перейти к сообщению
решил практически так же как посоветовал Мелкий
с одним лишь условием что убрал из формы событие onsubmit ибо происходило зацикливание (рекурсивный вызов)
CODE (html):
скопировать код в буфер обмена
  1. <form id='myform'>
  2.  <input type='submit'  onclick='return myfunc();' />
  3. </form>

CODE (javascript):
скопировать код в буфер обмена
  1.     function myfunc() {
  2.       //ajax request
  3.       $.getJSON('my.site.ru',{},function(data) {
  4.         //тут обработка результатов
  5.         if(data.error == 'ok') {
  6.           //мои действия и выход из всей большой функции позволяя форме просабмититься
  7.           $('#myform').submit();
  8.         }
  9.       });
  10.       return false;
  11.     }
8. Viper - 24 Мая, 2012 - 16:25:16 - перейти к сообщению
Panoptik если отсылаете данные на другой домен


CODE (javascript):
скопировать код в буфер обмена
  1. $('#myform').submit(function(e){
  2.         e.preventDefault();
  3.         $.ajax({
  4.                 url: 'my.site.ru',
  5.                 data: $(this).serialize()+'callback=?',
  6.                 dataType: 'json',
  7.                 async: false,
  8.                 crossDomain: true
  9.         }).done(function(data){
  10.                 if(data.error == 'ok') {
  11.                         return true;
  12.                 }
  13.         });
  14. });


На стороне сервера ответ должен быть таким
PHP:
скопировать код в буфер обмена
  1. echo $_GET['callback'].'('.json_encode($response).')';


Но помните что данные от сервера js ждать не будет, а продолжит выполнять код дальше.

Все же уточните что вы хотите конкретно - проверить введенные данные и отправить, либо просто отправить? И куда? Если кросдомен, то одно, если на тот же самый, то другое.
9. Panoptik - 24 Мая, 2012 - 16:30:00 - перейти к сообщению
ну задача следующая:
интернет-магазин. пользователь делает заказ, оставляет свои данные в форме и сабмитит ее. данные о заказе записываются в мою базу данных, и я возвращаю ответ, где указывается номер заказа и сумма, для отправки на сторонний сервер оплаты. эти данные я подставляю в хидден поля этой же формы перед отправкой
вот тут то мне и нужно сделать сабмит и отправить укомплектованную форму для завершения оплаты
10. DeepVarvar - 24 Мая, 2012 - 16:32:23 - перейти к сообщению
Viper пишет:
если отсылаете данные на другой домен <form id="myform"> ...

С классом тоже все ровно проходит, да и не важно по какой метке искать элемент, его всеравно можно обработать.
11. tuareg - 24 Мая, 2012 - 18:19:21 - перейти к сообщению
Тут скорее всего надо смотреть в сторону $.Deferred.pipe()
12. Viper - 25 Мая, 2012 - 08:42:09 - перейти к сообщению
DeepVarvar пишет:
С классом тоже все ровно проходит, да и не важно по какой метке искать элемент, его всеравно можно обработать.
не в том дело. я привел пример. запрос-то походу кросдоменный.

 

Powered by ExBB FM 1.0 RC1