6

注目に値する: 以下は、https を介してクロスドメインで行われています。正直なところ、IE10、Chrome、および FF ではすべて正常に動作するため、これが問題だとは思いません。私の推測では、それは IE8 の XDomainRequest オブジェクトの差異である可能性がありますか? よくわかりません。

以下の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;
    }

コンソールと Fiddler の両方で表示されるエラー ポーリングは実際に発生していますが、各ポーリングで同じエラーが発生し続けます。

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

…………

(これは、ポーリング時に何度も発生します。)

繰り返しになりますが、各リクエストが次々と発火していることがわかります。サーバーからの 200 のレスポンスはすべて、socket.io.js ファイルからの CONNECT_FAILED および JS エラーになります。

最後に、上記のコンソール スクリーン ショット (「f.parentNode が null またはオブジェクトではありません」) で見られるエラーで壊れている、クライアント上の socket.io.js ファイルのコードを次に示します。オブジェクトがnullであることは理解していますが、なぜそれがnullなのかはわかりません。

........

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!! ***
  });

.........
4

2 に答える 2

1

この回答によると、IE8がオブジェクトまたはの.addEventListener()メソッドをサポートしているとは思わない(または他のほとんどの場合、後で追加されたようです)。XMLHttpRequest()XDomainRequest()

コードのその部分を次のように書き直してみてください。

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

他の最新のブラウザーで同じ構文を維持したい場合は、条件でラップしてバックフィルできます。

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

問題が解決するかどうかはわかりませんが、役立つかもしれません。

MDN によると、「Firefox を含む最近のブラウザーは、ハンドラー関数に on* プロパティを設定するだけでなく、標準の addEventListener API を介して XMLHttpRequest イベントをリッスンすることもサポートしています。」. 繰り返しますが、どのブラウザがいつ、どのブラウザをサポートしているのかはわかりませんが、IE8 ではサポートされていないことがわかります。

于 2013-09-13T15:11:01.050 に答える
0

IE8以下ではattachEventを使用しています...しかし、XMLHttpRequestでは機能しません

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener#Compatibility

JS の問題について疑問がある場合は、まず MDN を停止してから、それ以外の場合:)

于 2013-09-17T22:00:43.843 に答える