Javascript bookmarklet / iFrame для автоматического обновления загруженной страницы, если в течение установленного периода активности не обнаружено? - PullRequest
4 голосов
/ 04 сентября 2011

У меня есть приложение на основе браузера, которое я использую на работе (так как практически все корпоративные приложения теперь основаны на браузере по понятным причинам), у которого раздражающе короткий тайм-аут сеанса.Я не уверен, какое именно время ожидания сеанса установлено, но это что-то около 5-10 минут.

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

В любом случае, я отвлекся.

Я хочу сделать следующее: Я хотел бы создать букмарклет Javascript или что-то, что будет автоматически обновлять любую страницу, на которой он находится, если активность не обнаружена в течение определенного периода времени. Этот период будет немного меньше того, что я в итоге выяснючто такое тайм-аут сеанса.По сути, я просто хочу, чтобы страница перезагружалась сама, скажем, через пять минут, если в течение этого периода не было активности.(Я не хочу, чтобы он обновлялся на ровном месте, потому что время истекло, пока я нахожусь в процессе использования приложения, единственное время, когда оно должно делать автообновление, это если страница приложения бездействует)

Можно ли это сделать с помощью букмарклета Javascript?Должен ли я программировать «упаковщик» страниц, который загружает страницу приложения в iFrame или что-то в этом роде?Сайт приложения, которым я пользуюсь, имеет много подстраниц, и я бы предпочел, чтобы он обновлял любую страницу, на которой я нахожусь в тот момент, когда происходит тайм-аут автоматического обновления.Конечно, если это невозможно, я бы принял это, просто перезагрузив главную страницу сайта, если это не легко возможно, так как, если я вышел из приложения достаточно долго, чтобы истекло время ожидания, то мне, вероятно, не нужнопо-прежнему быть на той учетной записи / странице, на которой я был в то время.

Надеюсь, я объяснил себя достаточно хорошо.Логика проста - if no activity detected withing x amount of time, refresh the current page в этом суть.

Спасибо, мои братья из StackOverflow, еще раз за вашу помощь.

-Sootah


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

Если это невозможно, то если бы я мог написать простую страницу, которую я мог бы запустить из локальнойкомпьютер, который будет выполнять ту же функцию, загружая страницу во фрейм или что-то, что также будет приемлемым.


EDIT 10/3/11 7:25am MST

Так как я работаю на могилах и странный график на работе (и этот сайт, к сожалению, заблокирован там, так как он считается «форумом» - я работаю в сфере финансов, они слишком осторожны в отношении утечки информации) до того, как яприсуждать вознаграждение, обнаруживает ли один из этих детекторов событий последний раз, когда страница загружается /? Что-то вроде document.onload или еще чего-нибудь.Я думаю, что установка таймера с момента последней загрузки страницы будет самым простым и эффективным подходом.Моя мышь может перемещаться по браузеру, в котором я случайно открыл сайт, работая над другими вещами, и если таймер сбрасывается из-за этого, а я фактически не взаимодействовал с сайтом таким образом, что страница загружается / перезагружается, то сеансвремя ожидания.

Ответы [ 4 ]

3 голосов
/ 29 сентября 2011

Это букмарклет код # 1 для вас, настроенный на ПЯТЬ секунд.Измените время на то, что вам больше нравится.

javascript:
(function () { 
    var q = null;
    function refresh() { window.location.reload(); }
    function x() { clearTimeout(q); a(); }
    function a() { q = setTimeout( refresh, 5000 ); }

    document.body.onclick = x;
    document.body.onmousemove = x;
    document.body.onmousedown = x;
    document.body.onkeydown = x;
}())

ps: было бы лучше включить eventListeners, но я полагаю, что вам также нужно поддерживать IE8, поэтому я заменил их на встроенные события, - если вы НЕВам не нужен IE8, используйте код # 2 :

javascript:
(function () { 
    var q = null;
    function refresh() { window.location.reload(); }
    function x() { clearTimeout(q); a(); }
    function a() { q = setTimeout( refresh, 5000 ); }

    document.body.addEventListener( "click", x, false );
    document.body.addEventListener( "mousemove", x, false );
    document.body.addEventListener( "mousedown", x, false );
    document.body.addEventListener( "keydown", x, false );
}())

edit: в ответ на комментарии, вот code # 3 стянет, вместо обновления страницы.Тем не менее, несмотря на советы по использованию iframe, я решил, что может быть желательно не выполнять сценарии на этой странице, поэтому вместо этого мы будем использовать img:

javascript:
(function () { 
    var q = null;
    var u = window.location.href;
    var i = document.createElement('img');
    i.style = "width: 1px; height: 1px;";
    document.body.appendChild(i);
    function refresh() {
        i.src = "";
        i.src = u;
        x(); 
    }
    function x() { clearTimeout(q); a(); }
    function a() { q = setTimeout( refresh, 5000 ); }

    var evs = ['click', 'mousemove', 'mousedown', 'keydown']; 
    for( var j = 0; j < evs.length; j++) {
        document.body['on'+evs[j]] = x;
    }
}())
2 голосов
/ 26 сентября 2011

Создайте закладку и поместите приведенный ниже код в значение "url". Обратите внимание, что вы должны изменить значения "sessiontimeout" и "checkinterval". Они оба в миллисекундах.

javascript:(function(){var lastmove = new Date().valueOf(),sessiontimeout=10000,checkinterval=1000;document.onmousemove = function(e){lastmove= new Date().valueOf();};timer = setInterval( function() {var differential = (new Date().valueOf() - lastmove);if (differential > sessiontimeout) {var iframe = document.getElementById("bkmrkiframerefresher");if (iframe) { document.getElementsByTagName("body")[0].removeChild(iframe);} iframe = document.createElement("iframe");iframe.setAttribute("src", "/");iframe.setAttribute("width", 0);iframe.setAttribute("height", 0);iframe.setAttribute("style", "width:0;height:0;display:none;");iframe.setAttribute("id", "bkmrkiframerefresher");document.getElementsByTagName("body")[0].appendChild(iframe);lastmove = new Date().valueOf();} }, checkinterval);})();

Это букмарклет, который будет вставлять код ниже на странице. Я проверил букмарклет в Chrome. Он работал на нескольких сайтах, кроме stackoverflow, кажется, что они блокируют кадрирование по соображениям безопасности. Прежде чем покинуть свой рабочий стол, откройте веб-сайт, для которого вы хотите сохранить сеанс, а затем щелкните на нем букмарклет. Вернувшись, обновите страницу, чтобы избавиться от таймеров запуска.

Форматированный (и закомментированный) код:

<script type="text/javascript">
            // last time the mouse moved
            var lastmove = new Date().valueOf();
            var sessiontimeout=10000;
            var checkinterval=1000;

            // reset the last time the mouse moved
            document.onmousemove = function(e){
                lastmove= new Date().valueOf();
            }

            // check periodically for timeout
            timer = setInterval( function() {

                var differential = (new Date().valueOf() - lastmove);

                if (differential > sessiontimeout) {
                    var iframe = document.getElementById("bkmrkiframerefresher");
                    // iframe already exists, remove it before loading it back
                    if (iframe) {
                        document.getElementsByTagName("body")[0].removeChild(iframe);
                    }

                    // alert("more than 10 secs elapsed " + differential);
                    // create an iframe and set its src to the website's root
                    iframe = document.createElement("iframe");
                    iframe.setAttribute("src", "/");
                    iframe.setAttribute("width", 0);
                    iframe.setAttribute("height", 0);
                    iframe.setAttribute("id", "bkmrkiframerefresher");
                    iframe.setAttribute("style", "width:0;height:0;display:none;");
                    document.getElementsByTagName("body")[0].appendChild(iframe);

                    // reset counter.
                    lastmove = new Date().valueOf();
                }
            }, checkinterval);

        </script>

Стефан предложил выше, что вам не нужна логика, кроме опроса. Отредактированный код следующий:

<script type="text/javascript">
            var pollInterval=1000;

            timer = setInterval( function() {
                    var iframe = document.getElementById("bkmrkiframerefresher");
                    // iframe already exists, remove it before loading it back
                    if (iframe) {
                        document.getElementsByTagName("body")[0].removeChild(iframe);
                    }

                    // create an iframe and set its src to the website's root
                    iframe = document.createElement("iframe");
                    iframe.setAttribute("src", "/");
                    iframe.setAttribute("width", 0);
                    iframe.setAttribute("height", 0);
                    iframe.setAttribute("id", "bkmrkiframerefresher");
                    iframe.setAttribute("style", "width:0;height:0;display:none;");
                    document.getElementsByTagName("body")[0].appendChild(iframe);
                }
            }, pollInterval);

        </script>
1 голос
/ 28 сентября 2011

Этот код обновляет страницу только один раз
Вот букмарклет (вдохновленный псевдокодом Кая Тоета), протестированный в Chrome и Safari, измените значение тайм-аута с помощью времени var в начале строки
Onliner:

javascript:var time = 500; var timeoutFunc = function(){location.reload(true);};timeout = setTimeout(timeoutFunc,time);document.onmousemove = function() {clearTimeout(timeout);timeout = setTimeout(timeoutFunc,time); };

код

//The time in milliseconds before reload
var time = 500;
//The function that is called when the timer has reached 0
var timeoutFunc = function()  { 
    location.reload(true);
};
//start the timer
timeout = setTimeout(timeoutFunc,time);
//restart the timer if the mouse is moved
document.onmousemove = function() {
    clearTimeout(timeout);
    timeout = setTimeout(timeoutFunc,time); 
};
0 голосов
/ 04 сентября 2011

псевдокод

timeout = settimeout("call",200);
document.onmousemove = function() { timeout = new timeout("call",200); }
function call() {
    document.refresh();
}

как это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...