javascript - 如何在同一页面中使用同一个 javascript 库的两个版本而不泄漏函数?

标签 javascript angularjs d3.js nvd3.js

我有一个用例,我需要为 Angular 应用程序中同一页面上的不同图表使用多个版本的 Nvd3 库(每个图表都通过单独的模板加载)。如何避免此类碰撞?

因此,假设 partial_1.html 上的图表需要 v1.8,partial_2.html 上的图表需要 v1.1,依此类推。任何帮助将不胜感激。

jQuery 尝试使用 noConflict 方法解决此问题,但我似乎找不到适用于任意 js 库(不仅仅是 jQuery)的解决方案。

最佳答案

如果您无法更新旧图表以使用最新版本,那么您只有一个选择,即为您正在使用的每个版本重命名全局变量“d3”。然后,您应该在每个模板上进行查找和替换以更改引用的变量。这样每个都指向一个特定的版本。您可以使用如下所示的代码来完成此操作:

(function (w, d) {
    "use strict";
    var h = d.getElementsByTagName("head")[0],
        s = d.createElement("script");
    w.d3 = null;
    s.src = "https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.min.js";
    s.onload = function () {
        w.d3_3_5_3 = w.d3;
        w.d3 = undefined;
        s = d.createElement("script");
        s.src = "https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.4/d3.min.js";
        s.onload = function () {
            w.d3_3_5_4 = w.d3;
            w.d3 = undefined;
            s = d.createElement("script");
            s.src = "https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js";
            s.onload = function () {
                w.d3_3_5_5 = w.d3;
                w.d3 = undefined;
            };
            h.appendChild(s);
        };
        h.appendChild(s);
    };
    h.appendChild(s);
}(window, document));

上面的示例加载了三个版本,并通过使用 onload 事件捕获了 d3 的每个新实例并将其放入自己的变量中。在这种情况下,d3_3_5_3、d3_3_5_4 和 d3_3_5_5

关于javascript - 如何在同一页面中使用同一个 javascript 库的两个版本而不泄漏函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31296547/

相关文章:

javascript - 如何使用 D3.js 在地理 map 中标记城市?

javascript - jQuery appear() 和 show() 方法有什么区别?

javascript - ajax回调中的闭包循环

javascript - 开放层 3 : How to change/set the style of vector map

d3.js - 当所有值都为 0 时,零刻度在轴上垂直居中

javascript - D3js 响应式堆叠条形图 - 其他主题解决方案不起作用

php - 根据选择拉取信息

ruby-on-rails - Heroku Rails Angular JS 编译 Assets

javascript - 使每个指令的指令范围都是唯一的?

javascript - 尝试使用 AngularJs 和 c# webapi 从服务器下载 zip 文件