Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Таймер. функция (https://javascript.ru/forum/misc/37191-tajjmer-funkciya.html)

ATNC 10.04.2013 21:43

Таймер. функция
 
Добрый день. Есть задача: сделать мини-тест, ответы на вопросы только "Да", "Нет" (реализуется через confirm), сами вопросы находятся в массиве. Если ответа нету в течении 25 секунд- считать его негативным. Как сделать так, чтобы по истечению 25 секунд, выбирался следующий вопрос из массива? Спасибо.

melky 10.04.2013 22:06

если использовать prompt, тогда придётся ждать, пока пользователь не прореагирует как-нибудь. выход - юзать UI библиотеки или сделать модальное окно самому

ATNC 10.04.2013 22:17

вопросы подразумевают только логические ответы: да или нет. Тоесть вопросы задаются с помощью confirm, prompt не нужно.

Например: Берется с массива вопрос. Выводится с помощью confirm. Включается таймер на 25 с. Если пользователь не ответит в течении этого времени, его ответ считается как негативный. Берется следующий вопрос с массива.... и т.д.

zebra 10.04.2013 22:38

confirm, prompt, alert - блокируют выполнение кода. Таймер не будет работать. Создайте свое модальное окно и проблем не будет.

melky 10.04.2013 23:25

отрисовка и ответ на вопрос проиходит в методе QuestionMaster.renderQuestion

// первый аргумент - содержание вопроса (текст)
// второй - функция обратного вызова. см. ниже.
QuestionMaster.renderQuestion : function (  questionText, callback  )

// функция должна выполниться, когда пользователь ответит на вопрос
// (чтобы выводить через HTML элементы, с\без анимации)

// первым аргументом к ф-и должно быть логическое значение, говорящее об ответе на вопрос
callback: function (answered)


var QuestionMaster = {

    data: [],

    Question: function (text) {
        this.text = text + '';
        this.value = false;
    },

    index: -1,
    
    timeout: 25 * 1e3,

    locked: false,

    insert: function (text) {
        if (text instanceof Array) {
            var i = text.length;
            while ( i-->0 ) this.insert( text[i] );
        } else {
            var question = new this.Question(text);
            this.data.push(question);
        }
    },

    current: function () {
        return this.data[ this.index ];
    },

    next: function () {
        return this.data[ this.index++ ];
    },

    prev: function () {
        return this.data[ this.index-- ];
    },

    ask: function () {
        var question = this.current();
        if (!this.locked && question) {
            question = this.current();
            var self = this;
            this.locked = true;
            var askedTimestamp = new Date().valueOf();
            this.renderQuestion(question.text, function (answered) {
                self.locked = false;
                 var answeredTimestamp = new Date().valueOf();
                var timedOut = (answeredTimestamp - askedTimestamp) >= self.timeout;
                question.value = timedOut ? false : !!answered;
            });
        }
    },

    askNext: function () {
        this.next();
        this.ask();
    },

    renderQuestion: function (questionText, callback) {
        var answered = window.confirm(questionText);
        callback(answered);
    },

    iterate: function (callback) {
        var i = this.data.length, question;
        while ( i-->0) {
            question = this.data[ i ];
            callback(question.text, question.value);
        }
    }
    
};


QuestionMaster.insert("Хочешь пивка?");
QuestionMaster.insert([ "Хочешь рыбку?", "Хочешь учиться?", "Сейчас на улице темно?" ]);

QuestionMaster.next();
QuestionMaster.ask();

while (QuestionMaster.current()) QuestionMaster.askNext();

QuestionMaster.iterate(function (question, answered) {
    alert(question + " \n\nОтвет: " + (answered ? "Да":"Нет") );
});


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