如何在其他站点中注入Javascript(包括Prototype.js),而不扰乱全局名称空间?

如何在其他站点中注入Javascript(包括Prototype.js),而不扰乱全局名称空间?,javascript,prototypejs,global-namespace,Javascript,Prototypejs,Global Namespace,我目前正在进行一个项目,这是一个使用原型库的大型网站,已经有大量Javascript代码 我们现在正在开发一段代码,它将被“注入”到其他人的站点(想象人们在他们的站点中添加标签),然后运行我们的代码并向他们的站点添加一组DOM元素和功能。这将有新的代码片段,也将重用我们在主站点上使用的大量代码 我所面临的问题是,仅仅添加一个包含原型的页面当然不酷。如果我们在一个已经使用任何框架的页面上这样做,我们肯定会把一切都搞砸。 jQuery为我们提供了“重命名”$object的选项,因此它可以适当地处理这

我目前正在进行一个项目,这是一个使用原型库的大型网站,已经有大量Javascript代码

我们现在正在开发一段代码,它将被“注入”到其他人的站点(想象人们在他们的站点中添加标签),然后运行我们的代码并向他们的站点添加一组DOM元素和功能。这将有新的代码片段,也将重用我们在主站点上使用的大量代码

我所面临的问题是,仅仅添加一个包含原型的页面当然不酷。如果我们在一个已经使用任何框架的页面上这样做,我们肯定会把一切都搞砸。
jQuery为我们提供了“重命名”$object的选项,因此它可以适当地处理这种情况,但显然我们没有使用jQuery,因此我们必须迁移所有内容

现在我正在考虑一些丑陋的选择,我不确定什么是最好的

  • 重写所有内容以使用jQuery,在所有地方都重命名$object
  • 创建一个“新”原型库,其中只包含我们将在“注入”代码中使用的子集,并将$重命名为其他名称。然后,我必须再次调整代码中以某种方式共享的部分
  • 在注入的代码中根本不使用库,以使其尽可能干净,并重写共享代码以完全不使用库。这显然会退化为我们创建自己的弗兰肯斯坦图书馆,这可能是有史以来最糟糕的情况
我想知道你们认为我能做什么,还有是否有什么神奇的选择可以解决我所有的问题

例如,你认为我可以使用像Caja/Cajita这样的东西来沙箱我自己的代码,并将其与站点的其余部分隔离开来,然后在其中放置原型吗?还是我完全没有抓住重点

我还读过一篇关于bookmarklet的技术的文章,您是否像这样添加了代码:

(function() {  /* your code */ })();
然后你的代码都在你的匿名函数中,你根本没有触及全局名称空间。 您认为我可以制作一个包含以下内容的文件:

(function() { 
   /* Full Code of the Prototype file here */
   /* All my code that will run in the "other" site */

   InitializeStuff_CreateDOMElements_AttachEventHandlers();
})();
这样行吗?例如,它是否能够实现不使全局名称空间混乱、不破坏使用jQuery的站点上的功能的目标

还是原型太复杂,无法像那样将其隔离开来?

(注意:我想我知道这会在任何地方创建闭包,而且速度会慢一些,但我不太关心性能,我的代码没有做那么复杂的事情)

如果您要将代码注入其他站点,要么要求它们也包含原型,要么根本不使用库

在我看来,任何其他的选择都太过分了。

丹尼尔

出于同样的原因,我遇到了同样的问题。非常感谢,我能够使用jquery。我想做的是创建一个js文件,加载jquery实例和我需要的任何依赖库。然后我想以同样的方式加载css

我找到了一个脚本,可以将这些文件加载到DOM中,但它们似乎不起作用。以下是我正在使用的:

function loadjscssfile(filename, filetype){
 if (filetype=="js"){ //if filename is a external JavaScript file
  var fileref=document.createElement('script')
  fileref.setAttribute("type","text/javascript")
  fileref.setAttribute("src", filename)
 }
 else if (filetype=="css"){ //if filename is an external CSS file
  var fileref=document.createElement("link")
  fileref.setAttribute("rel", "stylesheet")
  fileref.setAttribute("type", "text/css")
  fileref.setAttribute("href", filename)
 }
 if (typeof fileref!="undefined")
  document.getElementsByTagName("head")[0].appendChild(fileref)
}
我可以在firebug中看到css已经加载,但是我的css文件的内容没有通过。我曾希望能够根据这个小部件使用的工具动态加载所需的库。所以我想做一些编程逻辑来决定哪些库和css文件应该被“导入”


我不确定这条思路是否会影响你的努力,但我很想了解你的想法,或者看看你最终会怎么做。

我很想要求原型,但不幸的是,这应该适用于地球上的每个站点。事实上,我也很期待《怪癖》模式带来的乐趣。我同意侵入性的部分,这就是为什么我想尽量减少它。将jQuery与重命名的$object一起添加是否也会太过侵入性?Prototyüe糟糕透了:)太过侵入性。使用jQuery。通常,当您在其他网站上注入代码时,您只提供了主应用程序中的一小部分功能,因此只需用“本机”javascript编写所需的功能是有意义的。然而,你的项目似乎不是这样。我认为它可以与匿名包装器函数一起工作。有些bookmarklet具有动态加载所需库的例程。执行一些测试以确认该技术确实有效,应该很快。:)