2011-09-08 112 views
2

我試圖加載一個jsp文件到jQuery UI對話框http://jqueryui.com/demos/dialog/。 jsp包含一個fullCalendar http://arshaw.com/fullcalendar/日曆。控制檯呼籲calLoader.jsp這或多或少只包含:卸載/刪除或重新使用已加載javascript

<jsp:include page="../cal.jsp"/> 

當我打開的對話框中的第一次,一切都運行得很好,但在我關閉對話框,然後再次嘗試打開它,我得到從Chrome中以下堆棧跟蹤:

Uncaught RangeError: Maximum call stack size exceeded 
d.d.extend._Deferred.f.resolveWith 
d.d.extend._Deferred.f.done 
d.d.fn.d.ready 
d.d.fn.d.init 
d.d 
(anonymous function) 
d.d.extend.globalEval 
ba 
d.d.extend.each 
d.fn.extend.domManip 
d.fn.extend.append 
d.fn.extend.html 
d.fn.extend.load.d.ajax.complete 
d.d.extend._Deferred.f.resolveWith 
v 
d.support.ajax.d.ajaxTransport.send.c 

的問題是在Firefox相同的,但我得到的消息:

too much recursion 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

我意識到,我想更多的加載同樣的東西比一個和它不知何故需要重新使用或卸載/刪除和重新加載,但我不知道如何做到這一點。

這是我用來打開日曆(被請求)的代碼。

function openCalendar() { 
    var dialog = jQuery('<div id="calendaropener"></div>') 
    .dialog({ 
     autoOpen: false, 
     draggable: true, 
     modal: false, 
     resizable: false, 
     width: 820, 
     height: 750, 
     position: [50, 50], 
     title: 'Kalender', 
     close: function(ev, ui) { calendarObj = null; } 
    }); 
    dialog.load("calLoader.jsp"); 
    dialog.dialog('open'); 
} 

函數openCalendar()是從我的頁面上的按鈕調用的。 謝謝!

+0

你應該發佈你用來加載對話框的代碼。如果您使用jQuery進行加載,它通常會爲您調用「.empty()」。 – Pointy

+0

添加了我用來打開對話框的jquerycode。 –

回答

1

我的猜測是,關閉第一個後,它只會被隱藏,然後用相同的id創建另一個元素,導致加載過程出現問題。

$("#calendaropener").dialog(... 

這可能會幫助您管理/調試這一點:在理想情況下,要在DOM我將開始在其主頁我的日曆首戰格,然後創建對話框,這樣鍛鍊更多的控制更容易。

如果你不想這樣做,那麼你可以嘗試添加到您貼心的功能:

close: function(ev, ui) { calendarObj = null; $(this).remove(); } 

這將確保該元素從DOM移除,以便你不會得到任何古怪不止一次添加元素後可能會出現的問題。

最後,如果你是隻想處理隱藏和重新開放(假設這不破你的邏輯),那麼你可能會引發dialog.load("calLoader.jsp");條件,例如:

if($(dialogSelector).html().length == 0) { 
    dialog.load("calLoader.jsp"); 
} 

希望事情有幫助!

+0

你是明星!條件加載就像一個魅力(試過這個,但是太愚蠢了,以至於我不需要一個靜態div來處理......在演示中使用太多是一個糟糕的Badbad想法......)。我只需要在日曆上打電話更新,但這很簡單!非常感謝! –

+0

不用擔心,祝你好運! :) – Timbo