Выгрузка / удаление или повторное использование уже загруженного JavaScript - PullRequest
2 голосов
/ 08 сентября 2011

Я пытаюсь загрузить jsp-файл в диалоговое окно 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 () вызывается с кнопки на моей странице. Спасибо!

1 Ответ

1 голос
/ 08 сентября 2011

Я полагаю, что после того, как вы закроете первый, он только скрыт, а затем вы создадите другой элемент с тем же идентификатором, что вызовет проблему с процессом загрузки.В идеале, чтобы немного больше контролировать 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");
}

Надеюсь, что-то там поможет!

...