1

我被困在这里,希望能得到一些指导。我正在尝试从提要中获取 XML,将一些元素放入数组中,然后传递给 jQuery 的 DatePicker 插件。我下面的代码显示日历,但不显示提要中的事件。Chrome 也不显示任何错误或警告。不知道发生了什么。非常感谢任何帮助。

(我的 XML):

<entry>
    <published>2012-05-29T13:05:53-08:00</published>
    <updated>2012-05-29T13:05:58-08:00</updated>
    <title type="html">
       <![CDATA[ Businesses Get Help With Legal Issues ]]>
    </title>
    <content type="html">
       <![CDATA[ Click the article header for the complete story.
       <!-- /Publications/26674.htm -->
       ]]>
    </content>
    <link rel="alternate" type="text/html" href="/Publications/26675.htm"/>
</entry>

(在外部 JS 文件中):

$(document).ready(function(){

    var events = new Array();
    events = getSelectedDates();

    $("div.datepicker").datepicker({
    beforeShowDay: function(date) {
        var result = [true, '', null];
        var matching = $.grep(events, function(event) {
            return event.published.valueOf() === date.valueOf();
        });

        if (matching.length) {
            result = [true, 'highlight', null];
        }
        return result;
    },
    onSelect: function(dateText) {
        var date,
            selectedDate = new Date(dateText),
            i = 0,
            event = null;

        while (i < events.length && !event) {
            date = events[i].published;

            if (selectedDate.valueOf() === date.valueOf()) {
                event = events[i];
            }
            i++;
        }
        if (event) {
            alert(event.Title);
        }
    }
});
});


function getSelectedDates()
{
    var the_selected_dates = new Array();

    $.ajax(
    {
        url: 'news.xml',
        type: 'GET',
        dataType: 'xml',
        async: false,
        success: function(data)
        {
            $(data).find('entry').each(function(i, entryObj)
            {
                var entryObj = new Object();
                entryObj.eTitle = $('title', this).text();
                entryObj.eDate = $('published', this).text();
                the_selected_dates.push(entryObj);
            });
        }
    });
    return the_selected_dates;
}
4

2 回答 2

1

这个片段有几个问题,但你实际上没有正确解析 XML 的原因events总是空的。我更改了getSelectedDates函数以执行eachover each entry(在您搜索entry元素内的entry元素之前):

function getSelectedDates() {
    return $(data).map(function() {
        return {
            title: $('title', this).text(),
            published: new Date($('published', this).text())
        };
    }).get();
}​

如您所见,我还使用.map将 XML 元素转换为具有属性titlepublished. 您使用了几个属性名称(有时eDate,有时published),这导致了问题,但我也修复了这个问题。

下一个问题是您正在使用valueOf. 由于传递的日期beforeShowDay没有时间部分,因此您的函数几乎不可能$.grep返回true任何日期。我解决这个问题的方法是与我们关心的日期元素(日期、月份、全年)进行比较:

beforeShowDay: function(date) {
    var result = [true, '', null],
        matching = $.grep(events, function(event) {
            return event.published.getDate() === date.getDate() && 
                   event.published.getMonth() === date.getMonth() &&
                   event.published.getFullYear() === date.getFullYear();
        });

    if (matching.length) {
        result = [true, 'highlight', null];
    }
    return result;
},

我也做了类似的改变onSelect

onSelect: function(dateText) {
    var date, selectedDate = new Date(dateText),
        i = 0,
        event = null;

    while (i < events.length && !event) {
        date = events[i].published;

        if (selectedDate.getFullYear() === date.getFullYear() && 
            selectedDate.getMonth() === date.getMonth() && 
            selectedDate.getDate() === date.getDate()) {

                event = events[i];
        }
        i++;
    }
    if (event) {
        alert(event.title);
    }
}

我在这里有一个完整的工作示例:http: //jsfiddle.net/4extL/31/

注意:我会非常小心您在 XML 中使用的日期格式。我不确定是否始终正确解析带有时区的 ISO8601 日期。

于 2012-05-30T02:51:24.447 回答
0

谢谢安德鲁。这是一个巨大的帮助。我有这一切与以下编辑一起工作:

1...在 getSelectedDates() 函数中,我在返回中添加了一个“查找”,因为我正在处理整个 XML 文件

return $(data).find('entry').map(function()

2...我使用 AJAX 从我的 XML 文件创建我的数据变量:

var data = $.ajax({
     url: "news.xml",
     type: "GET",
     dataType: "xml",
     async: false,
     success: function(xml){
           return xml;
     }
 } ).responseText;
于 2012-05-30T17:20:59.133 回答