将子窗口的事件报告给父窗口以重置用户超时代码的计时器值

时间:2010-09-02 14:25:24

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

我有一个我编写的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);
}

1 个答案:

答案 0 :(得分: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/