动态升级/替换原型库

问题描述:

我正在开发可以嵌入到许多网站的调查邀请。为了展示我使用的Modalbox的邀请,这是一个在半透明叠加层上显示动画模式框的JavaScript库。动态升级/替换原型库

这个Modalbox库依赖于Prototype和script.aculo.us/effects库。该邀请将动态地嵌入到我不拥有的站点中,并且不能静态修改其标记。

在加载时我检查(在JS),如果原型被加载,如:

if (typeof Prototype == "undefined") { 
    document.write('<script type="text/javascript" src="http://mysite.com/lib/prototype.js"><\/script>'); 
} 

if (typeof Effect == "undefined") { 
    document.write('<script type="text/javascript" src="http://mysite.com/lib/scriptaculous.js?load=effects"><\/script>'); 
} 

所有与多数网站的效果很好,因为他们通常不加载的Prototype.js也不script.aculo。我们。有一些网站加载它们,我不必加载它们,然后再次运行。

无论其... ...有一个已经加载它们,但有旧版本的网站(Modalbox需要原型1.6.0和script.aculo.us 1.8.0),如1.4.0/1.5.1

我如何动态卸载/替换原型和/或脚本script.aculo.us在Javascript中?可能吗?

您也许可以在技术上做到这一点,但是您是否愿意冒险打破网页的其余部分,以便您的插件有效?这些网站为什么没有升级可能有充分的理由 - 比如与其他不适用于新版本的插件的兼容性。我建议你要么使用你的代码的网站拥有Prototype的最低版本(通过检查Prototype.Version),要么在你没有发现的时候包含它。对Scriptaculous也一样。

这将允许您的代码的用户就如何最好地继续进行决策。要么他们可以升级他们的页面(很可能,因为旧版本可能由于惯性而被使用)或者放下你的插件。

对于tvanfosson,如果你能弄清楚如何动态更新到所需的原型,那么你也应该能够利用像WTFFramework这样的东西来确定原始版本。然后在显示弹出窗口之前,加载您的原型,并在弹出窗口关闭时重新加载原始原型。

那么我的一些同事建议在我的(1.6.0)原型中使用“命名空间”功能,例如通过在“__mySite”前添加它们。但是这意味着很多重构工作,因为我还必须更新对重命名函数的调用。