Предотвратите предупреждение js () от приостанавливающихся таймеров

Вы можете попробовать что-то вроде этого:

if(dsmSO) {
  rs.getRange(2,2,dsmSO.length,dsmSO[0].length).setValues(dsmSO);
  ....
}
5
задан syaz 13 October 2008 в 15:47
поделиться

7 ответов

По-видимому, рендеринг предварительного просмотра отличается от отправленного рендеринга. Этот абзац здесь, чтобы удостовериться, что следующие два выстраивают в линию шоу как код.

// Preserve native alert() if you need it for something special
window.nativeAlert = window.alert;

window.alert = function(msg) {
    // Do something with msg here. I always write mine to console.log,
    // but then I have rarely found a use for a real modal dialog,
    // and most can be handled by the browser (like window.onbeforeunload).
};
6
ответ дан 18 December 2019 в 05:40
поделиться

Никогда не полагайтесь на JavaScript (или никакое другое клиентское время) для вычисления прошедших времен для операций, сделанных между обратными передачами или различными страницами.

Если Вы всегда сравните даты сервера, то людям будет трудно обмануть:

  1. первый запрос страницы, сохраните время сервера
  2. ping с вызовами JavaScript каждый секунды N, сравните 2 раза сервера и возвратите прошедшее (только для шоу)
  3. когда пользователь отправляет форму, сравните 2 раза сервера, вычислите прошедшее время и отбросьте тех, которые заняли слишком много времени (т.е.: возможные мошенники)
10
ответ дан 18 December 2019 в 05:40
поделиться

Нет, нет никакого способа препятствовать тому, чтобы предупреждение остановило единственный поток в JavaScript. Вероятно, можно использовать некоторый другой способ пользовательского уведомления, например, плавающий слой.

5
ответ дан 18 December 2019 в 05:40
поделиться

Это модально и останавливает выполнение. Рассмотрите альтернативу, которая не приостанавливает выполнение как метод Лайтбокса.

3
ответ дан 18 December 2019 в 05:40
поделиться

Я думаю, что задающий вопрос пытается предотвратить обман. Так как пользователь может ввести JavaScript: предупреждение ("приостанавливается"); в строку поиска, или делают bookmarklet, чтобы сделать это, легко приостановить тест и обман.

Единственная вещь, о которой я могу думать, состоит в том, чтобы использовать Дату (), чтобы получить текущее время и проверить его снова, когда таймер стреляет. Затем, если разница во времени не обоснованно близко к намеченной продолжительности таймера, покажите предостережение и дисквалифицируйте ответ на тот вопрос или позвольте им завалить тест. Нет никакого способа препятствовать тому, чтобы пользователь приостановил Ваш тест, но должно быть возможно поймать их.

Конечно, с любой проверкой обмана, Вы заставляете людей становиться лучшими мошенниками. Человек мог изменить системное время на их ПК и одурачить Дату JavaScript () конструктор, который получает время от операционной системы.

Можно использовать интервал, чтобы сделать повторное сравнение часов с одной второй длиной интервала. Обработчик интервалов может также обновить остающееся временем поле на дисплее пользователя. Затем пользователи могут чувствовать сборку давления, поскольку время заканчивается на их тесте. Забавные времена!

3
ответ дан 18 December 2019 в 05:40
поделиться

Обратная связь по вопросу SyaZ разъяснила проблемы под угрозой.

Вот попытка суммировать хорошие ответы до сих пор:

  • Клиентские сценарии, по своей природе легки управлять для обмана теста онлайн. СМ., что Серверная сторона @Filini приближается

  • window.alert = функция (сообщение) {} будет, переопределяя предупреждение () и возможно побеждать низко висящий плод включения addressbar: javascript:alert ('Страница Pausing, таким образом, я могу погуглить ответ') или я буду использовать своего Телефонного Друга теперь. Любезность @eyelidlessness

  • Если необходимо использовать клиентский подход, вместо того, чтобы использовать setTimeOut (), Вы могли бы использовать пользовательскую date-compare-based функцию паузы как это (понятие @Mnebuerquo, пример кода мной (@micahwittman)):

Пример:

var beginDate = new Date();

function myTimeout(milsecs){
  do { curDate = new Date(); }
    while((curDate-beginDate) < milsecs);
}

function putDownYourPencils(milsecs){
  myTimeout(milsecs);
  var seconds = milsecs / 1000;
  alert('Your '  + seconds + ' seconds are up. Quiz is over.');
}

putDownYourPencils(3000);
2
ответ дан 18 December 2019 в 05:40
поделиться

В конечном счете Вы не можете доверять вводу данных пользователем. Не отслеживая время протек на сервере, нет только никакой гарантии, данными не управляли.

Однако, если Вы уверены, что Ваши берущие теста не являются здравым смыслом JavaScript и просто полагаются на "прием", который они нашли где-нибудь, Вы могли протестировать на обман (приостановки) со следующим кодом, который не требует изменения window.alert:

var timer = {
    startDatetime: null,
    startSec: 0,
    variance: 1,
    exitOnPause: true,
    count: function (config) {
        var that = this;

        if (typeof config == "object" && typeof parseInt(config.seconds) == "number" && !isNaN(parseInt(config.seconds)))
        {
            if (typeof parseFloat(config.variance) == "number" && !isNaN(parseFloat(config.variance))) this.variance = config.variance;
            if (typeof config.exitOnPause == "boolean") this.exitOnPause = config.exitOnPause;

            if (config.seconds > 0)
            {
                if (!this.startSec) this.startSec = config.seconds;
                if (!this.startDatetime) this.startDatetime = new Date();
                var currentDatetime = new Date();

                if (currentDatetime.getTime() - this.startDatetime.getTime() > (this.startSec - config.seconds) * this.variance * 1000)
                {
                    if (typeof config.onPause == "function") config.onPause();

                    if (!this.exitOnPause)
                    {
                        this.startDatetime = new Date();
                        this.startSec = config.seconds--;
                        window.setTimeout(function () { that.count(config); }, 1000);
                    }
                }
                else
                {
                    config.seconds--;
                    window.setTimeout(function () { that.count(config); }, 1000);
                }
            }
            else
            {
                if (typeof config.onFinish == "function") config.onFinish();
            }
        }
    }
};

Этот объект - таймер имеет отдельный метод, количество (), который принимает объект как вход. Это ожидает свойство секунд во входном объекте в минимуме.

По некоторым причинам window.setTimeout не всегда работает как ожидалось. Иногда, на моей машине, window.setTimeout (x, 1000), то, которое должно выполнить код после 1 секунды, заняло больше чем 2 секунды. Так, в случае как это необходимо позволить различие, таким образом, люди, которые не обманывают, не становятся отмеченными как мошенники. Значения по умолчанию различия к 1, но это может быть переопределено во входном объекте. Вот пример того, как использовать этот код, который позволяет 2,5 секунды "пространства для маневра" для копуш:

timer.count({
    seconds: 10,
    onPause: function () { alert("You cheated!"); window.location.replace("cheatersAreBad.html"); },
    onFinish: function () { alert("Time's up!"); },
    variance: 2.5
});

С решением как это Вы могли использовать Ajax, чтобы сказать сценарию серверной стороны, что пользователь приостановил таймер или перенаправляет пользователя к странице, объясняя, что они были пойманы, обманув, например. Если бы по некоторым причинам Вы хотели позволить пользователю продолжать проходить тест после того, как они были пойманы, обманув, Вы могли установить exitOnPause на ложь:

timer.count({
    seconds: 10,
    exitOnPause: false,
    onPause: function () { recordCheaterViaAjax(); },
    onFinish: function () { alert("Time's up!"); },
    variance: 2.5
});
2
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: