0

我正在构建或多或少是一个谷歌日历,但具有更具体的功能/特性。与 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,但问题每次都是一样的。

4

3 回答 3

0
$.getJSON('/events/add/'+ start +'/'+ end, function(data) {

});   

$.getJSON('/events/cancel/'+eventId, function(data) {

});
于 2012-05-15T08:05:52.047 回答
0

调试步骤是将其更改为

var url = "/events/cancel/(eventId)";
alert(url);
$.getJSON(url, function(data) {
    //server returns whether or not cancellation was successful
});
于 2012-05-15T05:03:33.053 回答
0

again, i know the right js function is being called

你是如何验证这一点的?

这可能是由多种原因造成的。大多数情况下,这要归功于一些杂散的点击处理程序,您通常可以通过执行

$('.cancel').unbind('click').click()

或生/死等价物。

一旦你过去了,console.log 该函数中的每个步骤,以确定 URL 被更改的位置。$.getJSON在请求之前开始。如果它是一个不正确的 url,向上移动直到你到达 url 被切换的位置。

您不能仅仅因为代码在刷新时就可以免除代码,特别是因为当您添加事件时可能会发生各种事情。

更多代码会有所帮助。

于 2012-05-15T05:31:32.133 回答