使用javascript重置元标记以防止其刷新页面
Posted
技术标签:
【中文标题】使用javascript重置元标记以防止其刷新页面【英文标题】:Using javascript to reset the meta tag to prevent it from refreshing the page 【发布时间】:2011-01-13 16:23:21 【问题描述】:我们有一个遗留应用程序(经典 ASP 和 ASP.net 的混合),其中包含一些 Ajax 内容丰富的页面。期望站点的用户在页面上执行一组可以跨越相当数量的任务时间说,15-30 分钟。
其中一项要求是登录网站的用户在 15 分钟不活动后自动注销。这目前是通过使用元标记来实现的,以便在用户在页面中不活动 15 分钟后将用户重定向到注销页面。
<meta name='Refresh' http-equiv="Refresh" content="900;URL=/someurl/logout.asp">
我们遇到的问题是浏览器认为页面上没有任何活动,尽管与服务器进行了许多 AJAX 交互。因此,在浏览器认为不活动的 15 分钟后,即使用户正在做某事,也会自动注销。
受message board post 的启发,我们尝试像这样使用 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 应用程序和平共存?我做错了什么,有没有办法解决这个问题?
【问题讨论】:
元刷新与活动无关 - 如果将其设置为 15 分钟,则无论活动如何,它都会在 15 分钟刷新。 查看可能的重复:***.com/questions/262305/… @Matt,我所说的活动是指该页面尚未重新加载。当我们谈论一个经典的 asp 应用程序时,我假设它暗示了每个帖子都会重新加载页面。 【参考方案1】:假设您使用的是 jQuery,这样的事情可能会奏效。我还没有测试过,不知道浏览器是否会读取文档头部的 noscript 元素中的 a 元标记。
用这个替换你的元标记:
<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 的人禁用该应用程序。 :o)
编辑 根据此页面:http://www.google.com/support/forum/p/Webmasters/thread?tid=25c023fea4ea60a4&hl=en 元刷新应该在 noscript 元素内工作。
【讨论】:
很棒的代码,但是你在 function() 处缺少一个“”,见下文 这是一个很好的解决方案。只是补充一下 - 如果重定向应该与服务器端会话到期一致,那么绑定到“ajaxComplete”事件可能会更好。【参考方案2】:我认为没有办法阻止元刷新。您可以更改元标记,但浏览器已经决定将在 15 分钟内刷新;没有 API 可以阻止它。
如果您无法停止刷新或使用 JavaScript 进行重定向,也许您可以控制损坏:
$(window).unload(function()
// Insert code here
// to save the user's work.
alert('Sorry, you have to log out now.')
);
【讨论】:
以上是关于使用javascript重置元标记以防止其刷新页面的主要内容,如果未能解决你的问题,请参考以下文章
轮询:页面被刷新,任何指定的过滤器/排序顺序也被重置。我怎样才能防止这种情况发生?