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!! ***
});
.........
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. –
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
Unterstützt IE8 '.addEventListener()' Ich weiß Opera nicht oder nicht gewohnt, Sie mussten das tatsächliche Ereignis verwenden. d. h. '.onload()' –