我正在构建或多或少是一个谷歌日历,但具有更具体的功能/特性。与 Google 日历一样,当用户点击某个事件时,我会使用 ajax 获取请求填充一个“弹出式”div。填充该 div 的 html 包含特定于正在查看的事件的 javascript 函数。当用户完成使用弹出窗口时,无论是关闭它还是保存更改,我都会在隐藏它之前擦除其中的 html。
现在问题来了:对于某个事件有一个两步创建过程 1) 用户单击日历以创建一个临时的、可移动的、可调整大小的事件,将其移动到位,单击它以查看确认弹出窗口,确认后,调用服务器在数据库中创建事件。
//(start) and (end) are unix timestamps for the beginning and end of the new event
$.getJSON("/events/add/(start)/(end)", function(data) {
//server returns whether or not the add was successful...
});
现在,一旦确认并且服务器在保存新事件时没有任何问题,弹出窗口的 html 将被删除,弹出窗口被隐藏,并且日历从服务器重新获取事件。就像它应该的那样,新事件现在正从数据库馈送到日历中。
当用户点击数据库版本时,我使用 view.ctp 填充弹出窗口(我使用的是 cakephp),其中包括一个取消按钮和一个 javascript 函数“cancel()”
这是我不知所措的地方:我知道按钮正确地调用了函数,我已经测试了几种不同的方法。函数内是另一个 getJSON 请求......
$.getJSON("/events/cancel/(eventId)", function(data) {
//server returns whether or not cancellation was successful
});
如果我刷新了页面,取消会按预期工作,但如果我在创建事件后立即取消事件(没有先刷新页面),而不是调用“/events/cancel/(eventId)”url, "/events/add/(start)/(end)" 再次被调用。
获取 JSON 数据没有问题(当调用正确的 url 时)。事实上,如果您尝试添加与现有事件重叠的事件,它返回的错误消息就是您所期望的。
同样,我知道正在调用正确的 JavaScript 函数,并且我知道每个服务器端函数都在正常工作。只是,出于我不明白的原因,调用了错误的 URL。
我很抱歉用这个来编造这样的故事,我希望我已经包含了足够的信息。我不认为这是我的代码中的问题 - 就像我提到的那样,页面刷新可以防止这个问题。
我尝试将 jquery 的缓存设置为 false。我尝试重命名和重新定位我的 JavaScript 函数,以防止任何潜在的重叠。我尝试将 $.getJSON 更改为简单的 $.get,但问题每次都是一样的。