2013-09-05 4 views
6

Beachtenswert: das folgende wird Cross-Domain über https getan. Ich glaube ehrlich gesagt nicht, dass dies das Problem ist, da alles in IE10, Chrome und FF funktioniert. Meine Vermutung ist, dass es eine XDomainRequest-Objektvarianz in IE8 sein kann? Nicht sicher, obwohl.Socket.IO und IE8 - jsonp-polling-Verbindungen immer fehlgeschlagen

Die folgende Methode sendLoginRequest ist die zuerst genannte Methode. Der gesamte andere unterstützende Code wird ebenfalls unten bereitgestellt.

Dies ist alles sehr einfach, aber nicht sicher, warum IE8 fehlschlägt, wie es tut.

function WrappedSocket(data, session_string) { 
    var clientSocket = io.connect('https://xxxxxxxx/socketio', { query: "session=" +  encodeURIComponent(session_string), transports: ['jsonp-polling'] }); 
    clientSocket.socket.on("connect", function() { console.log("CONNECT_SUCCEED"); }); 
    clientSocket.socket.on("connect_failed", function() { console.log("CONNECT_FAILED"); }); 
    clientSocket.socket.on("reconnect_failed", function() { console.log("RECONNECT_FAILED"); }); 
    clientSocket.socket.on("error", function (eobj) { console.log("Socket error " + eobj); }); 
    console.log("Made a socket that is talking"); 
} 

var my_socket; 


function set_up_socket(data, sessionString) { 
    setSession(data.responseText); 
    my_socket = new WrappedSocket(data, sessionString); 
    my_socket.socket.emit("message", "Howdy!"); 
} 

function sendLoginRequest(loginCode, nextRequest) { 
    var xhr = createCORSRequest('POST', 'https://xxxxx/login', false); 
    var sessionString = 'xxxx'; 

    if ("withCredentials" in xhr) { 
     xhr.addEventListener("load", function() { 
      set_up_socket(this, sessionString); 
     }, false); 
    } 
    else { 
     xhr.onload = function() { 
      set_up_socket(this, sessionString); 
     }; 
    } 

    xhr.send(); 
    } 

function createCORSRequest(method, url, onload) { 
    xhrObj = new XMLHttpRequest(); 
    if ("withCredentials" in xhrObj) { 
     // Check if the XMLHttpRequest object has a "withCredentials" property. 
     // "withCredentials" only exists on XMLHTTPRequest2 objects. 
     if (onload) { 
      xhrObj.addEventListener("load", onload, false); 
     } 
     xhrObj.open(method, url, true); 
     xhrObj.withCredentials = true; 
    } else if (typeof XDomainRequest != "undefined") { 
     // Otherwise, check if XDomainRequest. 
     // XDomainRequest only exists in IE, and is IE's way of making CORS requests. 

     xhrObj = new XDomainRequest(); 
     xhrObj.open(method, url); 
     if (onload) { 
      xhrObj.onload = onload; 
     } 
    } else { 
     // Otherwise, CORS is not supported by the browser. 
     xhrObj = null; 
    } 
    return xhrObj; 
    } 

Fehler ich in beide Konsole sehe und Fiddler Polling ist in der Tat vorkommen, aber die gleichen Ausfälle halten an jeder Umfrage auftreten:

LOG:CONNECT_FAILED 
'f.parentNode' is null or not an object 
'f.parentNode' is null or not an object 
LOG:CONNECT_FAILED 
'f.parentNode' is null or not an object 
'f.parentNode' is null or not an object 
LOG:CONNECT_FAILED 
'f.parentNode' is null or not an object 
'f.parentNode' is null or not an object 
LOG:CONNECT_FAILED 
'f.parentNode' is null or not an object 
'f.parentNode' is null or not an object 
LOG:CONNECT_FAILED 
'f.parentNode' is null or not an object 
'f.parentNode' is null or not an object 
LOG:CONNECT_FAILED 
'f.parentNode' is null or not an object 
'f.parentNode' is null or not an object 

........ ....

(Sie bekommen die Idee, dies geschieht immer und immer wieder, wie es Umfragen.)

Auch hier können Sie jede Anfrage f sehen Wenn Sie nacheinander alle 200 Antworten vom Server durchlaufen, werden alle Fehler in CONNECT_FAILED und JS aus der Datei socket.io.js verursacht.

Schließlich ist hier der Code aus der Datei socket.io.js auf dem Client, der mit den oben in der Konsole angezeigten Screenshots bricht ("f.parentNode ist null oder kein Objekt"). Ich verstehe, dass das Objekt null ist, was ich nicht verstehe, ist WARUM es null ist.

........ 

if (this.isXDomain() && !io.util.ua.hasCORS) { 
    var insertAt = document.getElementsByTagName('script')[0] 
    , script = document.createElement('script'); 

    script.src = url + '&jsonp=' + io.j.length; 
    insertAt.parentNode.insertBefore(script, insertAt); 

    io.j.push(function (data) { 
     complete(data); 
     script.parentNode.removeChild(script); // *** BREAKS HERE!! *** 
    }); 

......... 
+0

Es scheint, dass der Anfang meiner Ausgabe abgeschnitten wurde. Es gab eine gute Beschreibung des Problems. Im Wesentlichen macht der von mir bereitgestellte Code eine einfache socket.io-Verbindung mit jsonp-polling. IE8 es funktioniert nicht mit allen Details, die ich bereits oben beschrieben habe. Danke fürs schauen. –

+0

Hast du es auch im IE 9 versucht? Wenn ja, antworte bitte auch mit HTML-Codes, mit Kopfzeilen, Doctype, allen Parts, bis mit body open-Tag. und dann können Sie den tatsächlichen Inhalt ändern. Wenn Sie eine Geige schaffen können, die großartig ist. – MarmiK

+0

Unterstützt IE8 '.addEventListener()' Ich weiß Opera nicht oder nicht gewohnt, Sie mussten das tatsächliche Ereignis verwenden. d. h. '.onload()' –

Antwort

1

Per this answer, ich glaube nicht, IE8 die .addEventListener() Methode zur XMLHttpRequest() Objekt oder die XDomainRequest() unterstützt (oder die meisten anderen, es erscheint später wurde hinzugefügt zu haben).

Versuchen Sie diesen Teil des Codes umgeschrieben zu:

xhr.onload=function() { 
     set_up_socket(this, sessionString); 
    }; 

Wenn Sie die gleiche Syntax für anderen modernen Browser halten möchten, können Sie durch das Einwickeln in einem bedingten füllen zurück:

if(typeof xhr.addEventListener === undefined) 
{ 
    xhr.onload=function() { 
     set_up_socket(this, sessionString); 
    }; 
} 

Weiß nicht, ob es das Problem löst, kann aber helfen.

MDN sagt "More recent browsers, including Firefox, also support listening to the XMLHttpRequest events via standard addEventListener APIs in addition to setting on* properties to a handler function.". Auch hier bin ich mir nicht sicher, weil sie nicht sagen, welche Browser und wann, aber am besten kann ich sagen, dass IE8 es nicht unterstützt.