当我从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>
我看到有另一个问题here已经问过同一个问题,但是那里给出的解决方案并不相关,因为我已经有了纸质对象的div元素。
答案 0 :(得分:8)
el: $('#myholder'),
浏览器从上到下阅读。浏览器在找到id为myholder
的元素之前执行此行,因此el
是一个空的jQuery对象。
相反,将脚本标记移动到HTML的底部(以便浏览器在尝试抓取之前找到myholder
)或将其全部包装在$(document).ready(
call中。
答案 1 :(得分:1)
您正在尝试获取尚未创建的元素。将脚本放在<body>
的末尾或使用$(document).ready();
答案 2 :(得分:1)
你是不使用jQuery所以这将起作用:
window.onload = function () { your entire javascript code here };
但最好还包括jQuery.js并使用:
$(function () { your entire javascript code here });
代码是逐行执行的,所以它首先加载并运行你的javascript并且不知道“myholder”是什么。像我上面解释的那样,它将加载javascript但它只会在整个页面加载后执行它。