从 websocket 检索到的触发 javascript

Posted

技术标签:

【中文标题】从 websocket 检索到的触发 javascript【英文标题】:Fire javascript retrieved from a websocket 【发布时间】:2011-04-28 14:57:59 【问题描述】:

我现在正在玩 WebSockets,我希望有以下设计模式。

连接到我在服务器上的 websocket,服务器向浏览器发送 javascript 以告知它如何与用户交互。我找到了 JQuery 方法 getScript,它在后台加载一个脚本,并在加载时执行它。我想做类似的事情,但是在从 Websocket 收到的消息上。

所以,基本上,我想做的是……

// Create a socket
var socket = new WebSocket('myURL')

// Message received on the socket
socket.onmessage = function(event) 
    executeJS(event.data);
 

我需要用什么代码替换 executeJS 才能触发这个 javascript?有可能吗?

我想这个问题与javascript没有直接关系,但是我如何获取一段文本并将其作为Javascript执行。

【问题讨论】:

【参考方案1】:

由于您使用的是 jQuery,因此您可以使用 jQuery.globalEval。或者,您可以使用eval,但globalEval 在其运行的上下文方面具有一些优势。

【讨论】:

【参考方案2】:

您要查找的函数是eval()

请不要忘记它听起来像 evil 是有原因的 ;)

【讨论】:

在某些情况下eval 并不邪恶。请注意,不是很多。 :-) 但是在这种情况下,从您自己的服务器上运行脚本代码,它与使用 script 元素并没有根本的不同。 (范围问题除外。) 确实如此,但根据脚本的作用,最好只发送 JSON 然后对其进行处理。【参考方案3】:

eval 函数在 local 范围 中评估代码,对于那些应该在 global 范围 中评估的代码,使用 indirect eval,这是最好的方法调用间接评估是:

(1, eval)(yourCode);

还有其他一些动态执行代码的选择:

使用动态脚本元素也是一个不错的选择:

var script = document.createElement('script');

// detect browser or feature first, only one of these should be used
// for IE
script.text = yourCode;
// for other browser
script.appendChild(document.createTextNode(yourCode));

var head = document.head || document.getElementsByTagName('head')[0];
head.insertBefore(head, head.lastChild);

【讨论】:

【参考方案4】:

虽然它的使用通常不受欢迎,但 eval() 函数在这里可以满足您的需求,具体取决于返回代码的复杂性。

【讨论】:

【参考方案5】:

您正在寻找eval 函数:http://www.w3schools.com/jsref/jsref_eval.asp 但要小心,这意味着可以执行潜在不安全的 JavaScript 代码。

【讨论】:

以上是关于从 websocket 检索到的触发 javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 websocket 从 Thingsboard 检索所有客户设备的遥测数据

从 rails runner 内部触发/订阅 websocket-rails 事件

如何检索 websocket 连接列表?

在加载数据之前触发mounted方法 - VueJS

Javascript ajax 仅在需要时刷新

从数据库中检索到的文档的 BSON 对象大小