既にロードされたJavaScriptをアンロード/削除または再利用します
-
27-10-2019 - |
質問
jsp-fileをjquery uiダイアログにロードしようとしています http://jqueryui.com/demos/dialog/. 。 JSPにはFullCalendarが含まれています http://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()は、私のページのボタンから呼び出されます。ありがとう!
解決
私の推測では、最初のものを閉じた後、それは隠されているだけで、同じIDを持つ別の要素を作成し、それが読み込みプロセスに問題を引き起こすと思います。理想的には、DOMをもう少し制御するために、メインページにカレンダーオープナーDIVを使用してから、ダイアログを作成することから始めます。
$("#calendaropener").dialog(...
これは、もう少し簡単に管理 /デバッグするのに役立つ場合があります。
それをしたくない場合は、緊密な機能に追加してみてください。
close: function(ev, ui) { calendarObj = null; $(this).remove(); }
これにより、要素がDOMから削除されるようになるため、要素を複数回追加することから続く可能性のある風変わりな問題が得られないようになります。
最後に、隠れや再オープンを処理したいだけなら(これがあなたの論理を破らないと仮定して)、あなたは dialog.load("calLoader.jsp");
条件付き、例:
if($(dialogSelector).html().length == 0) {
dialog.load("calLoader.jsp");
}
そこに何かが役立つことを願っています!