Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在我的命名空间中使用socket.io_Javascript_Jquery_Ruby On Rails_Socket.io - Fatal编程技术网

Javascript 在我的命名空间中使用socket.io

Javascript 在我的命名空间中使用socket.io,javascript,jquery,ruby-on-rails,socket.io,Javascript,Jquery,Ruby On Rails,Socket.io,我将socket.io作为代码的一部分提供给第三方网站使用。我不希望它污染全局名称空间(例如,不同版本的io会发生冲突),而是希望它仅作为我的库的一部分工作,因此它将被命名并仅从 MyLibrary.io 如何进行此操作?建议的方法()是按照正常方式加载,然后运行以下两行: MyLibrary.io = window.io; // Assign it to your desired namespace delete window.io; // Remove it from the window

我将socket.io作为代码的一部分提供给第三方网站使用。我不希望它污染全局名称空间(例如,不同版本的io会发生冲突),而是希望它仅作为我的库的一部分工作,因此它将被命名并仅从

MyLibrary.io


如何进行此操作?

建议的方法()是按照正常方式加载,然后运行以下两行:

MyLibrary.io = window.io; // Assign it to your desired namespace
delete window.io; // Remove it from the window namespace
socket.io.js
中的代码只将
io
变量添加到
窗口中

您可以在
socket.io.js
中修改代码,但这可能会使以后的维护变得困难,因为您必须跟踪对该文件所做的更改,并将其传播到较新版本的
socket.io.js


起初,我认为您可以使用
module.exports
,因为它有格式,但是,在阅读代码后,我意识到这只是构建
socket.io.js
文件之前的组织方式。请参阅以了解我所指的内容。

由于您对该文件拥有完全的控制权,因此最简单的方法是修改该文件以在新位置加载socket.io

我想说的最简单的方法是用

(function() {
  // All Standard SocketIO code

}).call(MyLibrary);
这将使文件加载到
io
MyLibrary
上。与许多库一样,SocketIO使用
this
来决定如何加载内容。在浏览器环境中,
是对象
窗口
,但通过围绕所有对象包装函数,您可以控制
,并使用方法
调用
将其更改为您自己的值

许多其他库(虽然不是socketIO)都有一个助手来避免这个问题。它们通常有一个名为
noConflict()
的方法。例如,如果希望避免jQuery出现这样的问题,可以执行以下操作:

MyLibrary.$ = MyLibrary.jQuery = jQuery.noConflict(true);

这是因为当jQuery加载时,它会保存对先前加载版本的引用,这样,如果需要,它可以将全局对象设置回原来的状态。

您可以控制如何加载这些对象吗?如果您正在将Socket.io与代码一起提供,那么为什么不更改它使用的变量以避免冲突?我想您帮助我解决了这个问题。将此作为答案发布,并获得一些分数。我在脚本的第一部分使用了MyLib.prototype.io={},然后是MyLib.prototype.io(有时需要MyLib.prototype.io.Transport)。我补充了我的答案。如果您有任何问题,请告诉我。这种方式意味着,当我加载我的socket.io版本时,要么我会使网站的版本过载,要么(更糟的是)他会使我的版本过载,并且无论哪种方式,我都会删除他使用的版本。我刚刚用MyLib.prototype.io={}更改了socket.io的源代码,正如我在上面所写的是的,这是另一种方式。但是我试图避免修改这个文件,那么JSONP“io.j”回调呢?这不要求在
窗口
对象上有
io
吗?我不能具体地说是
socket.io
,但通常在调度JSONP调用时向窗口添加一个随机命名的函数,这与
io
对象本身无关。