2012-08-01 41 views
1

我需要对此JavaScript代码提供一些帮助。即使用户正在浏览其他页面,也会在一段时间后打开弹出窗口

我有这样的代码:

jQuery(document).ready(function(){ 
    if (document.cookie.indexOf('visited=true') == -1) { 
    var fifteenDays = 1000*60*60*24*1; 
    var expires = new Date((new Date()).valueOf() + fifteenDays); 
    document.cookie = "visited=true;expires=" + expires.toUTCString(); 
    window.setTimeout(
function() { 
    jQuery.colorbox({href:"/popup.htm", open:true, iframe:false, innerWidth:600, innerHeight:490}); 
     }, 

30000)}}); 

它应该30秒,每天一次后,打开一个弹出。问题在于它在页面停留30秒后打开的弹出窗口。即使客户端导航到其他页面,还有什么方法可以让它在30秒后打开?因此,如果用户在页面上停留15秒,在另一个页面上停留15秒,则获取弹出窗口。

预先感谢您

回答

1

这里要解决的根本问题是在页面之间传递'状态'。既然你已经在你的例子中使用了cookie,我们将使用它。您需要使用用户访问该网站的时间(最初为0)设置会话Cookie。然后,您需要每隔一段时间(每5秒钟)一次“轮询”cookie一次,以更新网站计数的总时间,并将其读回。如果是30秒或更长时间,则弹出弹出窗口。

因此,而不是使用:

setTimeout(function() { 
    // open alert box 
}, 30000); 

你会做这样的事情:

setTimeout(function() { 
    // Increment 'time-on-site' cookie value by 5000 
    // Then, if 'time-on-site' cookie value >= 30000, fire popup 
}, 5000); 

UPDATE 当然,这需要更多的回往复服务器,因为您需要每5秒传达更新的值。

+0

这意味着每5秒钟一次“平”式请求。很多饼干和吨的编码,对吧?如果是这样,我会放弃这部分,只将30秒超时减少到15秒。感谢您的解释和答复。 – demlasjr 2012-08-01 10:58:20

+1

是的,如果你想通过回传给服务器来维护状态。虽然我猜你可以通过设置在页面加载时为该域存在的'document.cookie'来简化它。另一种方法是计算每次页面加载时首次访问的时间偏移量,这会有点粗糙。 – 2012-08-01 11:04:41

+0

你是说这个吗? https://developer.mozilla.org/en/DOM/document.cookie – demlasjr 2012-08-01 11:31:33

1

是。

但是使用document.cookie是不可能的。

您需要使用服务器端Cookie或HTML本地存储/会话存储。

类似的,Response.SetCookie("Visited", true)。我不知道你用什么作为后端。

+0

它是php,在apache服务器上的html。听起来很复杂,对吗?太多的曲奇... – demlasjr 2012-08-01 10:54:23

+0

每客户端,每页。但是,如果你真的需要的话,那并不多。另一种方法是使用标识cookie来标识用户并将访问记录在数据库中。因此,您可以将这些脚本呈现在页面上。 – 2012-08-01 11:09:16

1

没办法的人。一旦页面卸载,你不能做任何事情。您需要使用服务器上的其他资源(饼干,会话等)来检查窗口是否已经显示。

+1

Cookie部分很容易完成。最困难的部分是使cookie注册在哪一秒钟,用户离开第一页,并继续从该计数器重新计数到0。我想对于这样一个愚蠢的“功能”是太多的努力。 – demlasjr 2012-08-01 11:01:59

+0

@demlasjr说得好。 – devundef 2012-08-01 11:03:02

+1

我认为这样做并不容易,尽管在服务器端可能会更容易一些(时间计数不准确)。但是,如果显示对话框是“时间”,则至少需要1或2个会话/ Cookie状态并检查每个页面加载情况。 – devundef 2012-08-01 11:10:00

相关问题