Сообщение о событиях дочернего окна в родительское окно для сброса значения таймера кода тайм-аута пользователя - PullRequest
2 голосов
/ 02 сентября 2010

У меня есть написанная функция 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> 

Независимо от того, сколько я нажимаю или использую ключи в дочернем окне, мой код тайм-аута Jquery вызывается, когда SESSION_TIME заканчивается в первый раз.И затем я получаю несколько окон 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 Ответ

1 голос
/ 02 сентября 2010

попробуйте присвоить 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/

...