2017-02-16 4 views
2

Selon Can I use?, les navigateurs Edge IE MS & ne prennent pas en charge Server-sent Events.Cross browser Événements envoyés par le serveur, ou alternative, y compris les navigateurs Microsoft

Y a-t-il une solution de contournement?

Ou une alternative de navigateur complètement croisée qui est aussi simple (ce qui websockets ne semble pas être (et, en tout cas, je préfère m'en tenir à HTTP et ne pas avoir plusieurs protocoles simultanés compliquant les choses))?

Je souhaite que les clients AngularJs puissent s'abonner & désabonnement des données JSON poussées du serveur PHP, plusieurs clients pouvant s'abonner aux mêmes données et une seule action serveur étant nécessaire pour le pousser, de préférence sans savoir à qui pousse-le.

Répondre

4

L'entêtement de Microsoft par rapport à SSE est assez incroyable, d'autant plus que sa mise en œuvre est juste une couche sur XMLHttpRequest2, la norme est courte, il y a eu un merveilleux livre O'Reilly à ce sujet depuis 3 ans, et il y a au moins deux implémentations open source pour s'inspirer.

Quoi qu'il en soit, la technique recommandée pour obtenir la compatibilité de retour à IE8 est de créer une iframe cachée, puis garder polling sa source intérieure, et il suffit de retourner tout ce qui est nouveau là:

iframe = document.createElement("iframe"); 
iframe.setAttribute("style", "display: none;"); 
iframe.setAttribute("src", "abc_stream.php"); 
document.body.appendChild(iframe); 

Si vous avez seulement besoin pour soutenir revenir à IE10, vous pouvez utiliser un objet XMLHttpRequest2, et d'écouter les readyState==3 messages:

xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(){ 
    //Read this.responseText from the previous offset onwards 
    }; 
var u = url; 
u += "xhr=1&t=" + (new Date().getTime()); 
xhr.open("GET", u); 

Ces techniques ont besoin que très peu de soutien à l'arrière-plan: si un client se connecte avec un réel ESS, vous Ha Pour définir le type MIME comme text/event-stream, mais si vous utilisez le hack xhr, vous devez le définir comme text/plain. Je l'ai ajouter xhr=1 à l'URL, comme indiqué ci-dessus (et l'horodatage pour l'empêcher d'être mis en cache).

La technique xhr fonctionnera sur tous les navigateurs où SSE fonctionne, si vous vouliez opter pour une solution unique. C'est un inconvénient, c'est que les données complètes envoyées sont en train de s'accumuler en mémoire. (Ma suggestion est de reconnexion automatique chaque fois que le responseText est plus 64Ko, ou quelque chose comme ça.)

2

Il y a quelques EventSource polyfills pour MSIE:

https://github.com/remy/polyfills/blob/master/EventSource.js

https://github.com/amvtek/EventSource

One d'entre eux (ne me souviens pas lequel) affiche un message d'alerte ennuyeux périodiquement, de sorte que vous devrez probablement modifier le code et les supprimer.

Vous trouverez ici un exemple d'utilisation:

https://github.com/mariomac/jeasse/blob/master/examples/chat-servlet3/src/main/resources/static/index.html