Использование JavaScript для сброса метатега, чтобы предотвратить обновление страницы.

StackOverflow https://stackoverflow.com/questions/2210077

Вопрос

У нас есть устаревшее приложение (смесь классического ASP и ASP.net), которое имеет несколько страниц с богатым контентом Ajax. Ожидается, что пользователи сайта будут выполнять на странице набор задач, которые могут занимать довольно много времени, скажем. , 15-30 минут.

Одним из требований является то, чтобы пользователи, заходящие на сайт, автоматически выходили из системы после 15 минут бездействия.В настоящее время это достигается за счет использования метатегов для перенаправления пользователя на страницу выхода после 15 минут бездействия на странице.

<meta name='Refresh' http-equiv="Refresh" content="900;URL=/someurl/logout.asp">

Проблема, с которой мы столкнулись, заключается в том, что браузер не считает, что на странице была какая-либо активность, несмотря на множество взаимодействий AJAX с сервером.Таким образом, после 15 минут, которые браузер считает бездействием, пользователь автоматически выходит из системы, даже если он что-то делает.

Вдохновленный этим сообщение на доске объявлений мы попытались исправить это раздражение, используя javascript (JQuery) вот так

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

$(document).ready(function() {
    var selector = 'meta[name=Refresh]';
    var content = $(selector).attr("content"); //"900;URL=/someurl/logout.asp"
    $(selector).attr("content", "5;URL=/someurl/logout.asp"); 
});

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

Поскольку это устаревшее приложение, некоторые решения, т.е.использовать метатеги и т. д.запекаются.Вопрос в том, есть ли способ обновить метатеги, чтобы они могли мирно сосуществовать с приложением Ajax?Я делаю что-то не так и есть ли способ решить эту проблему?

Это было полезно?

Решение

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

Замените метатег на это:

<script type="text/javascript">
    window.onload = function(){
        var timer = null,
            time=1000*60*15, // 15 minutes
            checker = function(){
                if(timer){clearTimeout(timer);} // cancels the countdown.
                timer=setTimeout(function() { 
                    document.location="/someurl/logout.asp";
                },time); // reinitiates the countdown.
            };
        checker(); // initiates the countdown.
        // requires jQuery... (you could roll your own jQueryless version pretty easily though)
        if(window.jQuery){
            // bind the checker function to user events.
            jQuery(document).bind("mousemove keypress click", checker);
        }
    };
</script>
<noscript>
    <meta name="Refresh" http-equiv="Refresh" content="900;URL=/someurl/logout.asp">
</noscript>

Определенно есть лучшие способы сделать это.Например, обслуживание двух страниц... одна для пользователей с javascript и одна без.

Или просто отключите приложение для людей без JavaScript.:о)

Редактироватьсогласно этой странице: http://www.google.com/support/forum/p/Webmasters/thread?tid=25c023fea4ea60a4&hl=en метаобновление должно работать внутри элемента noscript.

Другие советы

Я не думаю, что есть способ остановить метаобновление.Вы можете изменить метатег, но браузер уже решил, что он обновится через 15 минут;нет API, чтобы остановить это.

Если вы не можете остановить обновление или использовать JavaScript для перенаправления, возможно, вы сможете сдержать ущерб:

$(window).unload(function() { 
  // Insert code here 
  // to save the user's work.
  alert('Sorry, you have to log out now.')
}); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top