Как обеспечить последовательность команд, запускаемых последовательно (проблема с тайм-аутом в jQuery - Qualtrics) - PullRequest
0 голосов
/ 01 февраля 2019

Я разрабатываю эксперимент в квалитрике с использованием скрипта Java.Для каждого вопроса в моем исследовании участник должен угадать правильный ответ, ввести его, а затем нажать кнопку пробела.Как только они нажимают кнопку пробела, логика проверяет, является ли их ответ правильным или нет.Если ответ был правильным, звук должен воспроизводиться в течение 1,2 секунд, цвет фона должен поменяться на красный на секунду, а затем снова на белый, и, наконец, эксперимент должен автоматически перейти к следующему вопросу.

Пока я разобрался с правильной последовательностью команд.Однако, похоже, что я неправильно использую логику setTimeout.Независимо от того, какую комбинацию значений тайм-аута я использовал, я не мог воспроизвести все средние шаги, включая воспроизведение звука и вспышку на красном фоне, прежде чем экран перейдет к следующему вопросу.

Здесь я поделился своим кодом.Я был бы очень признателен за любую помощь.

Qualtrics.SurveyEngine.addOnload(function()
    {
        /*Place your JavaScript here to run when the page loads*/  
    });

    Qualtrics.SurveyEngine.addOnReady(function()
    {
        /*Place your JavaScript here to run when the page is fully displayed*/

        var qid = this.questionId;
        var changepage = null;

        /*focus on the box*/
        jQuery("#"+qid+" .InputText").select().focus();

        document.onkeydown = function(event) {
            console.log('keydown',event);
             if (event.which == 32) { //hit the space button
                event.preventDefault();
                 //read the input
                input = jQuery("#"+qid+" .InputText").val();
                console.log(input);

                 if (input.trim().toLowerCase() == "cat") {

                     //alert(input.trim().toLowerCase());
                    document.getElementById("correct").play(); //play the correct sound which is 1.2seconds long

                    setTimeout(jQuery("body").css("background-color","red"), 3000); // change the background color

                     setTimeout( jQuery('#NextButton').click(), 2000) //move on to the next question

                 } //end of if       
             } // end of if 32  
        }  //end of down button

    });

    Qualtrics.SurveyEngine.addOnUnload(function()
    {  
        jQuery("body").css("background-color","white");                 
    });

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019
 if (input.trim().toLowerCase() == "cat") {

                 //alert(input.trim().toLowerCase());
                 //play the correct sound which is 1.2seconds long


                 vid.play();

                 vid.onended = function() 
                 { 
                     jQuery(".skirt").css("background-color","red");
                     jQuery('#NextButton').click();
                 };

             } //end of if
0 голосов
/ 01 февраля 2019

setTimeout является асинхронным.Если вы хотите, чтобы несколько setTimeouts выполнялись в фиксированном порядке, то время должно быть аддитивным.Таким образом, ваше время NextButton должно быть 5000 мс (3000 мс + 2000 мс).

В качестве альтернативы, вы можете поместить клик NextButton внутри функции setTimeout изменения цвета фона.Чтобы добавить к этому, не могли бы вы поместить оба в событие «закончили» на вашем аудио.

...