我有一个文本框,用户可以在其中输入字母。如果数据库中存在相对单词,则它们会显示在文本框下方的dropdown
中。
要搜索数据库并带回结果,我使用websockets(nodejs 0.10.12和javascript)
所以代码是这样的
//something is typed , so call the function, to send data and make query
<input id="typename" type="text" onKeyUp="lookup();" >
//this is where I send data and get back results
function lookup(){
var so=new WebSocket("ws://localhost:1234");
so.onerror=function (evt) {alert('Error');}
so.onopen=function(){
so.send(document.getElementById("typename").value)
}
so.onmessage = function (evt) {
var received_msg = evt.data;
var packet = JSON.parse(received_msg);
so.close();
//feed results to dropdown.....
}
}
这会转换为用户类型打开和关闭的多个连接。
即使用户从下拉列表中选择了某些内容,连接仍然在后台打开和关闭。因为如果我输入例如4个字母,则打开/关闭将为4.
如果我马上选择我想要的,背景中仍然有2或3个连接,打开和关闭。他们仍然提供结果。这意味着,实际上,不要让我选择我想要的东西。我必须一遍又一遍地挑选它。 (Dropdown闪烁)如果我编辑它并想将它保存回db,我不能,因为仍有连接正在运行,所以我无法打开一个新的来保存它。代码等待......
我该怎么做
<select id="listout" size="5" onChange="so.close();" > </select>
停止在后台运行的连接?以上不起作用。即使我将so
设置为全局或非全局。不起作用,因为我可以看到多个连接同时打开,但没有关闭。我必须刷新页面才能全部关闭。
有任何建议吗?
如果在下拉列表中更改了某些内容(=用户选择了某些内容),如何关闭所有连接?
提前致谢
PS我为这个巨大的介绍道歉。思想将帮助您更好地理解问题,或提供替代方案
答案 0 :(得分:0)
要关闭已打开的连接,您需要在创建它们时保存指针, 例如:
//global variable for store opened connections
var aPoolWSConections = []
function lookup(){
var so=new WebSocket("ws://localhost:1234");
//
// your code here
//
// at the end
aPoolWSConections.push(so);
}
实现一个关闭连接的功能。
function closePoolWSConections(){
var iSo = aPoolWSConections.length;
while(iSo--){
aPoolWSConections[iSo].close();
}
aPoolWSConections = [];
}
在必要的时间内调用一个函数。
<select id="listout" size="5" onChange="closePoolWSConections();" > </select>
但是我不建议你为你的应用程序打开很多连接就足够了一个websocket连接。
//Create one global WS connection
var so = new WebSocket("ws://localhost:1234");
so.onmessage = function (evt) {
var received_msg = evt.data;
var packet = JSON.parse(received_msg);
//feed results to dropdown.....
}
function lookup(){
//maybe should check if it still open
so.send(document.getElementById("typename").value);
}
//and you can use something like
<select id="listout" size="5" onChange="so.close();" > </select>