Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的会议室可用性_Javascript_Jquery_Google Calendar Api - Fatal编程技术网

JavaScript中的会议室可用性

JavaScript中的会议室可用性,javascript,jquery,google-calendar-api,Javascript,Jquery,Google Calendar Api,我正在尝试为我所在大学的会议室创建一个房间可用性脚本。我决定使用jQuery解析一个公共Google日历的JSON提要,然后在屏幕上显示房间是否可用,从而实现这一点 我觉得自己很愚蠢,我已经和这个问题斗争了3天,不管谷歌日历上是否有约会,脚本上说房间是空的。有谁能提出一个建议,为什么会发生这种情况。我不是一个程序员,我打赌这是非常简单的事情,但我只是看不到它。任何帮助都将不胜感激 下面是一个简单的工作示例: <html> <head> <title>Gradu

我正在尝试为我所在大学的会议室创建一个房间可用性脚本。我决定使用jQuery解析一个公共Google日历的JSON提要,然后在屏幕上显示房间是否可用,从而实现这一点

我觉得自己很愚蠢,我已经和这个问题斗争了3天,不管谷歌日历上是否有约会,脚本上说房间是空的。有谁能提出一个建议,为什么会发生这种情况。我不是一个程序员,我打赌这是非常简单的事情,但我只是看不到它。任何帮助都将不胜感激

下面是一个简单的工作示例:

<html>
<head>
<title>Graduate Center Conference Room</title>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script>
// Declare global variables

var events = [];
var currentReservation = null;
var nextReservation = null;
var gclaData = 'http://www.google.com/calendar/feeds/4occ2bc4m626a3pgmirlm06q5s%40group.calendar.google.com/public/full?orderby=starttime&sortorder=ascending&futureevents=true&singleevents=true&max-results=2&alt=json';

// Parse Google Calendar Public JSON Feed and store in the events global array

$(document).ready(function () {
$.getJSON(gclaData, function (data) {
    $.each(data.feed.entry, function (i, entry) {
        var dtStart = new Date(entry["gd$when"][0].startTime);
        var dtEnd = new Date(entry["gd$when"][0].endTime);
        var dtSummary = entry.content.$t;
        var dtTitle = entry.title.$t;

        events[i] = {
            'start': dtStart,
                'end': dtEnd,
                'title': dtTitle,
                'summary': dtSummary
        };
    });
});

reservationInfo = '';

// sort events just in case (JSON should be sorted anyways)    

events.sort(function (a, b) {
    return a.start - b.start;
});

// current date

var dtNow = new Date();

// let's assume there are no current room reservations unless script detects otherwise.
// No reservations indicated by -1
currentReservation = -1;

// loop through the events array and if current time falls between start and end of a element in the array the mark it as a reservation currently in progress 

for (var i in events) {
    if (dtNow >= events[i].start && dtNow <= events[i].end) currentReservation = i;
}

// Print the result to a output div

if (-1 == currentReservation) {

    reservationInfo = '<h1>ROOM AVAILABLE</h1>';
    $('#output').html(reservationInfo);

} else {

    reservationInfo = '<h1>ROOM OCCUPIED</h1>';
    $('#output').html(reservationInfo);
}
});
</script>
</head>
<body>
            <div id="output"></div>
</body>
</html>

您可以使用以下命令快速检查变量的状态:

console.log(variableName);
这将在开发者工具的浏览器控制台选项卡中输出变量的结果

在你的情况下,我做了console.logevents;我发现事件没有被设置。经过一些调试,我确定代码是$。getJSON函数在下面的代码运行之前没有100%完成,很可能是因为ajax请求需要时间

为了解决这个问题,我在$.getJSON函数中移动了所有解析事件的代码,以便在解析数据之前正确地检索和设置事件

现在,您的代码将如下所示:

工作区:


您可以使用以下命令快速检查变量的状态:

console.log(variableName);
这将在开发者工具的浏览器控制台选项卡中输出变量的结果

在你的情况下,我做了console.logevents;我发现事件没有被设置。经过一些调试,我确定代码是$。getJSON函数在下面的代码运行之前没有100%完成,很可能是因为ajax请求需要时间

为了解决这个问题,我在$.getJSON函数中移动了所有解析事件的代码,以便在解析数据之前正确地检索和设置事件

现在,您的代码将如下所示:

工作区:

一些观察结果。。。 我会对你的代码进行重构,并经常进行调试

2您的events变量不是预期的对象,因为ajax调用是异步的,其他代码在进入将填充对象的回调之前执行。换句话说,您需要等待ajax调用,否则您的对象将不是预期的对象,可能一开始是未定义的对象,过了一会儿,当ajax调用完成时,一个包含数据的对象

要知道,可以强制ajax调用同步,但这不是一个好方法

试试这个: 我喜欢这样工作,这样组织起来更好:

现场演示:

HTML:

jQuery:

一些观察结果。。。 我会对你的代码进行重构,并经常进行调试

2您的events变量不是预期的对象,因为ajax调用是异步的,其他代码在进入将填充对象的回调之前执行。换句话说,您需要等待ajax调用,否则您的对象将不是预期的对象,可能一开始是未定义的对象,过了一会儿,当ajax调用完成时,一个包含数据的对象

要知道,可以强制ajax调用同步,但这不是一个好方法

试试这个: 我喜欢这样工作,这样组织起来更好:

现场演示:

HTML:

jQuery:


+1.将代码划分为处理单个任务的单独函数。它使脚本的每个方法都更易于调试。Oscar。非常感谢您在重写此代码时提供的帮助和付出的辛勤工作。看看你的代码是多么的干净整洁,我就知道我有多少东西需要学习:-感谢你指出ajax执行的异步本质,这是我试图解决的问题,但显然我失败了;-非常感谢你+1.将代码划分为处理单个任务的单独函数。它使脚本的每个方法都更易于调试。Oscar。非常感谢您在重写此代码时提供的帮助和付出的辛勤工作。看看你的代码是多么的干净整洁,我就知道我有多少东西需要学习:-感谢你指出ajax执行的异步本质,这是我试图解决的问题,但显然我失败了;-非常感谢你!阿克塞尔,非常感谢你的帮助!诚然,我对JavaScript的掌握很少,因为从草率的编程风格可以明显看出这一点。我将致力于更好地理解如何使用函数划分代码并避免全局变量。再次非常感谢你!阿克塞尔,非常感谢你的帮助!诚然,我对JavaScript的掌握很少,因为从草率的编程风格可以明显看出这一点。我将努力更好地了解t是如何工作的 o使用函数划分代码并避免全局变量。再次非常感谢你!
<div id="output"></div>
/*
 * http://stackoverflow.com/questions/23205399/conference-room-availability-in-javascript
 * @author: Oscar Jara
 */

/* Google calendar URL */
var url = 'http://www.google.com/calendar/feeds/4occ2bc4m626a3pgmirlm06q5s%40group.calendar.google.com/public/full?orderby=starttime&sortorder=ascending&futureevents=true&singleevents=true&max-results=2&alt=json';

/* Status list used to show final message to UI */
var statusList = {
    'ROOM_A': 'Available',
    'ROOM_O': 'Occupied',
    'ERROR_DATA': 'No data found at Google calendar.',
    'ERROR_PROCESS': 'There was an error checking room availability.'
};

/* Document onReady handler */
$(document).ready(function () {
    getCalData(url);
});

/* 
 * Get Google calendar data by request.
 * @param {String} url
 */
function getCalData(url) {
    var statusCode;
    $.getJSON(url, function (data) {
        if (!$.isEmptyObject(data)) {
            var events = parseCalData(data);
            var curReserv = getCurrentReservation(events);
            statusCode = getRoomStatusCode(curReserv);
        } else {
            statusCode = 'ERROR_DATA';
        }
        printRoomStatusToUI(statusCode, $('#output'));
    }).fail(function (r) { // HTTP communication error
        console.error(r);
    });
};

/*
 * Parse Google calendar data.
 * @param {Object} data
 * @return {Object} events
 */
function parseCalData(data) {
    var events;
    events = $.map(data.feed.entry, function (evt, i) {
        var dt = evt['gd$when'][0];
        return {
            start: new Date(dt.startTime),
            end: new Date(dt.endTime),
            title: evt.title.$t,
            summary: evt.content.$t
        };
    });
    if (events) {
        sortEvents(events); // Just in case
    }
    return events;
};

/*
 * Sort Google calendar events.
 * @param {Object} events
 */
function sortEvents(events) {
    events.sort(function (a, b) {
        return a.start - b.start;
    });
}

/*
 * Get/check for current reservation.
 * If current time falls between start and end of an event, 
 * mark it as a reservation currently in progress.
 * @param {Object} events
 * @return {int} curReserv
 */
function getCurrentReservation(events) {
    var curReserv;
    if (events) {
        var dtNow = new Date(); // Current datetime
        curReserv = -1; // No reservations
        for (var i in events) {
            var dtStart = events[i].start;
            var dtEnd = events[i].end;
            if (dtNow >= dtStart && dtNow <= dtEnd) {
                curReserv = i;
                break;
            }
        }
    }
    return curReserv;
};

/*
 * Get room availability statusCode.
 * @param {int} curReserv
 * @return {String} statusCode
 */
function getRoomStatusCode(curReserv) {
    var statusCode = 'ROOM_A';
    if (!curReserv) {
        statusCode = 'ERROR_PROCESS';
    } else if (curReserv && curReserv != -1) {
        statusCode = 'ROOM_O';
    }
    return statusCode;
};

/*
 * @private
 * Get room status text.
 * @param {String} statusCode
 * @return {String}
 */
function getRoomStatusText(statusCode) {
    return statusList[statusCode];
};

/*
 * @private
 * Check if statusCode is an ERROR one.
 * @param {String} statusCode
 * @return {Boolean}
 */
function isErrorStatus(statusCode) {
    return (statusCode.indexOf('ERROR') > -1);
};

/* 
 * Print room availability to UI.
 * @param {String} statusCode
 * @param {Object} elem
 */
function printRoomStatusToUI(statusCode, elem) {
    var statusText = getRoomStatusText(statusCode);
    var isError = isErrorStatus(statusCode);
    if (statusText && $.trim(statusText) != '') {
        if (!isError) {
            statusText = '<h1>Room is: ' + statusText + '</h1>';
        }
        elem.html(statusText);
    }
};