Socket.io IE7-9 JSONP轮询错误

时间:2014-01-17 14:33:29

标签: javascript internet-explorer-8 internet-explorer-7 internet-explorer-9 socket.io

我们昨天花了很多时间试图解决这个问题。所以,作为最后的努力,我在这里发帖。

我们的设置是Node.js / Express后端。使用Socket.io与express表示同一端口。

app.io = io.listen(server);

app.io.set('origin', '*');
app.io.set('log level', '2');
app.io.enable('browser client minification');
app.io.set('transports', [
    'websocket',
    'flashsocket',
    'htmlfile',
    'xhr-polling',
    'jsonp-polling'
]);

我已明确启用了所有传输。我们希望jsonp或flash套接字在我们最不喜欢的浏览器上播放得很好......

但是,我想有一个原因是他们是我们最不喜欢的。 ; - )

客户端我们有一个带socket.io的Angularjs应用程序。非常宽松地基于this tutorial

window.WEB_SOCKET_SWF_LOCATION = 'https://api.ourdomain.com/socket.io/static/flashsocket/WebSocketMain.swf';
var socket = io.connect('https://api.ourdomain.com', {
    'reconnect' : true,
    'reconnection delay' : 1500
});

我们尝试添加SWF位置,如here所示,以使闪存套件正常工作。它正在提供政策并获取文件..所以没有运气。

无论如何在ie7-9上尝试通过jsonp轮询进行连接时,我们会收到此错误:

Object doesn't support this property or method

jsonp消息的内容将是这样的: io.j[1]("1::");

偶尔会有更多内容。

io.j似乎被设置为主socket.io.js文件中的数组。

当我将它放在开发人员工具控制台中时,它会抛出相同的错误。

我已尝试在脚本之前移动所有元标记,如建议here。这并没有改变任何事情。

XHR-polling似乎也不起作用。我们已经看到一些关于更改设置的帖子..但显然我们不能要求我们的客户去请求他们的IT部门更改他们的浏览器设置只是为了访问我们的网站。所以我们放弃了这种方法。

还尝试创建一个空白页面,并连接..这是有效的。那会是什么干扰?

希望你们有事吗?

1 个答案:

答案 0 :(得分:0)

我们无法通过简单地使Socket.io工作来解决这个问题。我不知道这是否是一个Socket.io问题,或者这是Angularjs和Socket.io的组合。

然而,我们通过添加自己的后备来解决此问题。在我们的Socket.io服务中,我们检查ie9 +以及webkit和firefox浏览器中是否存在功能。

var use_socketIO = true;

/*
    I'd like to detect websocket, or jsonp.  
    But those transport methods themselves work.  
    Just not reliably enough to actually use
*/

if (typeof(window.atob) === 'undefined') {
    console.log('browser appears to be < ie10.');
    use_socketIO = false;
}

if (use_socketIO) {
    var socket = io.connect('https://api.ourdomain.com', {
        'reconnect' : true,
        'reconnection delay' : 1500
    });
}

// Fall back http method.
function httpReq(method, url, data) {
    var defer = $q.defer();

    $http({
        method: method, 
        url: '//www.domain.com/api'+url, 
        data: data
    }).success(function (data, status, headers, config) {
        defer.resolve(data)
    });

    return defer.promise;
}

// Socket.io method.
function socketReq(method, url, data) {
    var defer = $q.defer();

    socket.emit(method, {url: url, data: data}, function (response) {
        try {
            var data = JSON.parse(response);

            defer.resolve(data);
        } catch (e) {
            $log.error('Failed to parse JSON');
            $log.info(response);
            defer.reject(e);
        }

    });

    return defer.promise;
}

// Main Request method
function request(method, url, data) {

    if (use_socketIO) {
        return socketReq(method, url, data || {});
    } else {
        return httpReq(method, url, data || {});
    }
}

然后我们只需调用request('get','/ url');

服务器端我们做了一些魔法来构建一个req和res对象,如果它的Socket.io然后转发它来表达处理,否则表达就像正常一样处理它。

相关问题