如何在其他站点中注入Javascript(包括Prototype.js),而不扰乱全局名称空间?
我目前正在进行一个项目,这是一个使用原型库的大型网站,已经有大量Javascript代码 我们现在正在开发一段代码,它将被“注入”到其他人的站点(想象人们在他们的站点中添加标签),然后运行我们的代码并向他们的站点添加一组DOM元素和功能。这将有新的代码片段,也将重用我们在主站点上使用的大量代码 我所面临的问题是,仅仅添加一个包含原型的页面当然不酷。如果我们在一个已经使用任何框架的页面上这样做,我们肯定会把一切都搞砸。如何在其他站点中注入Javascript(包括Prototype.js),而不扰乱全局名称空间?,javascript,prototypejs,global-namespace,Javascript,Prototypejs,Global Namespace,我目前正在进行一个项目,这是一个使用原型库的大型网站,已经有大量Javascript代码 我们现在正在开发一段代码,它将被“注入”到其他人的站点(想象人们在他们的站点中添加标签),然后运行我们的代码并向他们的站点添加一组DOM元素和功能。这将有新的代码片段,也将重用我们在主站点上使用的大量代码 我所面临的问题是,仅仅添加一个包含原型的页面当然不酷。如果我们在一个已经使用任何框架的页面上这样做,我们肯定会把一切都搞砸。 jQuery为我们提供了“重命名”$object的选项,因此它可以适当地处理这
jQuery为我们提供了“重命名”$object的选项,因此它可以适当地处理这种情况,但显然我们没有使用jQuery,因此我们必须迁移所有内容 现在我正在考虑一些丑陋的选择,我不确定什么是最好的
- 重写所有内容以使用jQuery,在所有地方都重命名$object
- 创建一个“新”原型库,其中只包含我们将在“注入”代码中使用的子集,并将$重命名为其他名称。然后,我必须再次调整代码中以某种方式共享的部分
- 在注入的代码中根本不使用库,以使其尽可能干净,并重写共享代码以完全不使用库。这显然会退化为我们创建自己的弗兰肯斯坦图书馆,这可能是有史以来最糟糕的情况
(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具有动态加载所需库的例程。执行一些测试以确认该技术确实有效,应该很快。:)