Javascript WebSocket在代码中返回未定义,但在控制台中不返回

Javascript WebSocket在代码中返回未定义,但在控制台中不返回,javascript,websocket,Javascript,Websocket,我正在努力理解这里发生了什么 我在192.168.1.64:81上有一个websocket服务器 我需要使用以下javascript从网页向套接字发送数据: window.onload = function() { var connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']); connection.onopen = function() { connection.send

我正在努力理解这里发生了什么

我在192.168.1.64:81上有一个websocket服务器

我需要使用以下javascript从网页向套接字发送数据:

window.onload = function() {
    var connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);
    connection.onopen = function() {
        connection.send('Connect ' + new Date());
    };
    connection.onerror = function(error) {
        console.log('WebSocket Error ', error);
    };
    connection.onmessage = function(e) {
        console.log('Server: ', e.data);
    };

    function sendData() {
        var data="#"+joystick.deltaX()+","+joystick.deltaY();
        connection.send(data);
    }};
现在是这样的:如果我打开js控制台(在firefox中),我会看到“连接未定义”错误。。。但如果我将粘贴复制到控制台,则行:

    var connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);
套接字被正确定义,更新程序开始通过套接字正确地流式传输数据

我错过了什么?
我应该知道一些众所周知的问题吗?

以下函数使用了
连接变量,但该变量超出了范围,因为
连接
是使用
var
(本地)关键字定义的:

将`连接定义为全局值:

connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);
或使用内部绑定/引用:

connection.onopen = function(e) {
    e.target.send('Connect ' + new Date());
};
sendData = function() {
    var data="#"+joystick.deltaX()+","+joystick.deltaY();
    this.send(data);
}.bind(connection);
否则,将连接初始化为全局连接并按如下方式分配onload:

    var connection;
window.onload = function() {
        connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);
        connection.onopen = function() {
            connection.send('Connect ' + new Date());
        };
        connection.onerror = function(error) {
            console.log('WebSocket Error ', error);
        };
        connection.onmessage = function(e) {
            console.log('Server: ', e.data);
};};

我以前尝试过第一个选项,但看起来服务器不喜欢同时加载html和在端口81上接收数据。我现在试图定义“var连接;”作为一个全局变量,然后定义.onload何时完成!现在就开始测试!如果您的服务器不允许并发连接,这将是一个更大的问题,因为WebSockets连接将阻塞设备。考虑为ARDUINO使用一个Evserver服务器库。也许会在嵌入式设备上工作(我有偏见),或者(如果在服务器上使用JavaScript)考虑No.js.OnPoad技巧对我来说很好,但我想你所说的是正确的。这只是一个放错位置的变量init,.onload的想法很好!谢谢
    var connection;
window.onload = function() {
        connection = new WebSocket("ws://"+location.hostname+":81", ['arduino']);
        connection.onopen = function() {
            connection.send('Connect ' + new Date());
        };
        connection.onerror = function(error) {
            console.log('WebSocket Error ', error);
        };
        connection.onmessage = function(e) {
            console.log('Server: ', e.data);
};};