php mysql не сохраняет данные при нажатии кнопки и запускает функцию $ .ajax - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть

"fsField" - это класс всех элементов в форме. Поэтому всякий раз, когда пользователь перемещается в другое поле, он отправляет форму, используя функцию autosave () - приведенную ниже. Он сохраняет данные, когда пользователь стирает, но когда пользователь нажимает кнопку с классом «save_secL», чтобы перейти на следующую страницу, он не сохраняет.

$('.fsField').bind('blur', function()
 {
autosave();
 }

 });

но когда я использую этот код

$('.save_secL').click(function()
{
 var buttonid = this.id;
{

                    var answer = confirm("You have left some questions unanswered. Click OK if you are sure to leave this section? \\n Click CANCEL if you want stay in this section. ");
    if(!answer)
    {
    var spl_items = valid().split(',');
    $(spl_items[0]).focus();

return false;
  }
else
{
        $('#hidden_agree').append('<input id="secLuseragreed" name="secL_user_agreed" value="unanswered" type="hidden" />');
    autosave();
    window.location= buttonid+".php"
        }
    }
    else
    {
    $('#hidden_agree').append('<input id="secLuseragreed" name="secL_user_agreed" value="answered all" type="hidden" />');
    autosave();
    window.location= buttonid+".php"
    }
}
  });

** autosave_secL.php - это источник php, который сохраняет данные в базе данных. Я запустил его независимо, и он сохраняет данные в порядке. **

function autosave()
{
var secL_partA_ques_1_select = $('[name="secL_partA_ques_1_select"]').val();
var secL_partA_ques_1 = $('[name="secL_partA_ques_1"]:checked').val();
var secL_partA_ques_2_select = $('[name="secL_partA_ques_2_select"]').val();


$.ajax(
    {
    type: "POST",
    url: "autosave_secL.php",
    data: "secL_partA_ques_1_select=" + secL_partA_ques_1_select + "&secL_partA_ques_1=" + secL_partA_ques_1 + "&user_id=<?php echo $row_token[user_id]?>" + "&updated_by=<?php echo $member."-".$key;?>",
        cache: false,
    success: function()
    {    
    $("#timestamp").empty().append('Data Saved Successfully!');
    }

    });

}

**

valid () - это функция проверки, которая проверяет, является ли какое-либо поле пустым, и возвращает значение, если есть пустое поле. **

 function valid()
{

    var items = '';
    $('.fsField').each(function() 
    {

        var thisname = $(this).attr('name')
        if($(this).is('select'))
        {
            if($(this).val()=='')
            {
                var thisid = $(this).attr('id')
                items += "#\"+thisid+\",";
                $('[name=\"'+thisname+'\"]').closest('td').css('background-color', '#B5EAAA');
            }
        }
        else
        {
            $('[name=\"'+thisname+'\"]').closest('td').css('background-color', '');
        }
    });

    return items;
}

Может кто-нибудь помочь, пожалуйста? я застрял на день сейчас. Не могу понять, почему он сохраняет, когда пользователь переходит от поля к полю, но не сохраняет, когда кнопка нажимается с проверкой. Протестировано с Firefox. эта строка отображается красным с крестиком рядом с нажатием кнопки (класс save_secL). Я использую соединение ssl.

POST https://example.com/files/autosave_secL.php   x

Вот модифицированный код, пытающийся реализовать решение

$('#submit_survey_secL').click(function()
{

    if(valid() !='')
    {
         var answer = confirm("You have left some questions unanswered. Are you sure you want to Submit and go to Section B? ");
         if(!answer)
        {
               var spl_items = valid().split(',');
               $(spl_items[0]).focus();

               return false;
        }
          else
        {
            $('#hidden_agree').append('<input id=\"secLuseragreed\" name=\"secL_user_agreed\" value=\"unanswered\" type=\"hidden\" />');

            autosave(function(){
                window.location= "part1secM.php?token=1&id=4"
            });
        }
    }
    else
    {
        $('#hidden_agree').append('<input id=\"secLuseragreed\" name=\"secL_user_agreed\" value=\"unanswered\" type=\"hidden\" />');

        autosave(function(){
            window.location= "part1secM.php?token=1&id=6"
        });
    }
});


function autosave(callback)
{

    var secL_partL_ques_1_select = $('[name="secL_partL_ques_1_select"]').val();
    var secL_partL_ques_1 = $('[name="secL_partL_ques_1"]:checked').val();
    var secL_partL_ques_2_select = $('[name="secL_partL_ques_2_select"]').val();


    $.ajax(
    {

    type: "POST",
    url: "autosave_secL.php",
    data: "secL_partL_ques_1_select=" + secL_partL_ques_1_select + "&secL_partL_ques_1=" + secL_partL_ques_1 + "&user_id=<?php echo $row_token[user_id]?>" + "&updated_by=<?php echo $member."-".$key;?>",
        cache: false,
    success: function()
        {    
             $("#timestamp").empty().append('Data Saved Successfully!');

                     if($.isFunction(callback))
         {                  
            callback();
         }
        }

    });

}

Я не понимаю, почему это не работает, так как обратный вызов должен полностью работать. Firebug больше не показывает POST https://example.com/files/autosave_secL.php красным, но показывает, что опубликовал, но я думаю, что обратный вызов по какой-то причине не срабатывает

Ответы [ 2 ]

1 голос
/ 15 сентября 2011
$('.save_secL').click(function() {

//...

//start autosave. Note: Async, returns immediately
autosave();
//and now, before the POST request has been completed, we change location...
window.location= buttonid+".php?token=$row_token[survey_token]&$member=$key&agr=1"
//....and the POST request gets aborted :(

Решение:

function autosave(callback)
{
//...
$.ajax(
    {
//...
    success: function()
    {    
        $("#timestamp").empty().append('Data Saved Successfully!');
        if($.isFunction(callback)) 
            callback();
    }
    });
}

//and

autosave(function(){
    window.location= buttonid+".php?token=$row_token[survey_token]&$member=$key&agr=1"
});    

Кстати, функция автосохранения довольно сложна для вашего сервера. Рассматривали ли вы использование localStorage + окончательный запрос POST, содержащий все данные?

0 голосов
/ 16 сентября 2011

Я получил решение.

Это может быть один из нескольких.Решение scr4ve определенно помогло.Итак, вот пункты, для которых я думаю, что это работает сейчас.

  1. Перемещено «cache: false» и удалено «async: false» перед url: в функции автосохранения ajax.До того, как я поместил его после «data:»
  2. Добавил случайную переменную после autosave_secL.php /? "+ Match.random ()
  3. Добавил решение scr4ve, чтобы POST завершался до перенаправления
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...