1

Das Problem:fullCalendar, IE 11, refetchEvents nur ausgelöst, wenn Debugger/Entwickler Fenster [F12] geöffnet ist

fullCalendar keine Ereignisse aktualisieren .fullCalendar('refetchEvents') nach succesfull AJAX-Aufruf.


Mit

  • MSIE 11.0.41 (11.0.9600.18638) - Problem tritt
  • FireFox 53,0 (32-bit) - Problem tritt nicht
  • Chrome 58.0.3029.81 (64-Bit) - Problem tritt nicht auf

  • VS2015, C# MVC auf localhost, IIS Express
  • fullcalendar.js v3.3.0
  • jquery-3.1.1.js
  • jquery-ui-1.12.1.js

Beschreibung der Symptome:

Wenn unter Verwendung von unten $.ajax Aufruf ein neues Ereignis in fullCalendar Einfügen

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

Wenn der Rückruf kommt, die 'refetchEvents' Methode der fullCalendar wird nur Feuer -in MSIE 11- wenn die Debugger/Entwickler-Fenster geöffnet ist. Es spielt keine Rolle, ob es einen tatsächlichen Haltepunkt gibt, nur wenn das Debugger/Entwickler-Fenster geöffnet ist, macht die Routine funktioniert?

Auch das Auslösen der 'refetchEvents' vollständig getrennt von der $.ajax Aufruf hat das gleiche Verhalten. I.E. wenn ich lösen eine Funktion wie folgt:

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

mit Funktion:

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

Der Effekt ist genau das gleiche, die ‚refetchEvents‘ wird nur Feuer -in MSIE 11- wenn der Debugger/Entwickler Fenster ist offen ?

Ich dachte, es könnte ein Timing-Problem sein, daher meine manuelle Trigger-Option, aber das Verhalten ist das gleiche, obwohl die 'refetchEvents' Aufruf ist weit nach dem Ereignis eingefügt wurde. Selbst die Seitenaktualisierung löst nicht die 'refetchEvents' Aktualisierung der Ereignisse aus, die nur in MSIE 11 ausgelöst wird, wenn das Debugger-/Entwicklerfenster geöffnet ist.

Wie angegeben, hat kein anderer Browser auf irgendeiner Plattform (die ich getestet habe) das gleiche Ergebnis? (FireFox/Chrome/Safari/Android [Chrome & FireFox] alle funktionieren einwandfrei ...)

Hat jemand auf dieses Verhalten gestoßen und/oder möglicherweise eine Lösung?

Ich würde mich über Ihre Eingabe freuen!

+0

Dieses * gebraucht * wegen dies geschehen : http://stackoverflow.com/questions/7742781/why-does-javascript-only-work-after-opening-developer-tools-in-ie-once, aber das sollte IE11 nicht beeinflussen, siehe den Beitrag für Vorschläge im Zusammenhang mit Zwischenspeichern. –

+0

Prost für schnelle Antwort, ich habe versucht, die '$ .ajax ({cache: false, ...}) 'Option von Ihrem vorgeschlagenen Beitrag, aber kein Glück ... – mtholen

Antwort

1

Wie sich herausstellt, ist es in der Tat ein Caching-Problem, wie in Alex K.'s Antwort, wo IE die Ereignisse für den Kalender zu enthusiastisch speichert und die Ereignisse nicht erneuert.


Lösung

In einer früheren Phase I über this question und fantastische Antwort gestolpert. Etwas später habe ich auch this question mit einer ebenso guten Antwort notiert. (Stellen Sie sicher, sie zu aktualisieren!)

Ich habe die beiden zusammen in einem Attribut wie folgt kombiniert.

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

Also, durch die Dekoration meine GetDiaryEvents Methode mit einem [NoCache] Attribut wird die JSON-Antwort in geeigneter Weise mit der richtigen Header markiert, den Browser nicht zu sagen die zurückgegebenen Werte zwischenzuspeichern.

Wie so:

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

     // code code code... 

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

     } 

Und so wird die JSON-Nachricht an den Browser gesendet als:

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 

Problem gelöst ...

Verwandte Themen