Использование JavaScript для сброса метатега, чтобы он не обновлял страницу - PullRequest
13 голосов
/ 05 февраля 2010

У нас есть устаревшее приложение (смесь классического 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? Я делаю что-то не так и есть ли способ решить эту проблему?

Ответы [ 2 ]

7 голосов
/ 06 февраля 2010

при условии, что вы используете 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>

Определенно есть лучшие способы сделать это. Как на 2 страницах ... одна для пользователей с JavaScript и одна без.

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

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

0 голосов
/ 05 февраля 2010

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

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

$(window).unload(function() { 
  // Insert code here 
  // to save the user's work.
  alert('Sorry, you have to log out now.')
}); 
...