fullCalendar,IE 11,refetchEvents 仅在 debugger/developer window [F12] 打开时触发
fullCalendar, IE 11, refetchEvents only fires when debugger/developer window [F12] is open
问题:
fullCalendar 在 AJAX 调用成功后不使用 .fullCalendar('refetchEvents')
更新事件。
使用
- MSIE 11.0.41 (11.0.9600.18638) -- 出现问题
- FireFox 53.0(32 位)-- 没有出现问题
- Chrome 58.0.3029.81 (64-bit) -- 没有出现问题
- VS2015,本地主机上的 C# MVC,IIS Express
- fullcalendar.js v3.3.0
- jquery-3.1.1.js
- jquery-ui-1.12.1.js
症状描述:
使用以下 $.ajax
调用
将新事件插入 fullCalendar 时
$.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!');
}
}
});
当回调到来时,如果 debugger/developer window 打开,fullCalendar 的 'refetchEvents'
方法只会在 MSIE 11 中触发。是否设置了实际的断点并不重要,只有打开 debugger/developer window 才能使例程正常工作 ?
即使触发与 $.ajax
调用完全分开的 'refetchEvents'
也具有相同的行为。 IE。如果我触发如下函数:
<button type="button" class="btn" onclick="fetchEvents(); return false;">trigger</button>
具有功能:
function fetchEvents() {
$('#_Calendar').fullCalendar('refetchEvents');
}
效果完全一样,如果 debugger/developer window 打开,'refetchEvents' 只会在 MSIE 11 中触发?
我认为这可能是一个计时问题,因此我选择了手动触发选项,但行为是相同的,即使 'refetchEvents'
调用是在插入事件之后。即使页面刷新也不会触发 'refetchEvents'
事件的刷新只会触发 - 在 MSIE 11 中 - 当 debugger/developer window 打开时。
如前所述,任何平台(我测试过)上的其他浏览器都没有相同的结果吗?
(FireFox/Chrome/Safari/Android[Chrome & FireFox] 一切正常...)
有没有人遇到过这种行为and/or可能有解决方案?
非常感谢您的意见!
事实证明这确实是一个缓存问题,根据 Alex K. 的回答,IE 过于热衷于缓存日历事件并且不会更新事件。
解决方案
在较早的阶段,我偶然发现了 this question 和奇妙的答案。
稍后我也注意到 this question 有一个同样好的答案。 (一定要给他们点赞!)
我已将两者合并为一个属性,如下所示。
[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://whosebug.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 响应被适当地标记为正确的 headers,告诉浏览器不要缓存返回值。
像这样:
//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
问题已解决...
问题:
fullCalendar 在 AJAX 调用成功后不使用 .fullCalendar('refetchEvents')
更新事件。
使用
- MSIE 11.0.41 (11.0.9600.18638) -- 出现问题
- FireFox 53.0(32 位)-- 没有出现问题
- Chrome 58.0.3029.81 (64-bit) -- 没有出现问题
- VS2015,本地主机上的 C# MVC,IIS Express
- fullcalendar.js v3.3.0
- jquery-3.1.1.js
- jquery-ui-1.12.1.js
症状描述:
使用以下 $.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!');
}
}
});
当回调到来时,如果 debugger/developer window 打开,fullCalendar 的 'refetchEvents'
方法只会在 MSIE 11 中触发。是否设置了实际的断点并不重要,只有打开 debugger/developer window 才能使例程正常工作 ?
即使触发与 $.ajax
调用完全分开的 'refetchEvents'
也具有相同的行为。 IE。如果我触发如下函数:
<button type="button" class="btn" onclick="fetchEvents(); return false;">trigger</button>
具有功能:
function fetchEvents() {
$('#_Calendar').fullCalendar('refetchEvents');
}
效果完全一样,如果 debugger/developer window 打开,'refetchEvents' 只会在 MSIE 11 中触发?
我认为这可能是一个计时问题,因此我选择了手动触发选项,但行为是相同的,即使 'refetchEvents'
调用是在插入事件之后。即使页面刷新也不会触发 'refetchEvents'
事件的刷新只会触发 - 在 MSIE 11 中 - 当 debugger/developer window 打开时。
如前所述,任何平台(我测试过)上的其他浏览器都没有相同的结果吗? (FireFox/Chrome/Safari/Android[Chrome & FireFox] 一切正常...)
有没有人遇到过这种行为and/or可能有解决方案?
非常感谢您的意见!
事实证明这确实是一个缓存问题,根据 Alex K. 的回答,IE 过于热衷于缓存日历事件并且不会更新事件。
解决方案
在较早的阶段,我偶然发现了 this question 和奇妙的答案。 稍后我也注意到 this question 有一个同样好的答案。 (一定要给他们点赞!)
我已将两者合并为一个属性,如下所示。
[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://whosebug.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 响应被适当地标记为正确的 headers,告诉浏览器不要缓存返回值。
像这样:
//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
问题已解决...