【问题标题】:websockets do not work when assigned to global var分配给全局变量时,websockets 不起作用
【发布时间】:2013-11-03 03:26:15
【问题描述】:

我使用 websockets 以及 javascript 和 html5

我有以下代码。

    <input type="text" onFocus=" so = new websocket('ws://localhost:1234');" onBlur="so.close();" onKeyUp="keyup();" >

    <script type='text/javascript'>
    var so; //this is global...

//wait a little (user stops typing)    
   function keyup(){
if (timeout) {clearTimeout(timeout);}    
    timeout = setTimeout(lookup, 250);
}



    function lookup(){
      //it's global, so use it right away
      so.onopen = function(){
      //send data to server to get responce...

因此,如果用户单击/不单击文本字段,则 websocket 将打开/关闭。用户在文本字段上键入内容。 textfield 的值被发送到服务器,执行查询,如果有匹配的结果,它们就会呈现在用户的屏幕上。

如果我单击控制台中“已连接”中看到的文本字段,如果单击其他任何软件,我会看到“正常关闭”,这是我应该看到的。没关系。

但是当我在文本字段中输入字母,将数据发送到服务器时,什么都没有发送。我在控制台中什么也看不到。我没有看到任何错误。

我错过了什么?就像so.onopen 永远不会被执行。

有什么建议吗?

提前致谢

【问题讨论】:

    标签: javascript html node.js websocket


    【解决方案1】:

    问题是您重新创建了套接字,但没有绑定 onopen 事件处理程序。

    在焦点上,你应该调用一个函数来做这两个:创建 websocket 并绑定 onopen 事件处理程序:

    <input id=someid type="text" onBlur="so.close();" >
    
    <script type='text/javascript'>
    var so, field = document.getElementById('someid');
    field.onfocus = function(){
        so = new websocket('ws://localhost:1234');
        so.onopen = function(){
             // do things
        }
    }
    

    【讨论】:

    • 谢谢,但是onopen 必须在另一个函数中,我无法更改代码的结构。奇怪的是,即使我只是将var so = new WebSocket("ws://localhost:8000"); 设置为全局在javascript 的开头然后so.ononpen 在函数中,仍然没有执行。我不明白...
    • 没什么奇怪的。您将 onopen 绑定在不同的套接字上,因为您不确保指令的顺序。您必须更改代码的结构。顺便说一句,请注意我如何通过删除内联的 JavaScript 来灌输一些理智。
    • 我刚刚编辑了我的问题。对此感到抱歉。希望你能更好地理解我的问题。我做了field.onfocus = function(){ function keyup(){... 并得到keyup function is not defined 错误。
    • @slevin so.onopen 将被执行一次。如果,看起来很可能,你在它被执行之前不费心去设置它,你就错过了它。您必须在创建套接字后立即绑定 onopen,否则您可能会错过它并且它不会执行。
    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多