Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не работает функция по кнопке (https://javascript.ru/forum/jquery/33641-ne-rabotaet-funkciya-po-knopke.html)

Dimaz 30.11.2012 17:58

Не работает функция по кнопке
 
Всем привет.:) Помогите разобраться, почему у меня не работает цикл в функции start:
function start(data) {
for (var i in data) {
row += '<b>' + data[i].questions + '</b><Br>';
var ss = data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
break;
}
}

$(document).ready(function(){
$('form input:image').click(function() {
var drink = $('input[name=drink]:checked').val();
$.post('save_data.php', {drink: drink},
function(data){
if(data) {
var fieldsCount = data.length;
var row = '';
if(fieldsCount) {
row = '<form>';
start;
row += '<button onclick="return false; start;">Далее</button></form>';
$('#feeds').html(row);
}
}
  }, "json"); 
return false;
});
});

Функция start, прогоняющая цикл, вызывается при щелчке по элементу input:image. Но цикл не работает. Он использует полученные с сервера данные и потом работает с ними. Но как передать в вызываемую функцию эти данные? Вроде же указал: function start(data).
Мне нужно, чтобы он выполнил этот цикл, а потом при нажатии по кнопке "Далее", которая создается в функции метода $.post, прогнал этот цикл еще раз.

Dimaz 30.11.2012 19:52

Вообщем не стал я выносить функцию start отдельно, а оставил ее внутри функции(function(data){...}) метода $.post. Там же ее определяю, там же и вызываю, передавая в качестве аргумента data:
$(document).ready(function(){
$('form input:image').click(function() {
var drink = $('input[name=drink]:checked').val();
$.post('save_data.php', {drink: drink},
function(data){
if(data) {
var fieldsCount = data.length;
var row = '';
if(fieldsCount) {
row = '<form>';
function go(data) {                     //определяю функцию
alert("Ok!");
for (var i in data) {
row += '<b>' + data[i].questions + '</b><Br>';
var ss = data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
break;
}
}
go(data);            //вызываю функцию, передавая в параметре 'data', так как цикл использует данные с сервера
row += '<button onclick="return false; go(data);">Далее</button></form>';
$('#feeds').html(row);
}
}
  }, "json"); 
return false;
});
});

Теперь цикл выполняется, но после того как я нажимаю кнопку "Далее", функция больше не работает. Почему так?

vadim5june 30.11.2012 20:12

если Вы пишите onclick="return false; go(data); то до go(data) дело не дойдет надо просто onclick="go(data)"
Но тут у Вас еще и go и data не определены
надо их гдето запоминать

Dimaz 30.11.2012 20:15

Кажется начинаю понимать... Когда нажимаю кнопку 'Далее', происходит вызов функции go с параметром data. Но он не знает откуда взять этот параметр, так как он находится в функции метода $.post. То есть извне эту функцию вызвать нельзя, только из тела функции метода $.post. Как же тогда быть? Может данные с сервера куда-то отдельно сохранять, чтобы их можно было использовать не только в теле этой функции?:-?

Dimaz 30.11.2012 20:17

Цитата:

Сообщение от vadim5june (Сообщение 218825)
если Вы пишите onclick="return false; go(data); то до go(data) дело не дойдет надо просто onclick="go(data)"
Но тут у Вас еще и go и data не определены
надо их гдето запоминать

Ну вот вы уже ответили пока я писал.)))

vadim5june 30.11.2012 20:18

Цитата:

Сообщение от Dimaz
Может данные с сервера куда-то отдельно сохранять, чтобы их можно было использовать не только в теле этой функции?

еще и функцию go тоже не видно по ттем же причинам-надо переделать

Dimaz 30.11.2012 20:22

Цитата:

Сообщение от vadim5june (Сообщение 218828)
еще и функцию go тоже не видно по ттем же причинам-надо переделать

Ну вот я вначале темы и выносил ее отдельно, но почему то не работает в этом случае.:-?

Dimaz 30.11.2012 20:25

Если выношу функцию отдельно, то не передается параметр data. Почему так?

vadim5june 30.11.2012 20:28

Цитата:

Сообщение от Dimaz (Сообщение 218829)
Ну вот я вначале темы и выносил ее отдельно, но почему то не работает в этом случае.:-?

как в начале лучше
там ошибка написано
row = '<form>';
start;

надо start(data)
ну и гдето data запоминать и все нормально будет
return false надо убрать-для чего он Вам не понял

Dimaz 30.11.2012 20:34

Цитата:

Сообщение от vadim5june (Сообщение 218832)
как в начале лучше
там ошибка написано
row = '<form>';
start;

надо start(data)
ну и гдето data запоминать и все нормально будет
return false надо убрать-для чего он Вам не понял

Это я тут не написал start(data), в скрипте у меня прописано. Без return false будет страница перезагружаться, браузер же воспринимает нажатие по кнопке как передачу данных формы.

vadim5june 30.11.2012 20:37

Цитата:

Сообщение от Dimaz
Без return false будет страница перезагружаться, браузер же воспринимает нажатие по кнопке как передачу данных формы.

тогда поменяйте местами onclick="go(data);return false;"

vadim5june 30.11.2012 20:45

попробуйте так
if(fieldsCount) {
start(data);
var f1=document.createElement('form');
var b1=document.createElement('button');
b1.onclick=function(){start(this.data);return false};
b1.innerHTML='Далее';
b1.data=data;
f1.appendChild(b1);
document.body.appendChild(f1);
}

Dimaz 30.11.2012 20:50

Написал так:
row += '<button onclick="go(data); return false;">Далее</button></form>';

Страница стала перезагружаться.:-?
Пишу так:
row += '<button onclick="return false; go(data);">Далее</button></form>';

Страница не перезагружается.
Попробовал так:
row += '<button onclick="return false; alert('hi!')">Далее</button></form>';

Страница перезагружается и выводятся json данные с сервера:-?
А если так:
row += '<button onclick="alert('hi!'); return false;">Далее</button></form>';
Происходит тоже самое. Перезагружается страница и выводятся json данные с сервера.:blink:

vadim5june 30.11.2012 21:05

Цитата:

Сообщение от Dimaz
Написал так:
row += '<button onclick="go(data); return false;">Далее</button></form>';

Страница стала перезагружаться.

Это потомучто go(data) не срабатывает
alert неприменяйте

Dimaz 30.11.2012 21:33

Функция не работает вообще, даже по первой кнопке, которая передает данные на сервер:
function go(data) {
alert("Ok!");
for (var i in data) {
row += '<b>' + data[i].questions + '</b><Br>';
var ss = data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
break;
}
}

$(document).ready(function(){
$('form input:image').click(function() {
var drink = $('input[name=drink]:checked').val();
$.post('save_data.php', {drink: drink},
function(data){
if(data) {
var fieldsCount = data.length;
var row = '';
if(fieldsCount) {
row = '<form>';
go(data);
row += '<button onclick="go(data); return false;">Далее</button></form>';
$('#feeds').html(row);
}
}
  }, "json"); 
return false;
});
});

Что я не так делаю?:-?

vadim5june 30.11.2012 21:43

Цитата:

Сообщение от Dimaz
Что я не так делаю?

У Вас row внутри функции go не определена
var row='';//надо добавить

Dimaz 30.11.2012 22:02

Сделал так, но все равно не работает:
function go(data) {
alert("Ok!");
var row ="";
for (var i in data) {
row += '<b>' + data[i].questions + '</b><Br>';
var ss = data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
break;
}
$('#feeds').html(row);
}

А можно ее снова не определять, а как то передать в функцию. Она же уже определена в другой функции.:-?

vadim5june 30.11.2012 22:11

Цитата:

Сообщение от Dimaz
А можно ее снова не определять, а как то передать в функцию. Она же уже определена в другой функции

можно тогда надо писать
function go(data,row) {
ну и обращаться также
-------------
alert("Ok!");
не срабатывает?

Dimaz 30.11.2012 22:17

Цитата:

Сообщение от vadim5june (Сообщение 218845)
можно тогда надо писать
function go(data,row) {
ну и обращаться также
-------------
alert("Ok!");
не срабатывает?

alert как раз таки срабатывает, но цикл не работает, ничего не выводится, что создает цикл.
function go(data, row) {
alert("Ok!");
for (var i in data) {
row += '<b>' + data[i].questions + '</b><Br>';
var ss = data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
break;
}
}

$(document).ready(function(){
$('form input:image').click(function() {
var drink = $('input[name=drink]:checked').val();
$.post('save_data.php', {drink: drink},
function(data){
if(data) {
var fieldsCount = data.length;
var row = '';
if(fieldsCount) {
row = '<form>';
go(data, row);
row += '<button onclick="go(data); return false;">Далее</button></form>';
$('#feeds').html(row);
}
}
  }, "json"); 
return false;
});
});

Dimaz 30.11.2012 22:33

Вообщем надо как-то сделать, чтобы функция go принимала data, а возвращала измененную row.:-? Но как?

vadim5june 30.11.2012 22:33

Цитата:

Сообщение от Dimaz
alert как раз таки срабатывает, но цикл не работает, ничего не выводится, что создает цикл.

ну ничего и ненаписано чтоб выводилось
попробуйте
function go(data, row) {
alert("Ok!");
for (var i in data) {
row += '<b>' + data[i].questions + '</b><Br>';
var ss = data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
}
return row;
}

$(document).ready(function(){
$('form input:image').click(function() {
var drink = $('input[name=drink]:checked').val();
$.post('save_data.php', {drink: drink},
function(data){
if(data) {
var fieldsCount = data.length;
var row = '';
if(fieldsCount) {
row = '<form>';
row=go(data, row);
row += '<button onclick="go(data); return false;">Далее</button></form>';
$('#feeds').html(row);
}
}
  }, "json"); 
return false;
});
});

Dimaz 30.11.2012 22:43

Вот вот, недавно пришла такая же мысль, сделал return row, но не сработало. Прочитал ваше сообщение, теперь работает. Я так написал:
go(data, row);
, вместо:
row=go(data, row);

Спасибо!:) Весь день с этим мучился.)

vadim5june 30.11.2012 22:47

Цитата:

Сообщение от Dimaz
Спасибо! Весь день с этим мучился.)

Это еще не все от кнопки чтобы работало я гдето выше писал
http://javascript.ru/forum/jquery/33...tml#post218837
надо переделать

Dimaz 30.11.2012 22:53

Цитата:

Сообщение от vadim5june (Сообщение 218851)
Это еще не все от кнопки чтобы работало я гдето выше писал
http://javascript.ru/forum/jquery/33...tml#post218837
надо переделать

Да и это тоже еще не все.) Я останавливаю цикл оператором break, так как мне надо, чтобы он сделал только один круг(хотя он должен сделать 2). Потом когда нажимаю кнопку 'Далее', он должен выполнить второй круг, но для этого надо как-то передать в цикл i++, а то он тоже самое выведет.:-?

Dimaz 30.11.2012 23:05

Я всего лишь
row += '<button onclick="go(this.data); return false;">Далее</button></form>';
добавил и он заработал по кнопке.))

vadim5june 30.11.2012 23:06

Цитата:

Сообщение от Dimaz (Сообщение 218853)
Да и это тоже еще не все.) Я останавливаю цикл оператором break, так как мне надо, чтобы он сделал только один круг(хотя он должен сделать 2). Потом когда нажимаю кнопку 'Далее', он должен выполнить второй круг, но для этого надо как-то передать в цикл i++, а то он тоже самое выведет.:-?

все это не представляет больших проблем по моему мнению-подумайте введите еще переменную внутри функции go-цикл сделайте вручную а не по for
я спать ложусь-если не получится завтра сделаем

Dimaz 01.12.2012 15:32

Всем доброго дня.:) Доработал я немножко свой скрипт. Подумал, поразмышлял и пришел к выводу, что функция в методе $.post будет только принимать данные с сервера и проверять их. А вот обрабатывать их и выводить результат будет функция go. Просто на мой взгляд нет логики в таком бадминтоне. Зачем по десять раз перебрасываться параметрами? Вот модифицированный код:
function go(data) {
alert("Ok!");
var row = '';
row = '<form>';
for (var i in data) {
row += '<b>' + data[i].questions + '</b><Br>';
var ss = data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
break;
}
row += '<button onclick="go(data); return false;">Далее</button></form>';
$('#feeds').html(row);
}

$(document).ready(function(){
$('form input:image').click(function() {
var drink = $('input[name=drink]:checked').val();
$.post('save_data.php', {drink: drink},
function(data){
if(data) {
var fieldsCount = data.length;
if(fieldsCount) {
go(data);
}
}
  }, "json"); 
return false;
});
});

Осталось разобраться с вызовом этой функции по кнопке.

Dimaz 01.12.2012 16:20

Вот куда сохранить данные с сервера, чтобы с ними потом можно было работать дальше?:-?

vadim5june 01.12.2012 16:35

Цитата:

Сообщение от Dimaz (Сообщение 218969)
Вот куда сохранить данные с сервера, чтобы с ними потом можно было работать дальше?:-?

для начала заведите глобальную переменную для отладки
var Data;
в обработчике напишите
function(data){Data=data;

и используйте эту Data где нужно
--------------------
потом из глобальных надо будет убрать-спрятать внутри гдето

Dimaz 01.12.2012 17:11

Так имеете в виду:
row += '<button onclick="function(data){Data=data;go(data); return false;}">Далее</button></form>';

А глобальную переменную куда нужно вписать?

vadim5june 01.12.2012 17:27

Цитата:

Сообщение от Dimaz (Сообщение 218981)
А глобальную переменную куда нужно вписать?

var Data;
function go(data) {
alert("Ok!");
.....
$.post('save_data.php', {drink: drink},
function(data){Data=data;
....

Dimaz 01.12.2012 17:40

Не работает.:(
var Data;
function go(data) {
alert("Ok!");
var row = '';
row = '<form>';
for (var i in data) {
row += '<b>' + data[i].questions + '</b><Br>';
var ss = data[i].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+i+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}
break;
}
row += '<button onclick="function(data) {Data = data; go(data); return false;}">Далее</button></form>';
$('#feeds').html(row);
}

$(document).ready(function(){
$('form input:image').click(function() {
var drink = $('input[name=drink]:checked').val();
$.post('save_data.php', {drink: drink},
function(data){
Data = data;
if(data) {
var fieldsCount = data.length;
if(fieldsCount) {
go(data);
}
}
  }, "json"); 
return false;
});
});

vadim5june 01.12.2012 17:53

Опишите теперь как должно работать щас попробуем закончить -Вы не написали пока ничего
То есть первый раз запускается из обработчика и вызываем go и вытаскивает из data
с i=0;а потом-как нажимаем на кнопку снова запускаем go но с i=1
а дальше?

Dimaz 01.12.2012 18:01

Цитата:

Сообщение от vadim5june (Сообщение 218986)
Опишите теперь как должно работать щас попробуем закончить -Вы не написали пока ничего
То есть первый раз запускается из обработчика и вызываем go и вытаскивает из data
с i=0;а потом-как нажимаем на кнопку снова запускаем go но с i=1
а дальше?

Ну вообще он должен удалить старые inputы и вывести новые. А чтобы выбранное значение в старых не терялось, помещать его в какой-нибудь скрытый элемент в форме.
Выводится первый вопрос и варианты ответов, нажимаем кнопку Далее, должен появиться следующий вопрос и другие варианты. А старый вопрос с вариантами должен удаляться. Именно удаляться, а не заменяться, так как в одном вопросе может быть 3 варианта ответов, а в другом уже например 4.

vadim5june 01.12.2012 18:11

Так попробуйте
var Data;var ii=0;
function go() {var data=Data;
alert("Ok!=+ii");
var row = '';
row = '<form>';

row += '<b>' + data[ii].questions + '</b><Br>';
var ss = data[ii].answers.split(',');
for (var i2 = 0; i2<ss.length; i2++) {
row += '<input type="radio" name="id_answer'+ii+'" value="' + i2 + '">' + ss[i2] + '<Br>';
}

row += '<button onclick="go(); return false;">Далее</button></form>';
$('#feeds').html(row);
ii++;
}

$(document).ready(function(){
$('form input:image').click(function() {
var drink = $('input[name=drink]:checked').val();
$.post('save_data.php', {drink: drink},
function(data){
Data = data;
if(data) {
var fieldsCount = data.length;
if(fieldsCount) {
go();
}
}
  }, "json"); 
return false;
});
});

Dimaz 01.12.2012 18:20

Отлично! Работает. Спасибо огромное.:) Сейчас поем, буду дальше с сохранение значения в скрытый элемент разбираться.

vadim5june 01.12.2012 19:34

Цитата:

Сообщение от Dimaz
буду дальше с сохранение значения в скрытый элемент разбираться.

Лучше хранить в объекте-только результат=номер вопроса-номер ответа(ответов если допускается несколько)
var Data;var ii=0;var Rez={};

Dimaz 01.12.2012 19:47

Я не учел один момент. Если пользователь захочет вернуться к предыдущему вопросу. В таком случае нужно создать еще одну кнопку, "Назад". Нажимаем "Далее", делаем инкремент i++, если жмем "Назад", тогда декремент i--. Только как сделать, чтобы он делал это по нажатию кнопок.
Выбранные значения наверно лучше сохранять в массив? Потом по нажатию кнопок пробегаться по нему, чтобы при переключении вопросов показывался ранее выбранный вариант. Т.е. вставлять галочку на ранее выбранном ответе, а то пользователю придется заново выбирать ответ.
Были мысли выводить вопросы с вариантами ответов поочередно. Т.е. вывести первый, нажимаем "Далее", выводится второй, а первый скрывается средствами свойства CSS:
$(document).ready(function(){
    
var i = 0, questions = $('form p');
questions[0].style.display = 'block';
$('#right').click(function(){
if(i === questions.length - 1) {
this.style.display='none';
document.getElementById('left').style.display='none';
questions[i].style.display='none'; 
$('input[type=submit]').show();    
return false;
}  
questions[i].style.display='none'; 
i++;
questions[i].style.display='block';
$('#left').show();
});
$('#left').click(function(){
if(i === 0) {
return false;
}
questions[i].style.display='none'; 
i--;
questions[i].style.display='block';
if(i === 0) {
this.style.display='none'
}
});
});

Какая идея на ваш взгляд более удачная и логичная? Ну и в плане эффективного распределения и потребления ресурсов, что лучше?

Dimaz 01.12.2012 20:00

Вот кстати пример реализации этой идеи. Помог один человек сделать:
http://jsfiddle.net/S2Gcb/1/
Не правильно я вам сказал, выводится не поочередно, а все сразу. Только показывается первый, а остальные пока скрыты.

vadim5june 01.12.2012 20:22

Цитата:

Сообщение от Dimaz (Сообщение 219008)
Вот кстати пример реализации этой идеи. Помог один человек сделать:
http://jsfiddle.net/S2Gcb/1/
Не правильно я вам сказал, выводится не поочередно, а все сразу. Только показывается первый, а остальные пока скрыты.

Если тебя устраивает то вопрос закрыт.
Я так понял что ты для тренировки программирования сам взялся делать потому что в инете много готовых решений


Часовой пояс GMT +3, время: 01:31.