2013-09-05 4 views
6

विफल होने की संभावना: https के माध्यम से निम्नलिखित डोमेन पार किया जा रहा है। मैं ईमानदारी से नहीं सोचता कि यह मुद्दा है क्योंकि आईई 10, क्रोम और एफएफ में सब ठीक काम करता है। मेरा अनुमान है कि यह IE8 में XDomainRequest ऑब्जेक्ट भिन्नता हो सकता है? हालांकि यकीन नहीं है।सॉकेट.आईओ और आईई 8 - जेसनपी-मतदान कनेक्शन हमेशा

sendLoginRequest विधि नीचे दी गई विधि है। अन्य सभी सहायक कोड भी नीचे प्रदान किए जाते हैं।

यह सब बहुत आसान है, लेकिन यह सुनिश्चित नहीं है कि IE8 ऐसा क्यों विफल रहता है।

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

त्रुटियाँ मैं दोनों कंसोल में देख रहा हूँ और फ़िडलर मतदान तथ्य होने वाली है, लेकिन एक ही विफलताओं रखने प्रत्येक पोल पर होते हैं:

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 

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

फिर (आप अंदाजा हो, इस अधिक से अधिक यह चुनाव के रूप में होता है।)

, आप प्रत्येक अनुरोध च देख सकते हैं एक के बाद एक के माध्यम से iring, सर्वर से सभी 200 प्रतिक्रियाओं, लेकिन सभी परिणाम conNECT_FAILED और जेएस त्रुटियों socket.io.js फ़ाइल से।

आखिरकार, क्लाइंट पर socket.io.js फ़ाइल से कोड है जो कंसोल स्क्रीन शॉट में ऊपर देखी गई त्रुटियों को तोड़ रहा है ("f.parentNode शून्य या ऑब्जेक्ट नहीं है")। मैं समझता हूं कि ऑब्जेक्ट शून्य है, जो मुझे नहीं मिलता है वह क्यों शून्य है।

........ 

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

यह ऐसा लगता है कि मेरी समस्या की शुरुआत कटऑफ थी। इस मुद्दे का एक अच्छा विवरण था। अनिवार्य रूप से जो कोड मैंने प्रदान किया है वह एक साधारण सॉकेट है। जेएसपीपी-मतदान का उपयोग करके कनेक्ट है। आईई 8 यह उन सभी विवरणों के साथ काम नहीं कर रहा है जिन्हें मैंने पहले ही वर्णित किया है। तलाश के लिए धन्यवाद। –

+0

क्या आपने आईई 9 में भी कोशिश की है? यदि हां कृपया एचटीएमएल कोड के साथ भी जवाब दें, हेडर, डॉक्ट टाइप, सभी हिस्सों, शरीर के खुले टैग के साथ। और फिर आप वास्तविक सामग्री बदल सकते हैं। यदि आप एक पहेली बना सकते हैं जो बहुत अच्छा होगा। – MarmiK

+0

आईई 8 का समर्थन करता है '.addEventListener() 'मुझे पता है कि ओपेरा का उपयोग नहीं किया गया है या नहीं किया गया है, आपको वास्तविक घटना का उपयोग करना था। i.e. '.load()' –

उत्तर

1

प्रति this answer के रूप में, मैं नहीं मानता कि IE8 या XMLHttpRequest() वस्तु के लिए .addEventListener() विधि XDomainRequest() का समर्थन करता है (या सबसे अन्य लोगों, यह बाद में जोड़ दिया गया है प्रतीत होता है)।

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

आप अन्य आधुनिक ब्राउज़रों के लिए एक ही वाक्य रचना रखना चाहते हैं, तो आप को भरने के वापस कर सकता है एक सशर्त में यह लपेटकर द्वारा:

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

करने के लिए अपने कोड के उस भाग को फिर से लिखने की कोशिश करो

पता नहीं है कि यह समस्या का समाधान करेगा, लेकिन मदद कर सकता है।

एमडीएन "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." कहता है। दोबारा, मुझे यकीन नहीं है क्योंकि वे नहीं कहेंगे कि कौन से ब्राउज़र, और कब, लेकिन सबसे अच्छा मैं यह बता सकता हूं कि आईई 8 इसका समर्थन नहीं करता है।