【问题标题】:Reporting child window's events to parent window to reset timer value of user timeout code将子窗口的事件报告给父窗口以重置用户超时代码的计时器值
【发布时间】:2010-09-02 14:25:24
【问题描述】:

我有一个我写的 Jquery 函数,它在一定量的不活动后使屏幕变黑,创建一个弹出窗口,允许用户单击一个按钮以保持登录状态,然后将它们注销(关闭应用程序窗口),如果他们没有及时响应。

环境是 ASP.NET (VB)。从技术上讲,我们不使用母版页,但我们确实有一个父页面,其中包含我们的页眉、页脚和导航,并且我的 Jquery 代码从该窗口调用,通过 IFrame 加载。

我的问题是,如果在子窗口中工作,父窗口无法识别系统正在使用,并会在分配的时间自动参与。

我已经在阳光下尝试了所有我能想到的东西,但没有任何东西能正常工作。我的事件处理程序正在工作,它确实调用了父窗口函数,但计时器没有被重置。

我在父窗口中有这个功能:

<script language="javascript" type="text/javascript">  
function window.reportChildActivity() { 
    SESSION_ALIVE = true; 
    window.setTimeout("pop_init()", SESSION_TIME); 
    } 
</script> 

在子窗口中:

<script type="text/javascript">  
$(document).bind("mousedown keydown blur", function() { 
    window.parent.reportChildActivity(); }); 
</script> 

无论我在子窗口中单击或使用多少键,当 SESSION_TIME 第一次用完时,都会调用我的 Jquery 超时代码。然后我的页面中有多个 Jquery 窗口告诉我单击以继续。就像事件正在被缓冲,当它们触发时,这些窗口都被多次生成。有人从中看出我做错了什么吗?谢谢!

---- 编辑 ----- 我正在添加我的 pop_init 函数和支持函数以供参考:

// remove all added objects and restart timer
function popup_remove() {
    $("#popup_window").fadeOut("fast", function() { $('#popup_window,#popup_overlay').trigger("unload").unbind().remove(); });
    //if (typeof document.body.style.maxHeight == "undefined") {//if IE 6
    $("body", "html").css({ height: "auto", width: "auto" });
    $("html").css("overflow", "");
    //}
    window.setTimeout(pop_init, SESSION_TIME);
}

// session ajax call from button click
function session_refresh() {
    SESSION_ALIVE = true;
    $(".buttons").hide();
    $("#popup_message").html("<center><br />Thank you!  You may now resume using the application.<br /></center>");
    window.setTimeout(popup_remove, 1000);
    $("#popup_window").fadeOut("slow", function() { $('#popup_window,#popup_overlay').trigger("unload").unbind().remove(); });
    window.setTimeout(pop_init, SESSION_TIME);
}

function popup_expired() {
    if (!SESSION_ALIVE)
        window.close();
}

// Main popup window handler
function pop_init() {
    // show modal div
    $("html").css("overflow", "hidden");
    $("body").append("<div id='popup_overlay'></div><div id='popup_window'></div>");
    //$("#popup_overlay").click(popup_remove);  // removed to make sure user clicks button to continue session.
    $("#popup_overlay").addClass("popup_overlayBG");
    $("#popup_overlay").fadeIn("slow");

    // build warning box
    $("#popup_window").append("<h1>Warning</h1>");
    $("#popup_window").append("<p id='popup_message'>Your session is about to expire.  Please click the button below to continue working without losing your session.</p>");
    $("#popup_window").append("<div class='buttons'><center><button id='continue' class='positive' type='submit'><img src='images/green-checkmark.png' alt=''/> Continue Working</button></center></div>");

    // attach action to button
    $("#continue").click(session_refresh);

    // display warning window
    popup_position(400, 300);
    $("#popup_window").css({ display: "block" }); //for safari using css instead of show
    $("#continue").focus();
    $("#continue").blur();

    // set pop-up timeout
    SESSION_ALIVE = false;
    window.setTimeout(popup_expired, 30000);
}

【问题讨论】:

    标签: javascript asp.net jquery iframe parent-child


    【解决方案1】:

    尝试将 setTimeout 分配给全局变量并每次清除它,例如:

    var timer=false;
    window.reportChildActivity = function() {
        if(timer!==false) {
            clearTimeout(timer);
        }
        SESSION_ALIVE = true; 
        timer=window.setTimeout(pop_init, SESSION_TIME); 
    }
    

    示例:http://jsfiddle.net/pB2hX/1/

    【讨论】:

    • 感谢您的快速回复!我尝试根据您的建议修改我的函数(减去额外的 =,并在“pop_init()”周围加上括号和引号,但我得到了相同的结果。我不确定 clearTimeout 在这里如何工作,因为超时不是原始计时器的句柄。这不是 clearTimeout 期望通过的吗?在过去的几天里,我尝试了几种类似的方法来清除计时器,但没有任何效果。例如,我尝试了 var timer = window.setTimeout( "pop_init()", SESSION_TIME); 接着是 window.clearTimeout(timer); 但这并没有改变任何东西。
    • 是的,我的代码中似乎有几个错误。我已经修复了这个错误,并验证了它现在可以与示例一起使用。不过,我不确定您为什么无法清除计时器。
    • 好的,所以我没有像你的那样格式化我的函数。我有: var timeout = false;函数 window.reportChildActivity() { if (timer !== false) { window.clearTimeout(timer); } SESSION_ALIVE = 真; window.setTimeout(pop_init, SESSION_TIME);我在视觉上看到了差异,但我不知道编程方式的差异。随着你的改变,它工作得很好!但是,在我获得第一个弹出窗口以继续并单击按钮以继续后,父窗口似乎没有感应到子事件。
    • 我是否必须以某种方式重新绑定子窗口中的事件处理程序?或者我应该在我的 pop_init 函数中清除计时器,然后再重置它?我将发布我的 pop_init 函数,以防可能有助于或阐明我的问题。感谢您的帮助!
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多