Приложение Cordova подключено к Интернету через эмулятор, но не на устройстве [обновление: проблема с ajax] - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать небольшое приложение через Cordova, которое отправляет данные в PERL-Script на сервере. Сборка отладки и выпуска работает нормально на эмуляторе genymotion, однако отправка данных с телефонов Android не работает. В приложении нет сообщения об ошибке (также, которое должно отображаться при сбое подключения). Запустив отладку по USB, я получаю следующее сообщение об ошибке вызова (функция saveataLastpage должна отправлять данные):

Uncaught TypeError: Illegal invocation
at e (jquery-2.1.3.min.js:4)
at Ac (jquery-2.1.3.min.js:4)
at Function.n.param (jquery-2.1.3.min.js:4)
at Function.ajax (jquery-2.1.3.min.js:4)
at Object.saveDataLastPage (index.js:631)
at Object.renderLastPage (index.js:461)
at Object.recordResponse (index.js:597)
at HTMLButtonElement.<anonymous> (index.js:357)
at HTMLButtonElement.dispatch (jquery-2.1.3.min.js:3)
at HTMLButtonElement.r.handle (jquery-2.1.3.min.js:3)

Следующий код:

index.js: 631

saveDataLastPage:function() {
 $.ajax({
        type: 'post',
        url: '/URL/',
        data: localStore,
        crossDomain: true,
        success: function (result) {
        var pid = localStore.participant_id, snoozed = localStore.snoozed, uniqueKey = localStore.uniqueKey, pause_time=localStore.pause_time;
        localStore.clear();
        localStore.participant_id = pid;
        localStore.snoozed = snoozed;
            localStore.uniqueKey = uniqueKey;
            localStore.pause_time=pause_time;
        $("#question").html("<h3>Thank you, your responses have been sent.</h3>");
        },

        error: function (request, error) {
            console.log(error);
             $("#question").html("<h3>Error: Please check your internet connection.</h3><br><button>Send again</button>");
             $("#question button").click(function () {app.saveDataLastPage();});    
            }
        });

},

index.js: 461

else {
    var datestamp = new Date();
    var year = datestamp.getFullYear(), month = datestamp.getMonth(), day=datestamp.getDate(), hours=datestamp.getHours(), minutes=datestamp.getMinutes(), seconds=datestamp.getSeconds(), milliseconds=datestamp.getMilliseconds();
    localStore[uniqueKey + '.' + "completed" + "_" + "completedSurvey"  + "_" + year + "_" + month + "_" + day + "_" + hours + "_" + minutes + "_" + seconds  + "_" + milliseconds] = 1;    
    app.saveDataLastPage();
}

Как указывалось ранее, в эмуляторе genymotion сценарий ajax работает без ошибок и отправляет данные в сценарий.

1 Ответ

0 голосов
/ 15 ноября 2018

Я не уверен, почему эмулятор будет работать нормально, но ошибка Uncaught TypeError: Illegal invocation говорит о том, что это проблема с пост-вызовом ajax. В частности, настройка по умолчанию для обработки данных в строку запроса, скорее всего, не удалась.

Из документации ajax :

По умолчанию данные, передаваемые в параметр data как объект (технически, что угодно, кроме строки), будут обрабатываться и преобразовываться в строку запроса, соответствующую типу содержимого по умолчанию "application / x-www -форма-urlencoded». Если вы хотите отправить DOMDocument или другие необработанные данные, установите для этого параметра значение false.

Это означает, что вы можете либо отключить обработку processData: false, которая будет публиковать данные в теле запроса, либо вам придется преобразовать данные localStore в соответствующий объект (из того, что было раньше).

Если это похоже на объект, вы можете сделать следующее:

var data = {}; for (var elem in localStore) { data[elem] = localStore[elem]; }

или, возможно, вкратце:

var data = {}; localStore.each(function(elem) { data[elem.name] = elem.value; });

...