2

jspファイルをjQueryUIダイアログhttp://jqueryui.com/demos/dialog/にロードしようとしています。jspには、fullCalendarhttp ://arshaw.com/fullcalendar/カレンダーが含まれています。コンソールはcalLoader.jspを呼び出しますが、これには多かれ少なかれ次のものしか含まれていません。

<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()は、私のページのボタンから呼び出されます。ありがとう!

4

1 に答える 1

1

私の推測では、最初の要素を閉じた後は非表示になり、同じIDで別の要素を作成すると、読み込みプロセスで問題が発生します。理想的には、DOMをもう少し制御するには、メインページにカレンダーオープナーdivを配置してから、次のようなダイアログを作成することから始めます。

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

これは、もう少し簡単に管理/デバッグするのに役立つ場合があります。

それをしたくない場合は、close関数に追加してみてください。

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

これにより、要素がDOMから確実に削除されるため、要素を複数回追加した場合に発生する可能性のある奇妙な問題が発生することはありません。

最後に、非表示と再開を処理したいだけの場合(これがロジックを壊さないと仮定して)、dialog.load("calLoader.jsp");条件付きでトリガーできます。例:

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

そこに何かが役立つことを願っています!

于 2011-09-08T12:21:05.917 に答える