2011-09-08 114 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