1

Le problème:fullCalendar, IE 11, refetchEvents ne se déclenche que lorsque la fenêtre débogueur/développeur [F12] est ouvert

fullCalendar ne met pas à jour les événements à l'aide .fullCalendar('refetchEvents') après succesfull appel AJAX.


En utilisant

  • MSIE 11.0.41 (11.0.9600.18638) - problème se produit
  • FireFox 53,0 (32 bits) - problème ne se produit pas
  • Chrome 58.0.3029.81 (64 bits) - le problème ne se produit pas

  • VS2015, C# MVC sur localhost, IIS express
  • fullcalendar.js 3.3.0
  • jquery-3.1.1.js
  • jquery-ui-1.12.1.js

description des symptômes:

Lors de l'insertion d'un nouvel événement dans fullCalendar ci-dessous à l'aide $.ajax appel

$.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!'); 
       } 
      } 
     }); 

Lorsque le rappel vient, la méthode 'refetchEvents' de fullCalendar ne fera que le feu -dans MSIE 11- si la fenêtre débogueur/développeur est ouvert. Peu importe si un ensemble de points d'arrêt est défini, seul le débogueur/développeur ouvre la routine.

Même le déclenchement du 'refetchEvents' complètement séparé de l'appel $.ajax a le même comportement. C'EST À DIRE. si je déclenche une fonction comme ci-dessous:

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

avec fonction:

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

L'effet est exactement le même, les « refetchEvents » ne fera que le feu -dans MSIE 11- si le débogueur/développeur fenêtre est ouvert ? Je pensais que cela pourrait être un problème de synchronisation, d'où mon option de déclenchement manuel, mais le comportement est le même même si l'appel 'refetchEvents' est bien après l'événement a été inséré. Même l'actualisation de page ne déclenche pas le 'refetchEvents' l'actualisation des événements se déclenche uniquement dans MSIE 11 lorsque la fenêtre du débogueur/développeur est ouverte.

Comme indiqué, aucun autre navigateur sur une plate-forme (que j'ai testé) n'a le même résultat? (FireFox/Chrome/Safari/Android [Chrome & FireFox] tous fonctionnent parfaitement ...)

Quelqu'un at-il rencontré ce comportement et/ou potentiellement avoir une solution?

J'apprécierais votre contribution!

+0

Ce * * utilisé pour se produire à cause de cette : http://stackoverflow.com/questions/7742781/why-does-javascript-only-work-after-opening-developer-tools-in-ie-once mais cela ne devrait pas affecter IE11, voir le poste pour des suggestions liées à mise en cache –

+0

Bravo pour une réponse rapide, j'ai essayé l'option '$ .ajax ({cache: false, ...})' de votre message suggéré, mais pas de chance ... – mtholen

Répondre

1

Il s'avère en effet qu'il s'agit effectivement d'un problème de mise en cache, selon la réponse d'Alex K., où IE est trop enthousiaste pour mettre en cache les événements du calendrier et ne renouvelle pas les événements.


Solution

Dans un stade plus tôt, je suis tombé sur this question et une réponse fantastique. Un peu plus tard, j'ai également noté this question avec une réponse tout aussi bonne. (Assurez-vous de les augmenter!)

J'ai combiné les deux en un attribut comme ci-dessous.

[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); 
     } 
    } 

Ainsi, en décorant ma méthode GetDiaryEvents avec un attribut [NoCache], la réponse JSON est appropriée taggés avec les en-têtes corrects, indiquant le navigateur de ne pas mettre en cache les valeurs renvoyées.

Comme si:

//GET: All Diary events 
    [NoCache] 
    public JsonResult GetDiaryEvents(string start, string end) 
     { 

     // code code code... 

     var rows = eventList.ToArray(); 
     return Json(rows, JsonRequestBehavior.AllowGet); 

     } 

Et le message JSON est envoyé au navigateur comme:

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 
problème résolu ...