Функция обратного вызова функции jQuery FullCalendar не отображает мои события - PullRequest
0 голосов
/ 19 октября 2011

Я использую плагин jQuery FullCalendar для проекта, над которым я работаю, и пытаюсь отобразить в календаре события, возвращаемые из запроса в сервлет Java. Сервлет возвращает XML-документ, который я затем анализирую для создания события, а затем помещаю его в необходимый массив, который затем передаю в функцию обратного вызова.

код

<html>
    <head>
        <link rel="stylesheet" type="text/css" href="fullcalendar.css" />
        <script type="text/javascript" src="jquery.min.js"></script>
        <script type="text/javascript" src="fullcalendar.min.js"></script>
        <script type="text/javascript">
            $(document.ready(function() {
                $("#calendar").fullCalendar({
                    events: function(start, end, callback) {
                        $.get("servlet?command=getEvents", function(data) {
                            var events = [];
                            $(data).find("event").each(function() {
                                events.push({
                                    id: $(this).find("id").text(),
                                    title: $(this).find("title").text(),
                                    start: $(this).find("start").text(),
                                    end: $(this).find("end").text(),
                                    url: $(this).find("url").text()
                                });
                            }
                            callback(events);
                        }, "xml");
                    }
                });
            });
        </script>
    </head>
    <body>
        <div id="calendar"></div>
    </body>
</html>

XML возвращается из сервлета

<xml>
    <event>
        <id>Event1</id>
        <title>Title1</title>
        <start>2011-10-18</start>
        <end>2011-10-19</end>
        <url>http://www.google.com</url>
    </event>
    // More Events...
</xml>

Теперь, похоже, что XML возвращается из сервлета в порядке, и синтаксический анализ данных также работает правильно. Однако сами события не отображаются в календаре. Я не совсем уверен, в чем разница между events и eventSources, но я пробовал оба, и ни один из них не работал должным образом. Любая идея, почему - для всех намерений и целей - плагин не отображает события, которые, кажется, находятся в массиве событий, как предписано документацией? Дайте мне знать, если вам нужно больше деталей или код; Я сгенерировал макет всего необходимого, поэтому это не весь мой код.

1 Ответ

1 голос
/ 20 октября 2011

Я знаю, что я еще не получил ответов на этот вопрос, но я думаю, что мне удалось выяснить мою проблему.Теги <title> файла XML, который возвращал мой сервлет, иногда были недействительными;некоторые из заголовков содержали недопустимые символы XML, которые мне нужно было заменить перед отправкой файла обратно на вызов AJAX.Как только это было сделано с помощью следующей функции, отмеченной ниже, все мои события начали отображаться правильно.И да, я понимаю, что, возможно, существует более эффективный способ удаления недопустимых символов с помощью регулярных выражений или чего-то еще, но все, что я пробовал, не работалоЭта функция, хотя и неэффективна, работает ...

protected static String forXML(String aText) {
    final StringBuilder result = new StringBuilder();
    final StringCharacterIterator iterator = new StringCharacterIterator(aText);
    char character =  iterator.current();

    while (character != CharacterIterator.DONE ) {
        if (character == '<') {
            result.append("&lt;");
        }
        else if (character == '>') {
            result.append("&gt;");
        }
        else if (character == '\"') {
            result.append("&quot;");
        }
        else if (character == '\'') {
            result.append("&#039;");
        }
        else if (character == '&') {
            result.append("&amp;");
        }
        else {
            result.append(character);
        }
        character = iterator.next();
    }
    return result.toString();
}
...