当我添加Mootools时,外部JS库停止工作

时间:2012-08-03 19:18:26

标签: javascript class object mootools jsfiddle

我正在测试一个JS库来三角化一个点数组(它返回一个三角形数组),并且似乎工作得很好,但是当我添加MooTools时 (这个lib将被嵌入到一个使用MooTools的大型项目,所以我需要它)它停止工作。 :(

我的意思是我只需要在标题中添加MooTools(既不添加domready事件)也会出错...

Uncaught TypeError: Object function (){
            return lower;
        } has no method 'InCircumcircle'

我尝试添加JQuery而不是MooTools,它甚至在domready块中也能完美运行......所以我对mootools的问题一无所知......(也许MooTools改变了JS Object模型中的某些东西不兼容有这个库?)

我不知道如何解决它... 或者也许我是菜鸟,这是我看不到的小细节...... :)

我在JSFiddle中准备了一个小型演示,你可以自己查看它:
http://jsfiddle.net/6KcW9/

图书馆 delauny.js 在管理资源部分中进行了链接。

按原样运行这个简单的代码,你会看到它向控制台输出一些元素...尝试在框架部分添加MooTools并再次运行它。
任何帮助/线索/任何将是伟大的apretiated ...

2 个答案:

答案 0 :(得分:1)

你看过他们的源代码吗?

http://www.travellermap.com/tmp/delaunay.js

MooTools是一个典型的框架。这意味着,它为Native原型添加了可以迭代的方法。

var i;
for( i in vertices )
{
    // NOTE: This is O(n^2) - can be optimized by sorting vertices
    // along the x-axis and only considering triangles that have 
    // potentially overlapping circumcircles

    var vertex = vertices[i];
    AddVertex( vertex, triangles );
}

这样的代码,其中顶点是一个数组 - 将完全破坏。 for (var in object)构造是一种迭代Object属性的方法。相反,正在传递一个数组(它与js中的几乎任何东西一样 - 是一个对象,但具有类似数组的属性)。

var g_vertices = [];
for( var i = 0; i < 50; i++ ) {
    g_vertices.push( new Vertex( Math.random() * 350 + 25, Math.random() * 250 + 25 ) );
}
// var triangles = Triangulate( g_vertices );
// console.log(triangles);

console.log(g_vertices);

for (var i in g_vertices) {
    console.log(i);
}

当您将mootools添加到页面时,结果是:

0, 1, 2 .... 49, $family, $constructor, each, clone, clean, invoke ... etc.

基本上,你需要修复他们的库。使用hasOwnProperty检查 - &gt; if (g_vertices.hasOwnProperty(i)) ... - 或者使用正确的for数组迭代器或while甚至Array.forEach,无论您喜欢什么。

找到这样的替代方案:https://github.com/sokeroner/Delaunay-Triangulation - 它似乎写得更好,更模块化。

答案 1 :(得分:0)

因为您要将所有内容添加到全局命名空间,所以您可能会遇到麻烦。

你真的应该包裹你的code in a module,这样你就不会污染全局命名空间。