fullCalendar, IE 11, refetchEvents 仅在调试器/开发人员窗口 [F12] 打开时触发



问题:

fullCalendar 在成功完全 AJAX 调用后不会使用.fullCalendar('refetchEvents')更新事件。


  • MSIE 11.0.41 (11.0.9600.18638) -出现问题
  • FireFox 53.0 (32位) -- 未出现问题
  • Chrome 58.0.3029.81(64 位)-- 未出现问题

  • VS2015, 本地主机上的 C# MVC, IIS Express
  • 完整日历.js v3.3.0
  • jquery-3.1.1.js
  • jquery-ui-1.12.1.js

症状描述:

使用以下调用将新事件插入 fullCalendar 时$.ajax

$.ajax({
type: 'POST',
url: '@Url.Action("SaveEvent","Calendar")',
data: dataRow,
success: function (response) {
if (response == 'True') {
$('#_Calendar').fullCalendar('refetchEvents');
alert('New event saved!');
}
else {
alert('Error, could not save event!');
}
}
});

当回调到来时,fullCalendar 的'refetchEvents'方法只会在调试器/开发人员窗口打开时触发 - 在 MSIE 11 中。是否设置了实际的断点并不重要,只有打开调试器/开发人员窗口才能使例程工作?

即使触发与$.ajax调用完全分开的'refetchEvents'也具有相同的行为。 即如果我触发如下功能:

<button type="button" class="btn" onclick="fetchEvents(); return false;">trigger</button>

带功能:

function fetchEvents() {
$('#_Calendar').fullCalendar('refetchEvents');
}

效果完全相同,如果调试器/开发人员窗口打开,"refetchEvents"只会在MSIE 11中触发?

我认为这可能是一个计时问题,因此我的手动触发选项,但即使'refetchEvents'调用是在插入事件之后,行为也是相同的。即使页面刷新也不会触发'refetchEvents'事件刷新仅在调试器/开发人员窗口打开时触发 - 在 MSIE 11 中。

如前所述,任何平台上(我测试过)上没有其他浏览器具有相同的结果? (FireFox/Chrome/Safari/Android[Chrome & FireFox] 都完美无缺...)

有没有人遇到过这种行为和/或可能有解决方案?

感谢您的投入!

事实证明,根据 Alex K. 的回答,这确实是一个缓存问题,IE 过于热衷于缓存日历的事件并且不更新事件。


溶液

在早期阶段,我偶然发现了这个问题和奇妙的答案。 不久之后,我也用同样好的答案注意到了这个问题。(确保对他们投赞成票!

我将两者组合在一个属性中,如下所示。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
//Added later from: https://stackoverflow.com/questions/49547/how-to-control-web-page-caching-across-all-browsers
filterContext.HttpContext.Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
filterContext.HttpContext.Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
filterContext.HttpContext.Response.AppendHeader("Expires", "0"); // Proxies.
base.OnResultExecuting(filterContext);
}
}

因此,通过使用[NoCache]属性装饰我的GetDiaryEvents方法,JSON 响应会使用正确的标头进行适当的标记,告诉浏览器不要缓存返回的值。

这样:

//GET: All Diary events
[NoCache]
public JsonResult GetDiaryEvents(string start, string end)
{
// code code code...
var rows = eventList.ToArray();
return Json(rows, JsonRequestBehavior.AllowGet);
}

因此,JSON 消息以以下方式发送到浏览器:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?SDpcTWFydGlqbiBUaG9sZW5cTXkgRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxNVxQcm9qZWN0c1xGaW5pc2hMaW5lXzQuMlxGaW5pc2hMaW5lXzQuMlxDYWxlbmRhclxHZXREaWFyeUV2ZW50cw==?=
X-Powered-By: ASP.NET
Date: Thu, 04 May 2017 09:36:35 GMT
Content-Length: 9265

问题解决了...

相关内容

  • 没有找到相关文章

最新更新