2010-08-25 61 views
0

我是Jquery的新手,但我在.NET 2.0項目中使用它來在我們的用戶閒置13分鐘後離開系統。我有一個功能,基本上屏幕黑屏,並給他們一個按鈕噸繼續工作。它已經工作了一段時間,但只適用於「孩子」窗口,因爲我實現它的方式。window.load上的JQuery錯誤()

我們沒有在技術上使用母版頁,但我試圖將代碼嵌入到母版頁的等價物中,而且我遇到了javascript錯誤。有問題的代碼是:

$(window).load() { 
    window.setTimeout("pop_init()", SESSION_TIME); 
} 

我得到的錯誤是一個「;」是期待。我已經試過:

$(window).load() { 
    window.setTimeout("pop_init()", SESSION_TIME); 
}; 

,也試過:

$(window).load(function() { 
    window.setTimeout("pop_init()", SESSION_TIME); 
}); 

都具有相同的結果。預先感謝您的時間和任何可能的建議!

這裏是我的pop_init函數的代碼:

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()", 1000); 
} 

嗯,我確信,所有相關功能都位於現在稱他們上面的代碼,而我仍然得到同樣的錯誤,所以我很茫然。奇怪的是,我的覆蓋層淡入,然後錯誤被拋出 - 但我的彈出式繼續按鈕從不顯示。所以這就好像錯誤在疊加層和#popup_window結構之間。我附上完整的.js文件。還有一些與此無關的其他功能,但是用於系統的另一部分,但爲了完整性以及可能存在某種干擾的可能性,我將它們包括在內:

//以下代碼用於處理會話超時 //用於設置重複會話超時呼叫的全局變量。 //將SESSION_TIME設置爲(#秒)* 1000,並在向用戶發送彈出窗口之前等待總毫秒數 //等待。 //您應該在會話超時前兩分鐘給用戶回覆, //例如對於15分鐘超時,將其設置爲13 * 60 * 1000 = 780000(〜13分鐘)。 var SESSION_TIME = 60000;

//用於測試會話是否已過期的全局變量。設置爲true,直到彈出菜單 //顯示給用戶。點擊繼續時重置。 var SESSION_ALIVE = true;

//確定彈出窗口的大小和位置調整功能 popup_position(P_WIDTH,P_HEIGHT){ $( 「#popup_window」)的CSS({marginLeft: ' - ' + parseInt函數((P_WIDTH/2),10 )+'px',寬度:P_WIDTH +'px'}); }

//刪除所有添加的對象,並重新啓動定時器 功能popup_remove(){ $( 「#popup_window」)。淡出( 「快」,函數(){$( '#popup_window,#popup_overlay') .trigger(「unload」)。unbind()。remove();}); (if)(typeof document.body.style.maxHeight ==「undefined」){// IE 6 $(「body」,「html」)。css({height:「auto」,width:「auto 「}); (「html」)。css(「overflow」,「」); //} 窗口。setTimeout(「pop_init()」,SESSION_TIME); }

// session button ajax call from button click function session_refresh(){ SESSION_ALIVE = true; (「。buttons」)。hide(); (「#popup_message」)。html(「
謝謝!您現在可以恢復使用系統了。
」); window.setTimeout(「popup_remove()」,300); ()「);}}; $(」#popup_window「)。fadeOut(」slow「,function(){$('#popup_window,#popup_overlay')。trigger(」unload「)。unbind()。remove();}); window.setTimeout(「pop_init()」,SESSION_TIME); }

//主彈出窗口處理函數 pop_init(){// 顯示模式DIV $( 「HTML」)的CSS( 「溢出」, 「隱藏」)。 $(「body」)。append(「」); //$("#popup_overlay").click(popup_remove); //刪除以確保用戶點擊按鈕繼續會話。 $(「#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()", 1000); 

}

//第一次調用彈出窗口 $(窗口).load(函數(){ window.setTimeout( 「pop_init()」,SESSION_TIME); });

function popup_expired(){ if(!SESSION_ALIVE) //window.location.href =「login.asp」; //window.location.href =「default.aspx」; window.close; }

功能replaceBadCharacters(){// 獲取所有文本框和文本區控制 $( '輸入[類型=文本],文本區域')。每個(函數(){ VAR txtobj = $('# '+ this.id); txtobj.attr(「value」,txtobj.attr(「value」)。replace(new RegExp(String.fromCharCode(8216),「g」),String.fromCharCode(39))) ; // Microsoft Word左側撇號 txtobj.attr(「value」,txtobj.attr(「value」)。replace(new RegExp(String.fromCharCode(8217),「g」),String.fromCharCode(39) )); // Microsoft Word右側撇號 txtobj.attr(「value」,txtobj.attr(「value」)。replace(new RegExp(String.fromCharCode(8220),「g」),「'」) ); // Microsoft Word左側引號 txtobj.attr(「value」,txtobj.attr(「value」)。replace(new RegExp(String.fromCharCode(8221),「g」),「'」)); // Microsoft Word右側引號 }); } //超時結束代碼 // -------------------------------------- -----

//下面的代碼是警告案例項目/編輯頁面上,如果他們點擊某些鏈接 //這種情況下,將保存用戶(想補充說明,改變收集表等) var calling_obj;

// call from cancel button click 
function save_abort() { 
    popup_remove(); 
} 

// call from continue button click 
function save_continue() { 
    //alert(calling_obj.id);  
    __doPostBack(calling_obj.id, ''); 
    popup_remove(); 
} 

function warn_save(obj) { 
// show modal div 
//alert(obj.id); 
$("html").css("overflow", "hidden"); 
$("body").append("<div id='popup_overlay'></div><div id='popup_window'></div>"); 
$("#popup_overlay").addClass("popup_overlayBG"); 
$("#popup_overlay").fadeIn("slow"); 

// build warning box 
$("#popup_window").append("<h1>Save Case?</h1>"); 
$("#popup_window").append("<p id='popup_message'><center>Navigating away from the current page will automatically save this Case. Do you want to continue?</center></p>"); 
$("#popup_window").append("<div class='buttons'><center><button id='continue' class='positive' type='submit'><img src='images/green-checkmark.png' alt=''/>Yes</button>&nbsp;<button id='cancel' class='positive' type='submit' alt=''><img src='images/delete.png' alt=''/>No</button></center></div>"); 

// attach action to button 
$("#continue").click(save_continue); 
calling_obj = obj; 
$("#cancel").click(save_abort); 

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

// Case Entry div expand/close functions 
function close_div_acct() { 
    $("#div_acct").hide(); 
} 

回答

0

將setTimeout放在window.load中是多餘的,因爲window.setTimeout將在window.load上運行。你不應該需要任何東西超過這個:

window.setTimeout("pop_init()",SESSION_TIME); //Added quotes so function isn't immediately run 

確保SESSION_TIME和pop_init()按正確的順序聲明。如果您有任何問題,最有可能在您的SESSION_TIME或pop_init()函數中。

編輯:確保你的session_time是在正確的數量級,SESSION_TIME = 3000是超時3秒。

+0

SESSION_TIME是我聲明的第一個var,然後聲明第二個var,接着是我的window.load函數,接着是pop_init()。這不正確的順序嗎?我知道毫秒時間,即使將SESSION_TIME設置爲60000,我也會立即顯示覆蓋圖。 – Mike 2010-08-25 18:35:29

+0

@Mike: pop_init()應該在window.load之前聲明。另外,你只是宣佈SESSION_TIME還是你分配?這聽起來像你以後分配它作爲你的pop_init()正在運行,但時間不起作用。你有沒有試過將一個值硬編碼到setTimeout中,看看它是否有效? – 2010-08-25 18:38:39

+0

@Bryan,謝謝!我完全沒有想到在文件中的位置 - 談論新手的錯誤! DOH!所以我想,同樣,從pop_init調用的popup_position函數需要在* pop_init之前聲明*等等。 – Mike 2010-08-25 18:48:08

0

它應該是這樣的:

$(window).load(function() { 
    window.setTimeout(pop_init, SESSION_TIME); 
}); 

雖然你的最後一次嘗試應該工作或拋出一個不同的錯誤。它看起來像之前這一個(可能在一個包含的文件中)不屬性終止與;。查看代碼並查看在此之前運行的最後一個JavaScript,包括通過<script>標記包含的文件。爲了檢驗這一理論,這樣做:

;$(window).load(function() { 
    window.setTimeout(pop_init, SESSION_TIME); 
}); 
+0

你是不是想在結束之前加'''';'?我沒有看到開放的位置(對於它來說) – 2010-08-25 17:16:01

+0

@Barlow - 謝謝,那裏有完整的大腦失效,更關注他上次嘗試*應該*工作(或拋出'pop_init'不是函數錯誤)的事實。 – 2010-08-25 17:17:38

+0

感謝您的回覆!我嘗試了所有的建議,並取得了一些進展,因爲我現在至少拋出了一個不同的錯誤。當我使用這個:$(window).load(function(){window.setTimeout(「pop_init )「,SESSION_TIME);});我得到以下錯誤:對象不支持此屬性或方法,確切的行是:if((t = n.leftMatch [H] .exec(g)) != null && t [2])一些觀察 - 我嘗試了你的建議,meder,並從setTimeout調用中移除了「window」,並得到了我現在得到的同樣的錯誤,並且,如果我將引號從調用pop_init沒有任何變化 – Mike 2010-08-25 18:11:05

1

你試過..

$(window).load(function() { 
    setTimeout(pop_init, SESSION_TIME); 
}); 

這並不自動調用它。但句法上它是正確的。如果不這樣做,問題可能出現在其他地方,可能高於這段代碼。

+0

您需要引用」pop_init )「,否則它會自動執行 – 2010-08-27 22:12:57

+0

我認爲你錯了,在這種情況下的行爲是一種不好的做法,使用它們會使它慢得多,另外,傳遞引用不會立即調用,通常是 – 2010-08-27 23:16:48

+0

每當我嘗試不用引號時,它立即執行,不管我爲SESSION_TIME設置了什麼。 – Mike 2010-08-30 20:15:02

1

那麼,在完全解構我的頁面直到我沒有錯誤,然後重新構造它直到出現錯誤,事實證明我們正在調用Utility.RegisterTypeForAjax方法,這顯然需要AjaxPro。 2,我們正在使用舊版本的AjaxPro。我升級到AjaxPro.2並解決了錯誤。

現在我有一個新的問題,雖然。我的超時代碼(pop_init)每隔SESSION_TIME秒/分鐘被調用一次,而不管正在使用哪個子窗口。我的超時代碼是從我們版本的母版頁(但在技術上來說不是母版頁)上調用的,父窗口似乎無法識別子窗口仍在使用中。這個的任何想法?

感謝Bryan,meder和Nick的所有偉大的詳盡幫助!

+0

沒問題,但你應該接受/ upvote所有我們的答案,如果你讚賞我們的幫助。對於你的新問題,我的建議是發佈另一個問題,並從這裏鏈接到它。 – 2010-08-27 22:12:18