4

当我尝试来自 JointJS 站点的 Hello World 示例时,我总是看到此异常:

Uncaught TypeError: Cannot call method 'getStrokeBBox' of undefined

这是代码:

<!DOCTYPE html>
<html>
<head>
<!--
<link rel="stylesheet" href="css/joint.css" />
<script src="js/joint.js"></script>
-->


<link rel="stylesheet" type="text/css" href="http://www.jointjs.com/downloads/joint.css"></link>
<script type="text/javascript" src="http://www.jointjs.com/downloads/joint.js" ></script>


<script>
    var graph = new joint.dia.Graph;

    var paper = new joint.dia.Paper({
        el: $('#myholder'),
        width: 600,
        height: 200,
        model: graph
    });

    var rect = new joint.shapes.basic.Rect({
        position: { x: 100, y: 30 },
        size: { width: 100, height: 30 },
        attrs: { rect: { fill: 'blue' }, text: { text: 'my box', fill: 'white' } }
    });

    var rect2 = rect.clone();
    rect2.translate(300);

    var link = new joint.dia.Link({
        source: { id: rect.id },
        target: { id: rect2.id }
    });

    graph.addCells([rect, rect2, link]);
</script>
</head>
<title>Test</title>

<body>
    <div id="myholder"> </div>
</body>
</html>

我看到这里已经针对同一个问题提出了另一个问题,但是那里给出的解决方案不相关,因为我已经有一个用于纸质对象的 div 元素。

4

3 回答 3

8
el: $('#myholder'),

浏览器从上到下阅读。浏览器在找到 id 的元素之前就执行了这一行,空的 jQuery 对象也是myholder如此。el

相反,将您的 script 标签移动到 HTML 的底部(以便浏览器myholder在您尝试抓取它之前找到它)或将其全部包装在$(document).ready(call中。

于 2014-02-17T19:30:10.953 回答
1

您正在尝试获取尚未创建的元素。将您的脚本放在末尾<body>或使用$(document).ready();

于 2014-02-17T19:31:16.213 回答
1

你是不是使用 jQuery 所以这将起作用:

window.onload = function () {   your entire javascript code here };

但最好也包含 jQuery.js 并使用:

$(function () {  your entire javascript code here  });

该代码是逐行执行的,因此它首先加载并运行您的 javascript,并且不知道“myholder”是什么。像我上面解释的那样做它会加载javascript,但只有在整个页面加载后才会执行它。

于 2014-02-17T19:38:23.407 回答