通过回调解决引用错误
Resolving Reference Error with call-back
我在跟随几乎所有基本 snap.svg 教程的过程中不断碰壁。虽然 运行 他们的代码通过 jsfiddle or codepen 一切正常,但是当我通过我自己的本地编辑器尝试相同时,我运气不佳。
我的代码:
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="css/style.css">
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<script type="text/javascript" src="js/snap.svg.js"></script>
</head>
<body>
<svg id="svg" class="svg"></svg>
</body>
</html>
JavaScript
var surface = Snap("#svg");
var circ = surface.circle(100, 100, 50);
circ.attr({
fill: "#addedd",
strokeWidth: 10,
stroke: "#beeeef"
});
CSS
body {
display: block;
width: 200px;
height: 200px;
margin: 50px auto;
}
.svg {
width: 100%;
height: 100%;
}
我总是遇到的主要问题是以下行的引用错误:
var surface = Snap("#svg");
我通过包含一个回调并将块包装在一个函数中解决了这个问题:
function main(){
var surface = Snap("#svg");
var circ = surface.circle(100, 100, 50);
circ.attr({
fill: "#addedd",
strokeWidth: 10,
stroke: "#beeeef"
});
};
$(document).ready(main);
我觉得这些教程好像漏掉了什么?我确定有比我想出的更好的解决方案?你怎么看?
我只想开始学习 Snap!
如您所说,Snap代码只能执行一次,jQuery已加载。
$(document).ready(function(){
var surface = Snap("#svg");
var circ = surface.circle(100, 100, 50);
circ.attr({
fill: "#addedd",
strokeWidth: 10,
stroke: "#beeeef"
});
});
加载js文件的顺序很重要。 由于 snap 依赖于 jQuery,因此在 jQuery 准备好 之前您无法执行它。
比 Snap 或任何 javaScript 库更重要的是,首先了解 JS 的基础知识很重要。较小的文件将比大文件加载得更快,尽管它们是在之后请求的。
在你的例子中,甚至在 jQuery 下载之前,你的 js 的主要功能已经执行,你得到了一个错误。这就是为什么 $(document).ready 始终是使用 jQuery.
开始代码的首选方式
编辑:
正如@Ian 所指出的,snap 不依赖于 jQuery。实际问题是 js 文件的顺序错误。正确的顺序应该是这样的,
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="css/style.css">
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/snap.svg.js"></script>
</head>
<body>
<svg id="svg" class="svg"></svg>
<!-- custom code should be loaded after the svg markup -->
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>
Snap 不依赖于 jquery。
问题可能是你在运行脚本中调用了这一行。
var surface = Snap("#svg");
在 svg 标记之前
<svg id="svg" class="svg"></svg>
被载入DOM。所以它找不到要引用的元素。该问题与 Snap 完全无关,只是正常 HTML/SVG 和 JS 加载和排序。
原始代码中不清楚的是,当您加载自己的 js 代码时。您可以尝试将其放在 svg 标记之后,但通常最好先确保文档准备就绪。 ..
$(document).ready( ... )
如您所见:).
我在跟随几乎所有基本 snap.svg 教程的过程中不断碰壁。虽然 运行 他们的代码通过 jsfiddle or codepen 一切正常,但是当我通过我自己的本地编辑器尝试相同时,我运气不佳。
我的代码:
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="css/style.css">
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<script type="text/javascript" src="js/snap.svg.js"></script>
</head>
<body>
<svg id="svg" class="svg"></svg>
</body>
</html>
JavaScript
var surface = Snap("#svg");
var circ = surface.circle(100, 100, 50);
circ.attr({
fill: "#addedd",
strokeWidth: 10,
stroke: "#beeeef"
});
CSS
body {
display: block;
width: 200px;
height: 200px;
margin: 50px auto;
}
.svg {
width: 100%;
height: 100%;
}
我总是遇到的主要问题是以下行的引用错误:
var surface = Snap("#svg");
我通过包含一个回调并将块包装在一个函数中解决了这个问题:
function main(){
var surface = Snap("#svg");
var circ = surface.circle(100, 100, 50);
circ.attr({
fill: "#addedd",
strokeWidth: 10,
stroke: "#beeeef"
});
};
$(document).ready(main);
我觉得这些教程好像漏掉了什么?我确定有比我想出的更好的解决方案?你怎么看?
我只想开始学习 Snap!
如您所说,Snap代码只能执行一次,jQuery已加载。
$(document).ready(function(){
var surface = Snap("#svg");
var circ = surface.circle(100, 100, 50);
circ.attr({
fill: "#addedd",
strokeWidth: 10,
stroke: "#beeeef"
});
});
加载js文件的顺序很重要。 由于 snap 依赖于 jQuery,因此在 jQuery 准备好 之前您无法执行它。
比 Snap 或任何 javaScript 库更重要的是,首先了解 JS 的基础知识很重要。较小的文件将比大文件加载得更快,尽管它们是在之后请求的。
在你的例子中,甚至在 jQuery 下载之前,你的 js 的主要功能已经执行,你得到了一个错误。这就是为什么 $(document).ready 始终是使用 jQuery.
开始代码的首选方式编辑:
正如@Ian 所指出的,snap 不依赖于 jQuery。实际问题是 js 文件的顺序错误。正确的顺序应该是这样的,
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="css/style.css">
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/snap.svg.js"></script>
</head>
<body>
<svg id="svg" class="svg"></svg>
<!-- custom code should be loaded after the svg markup -->
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>
Snap 不依赖于 jquery。
问题可能是你在运行脚本中调用了这一行。
var surface = Snap("#svg");
在 svg 标记之前
<svg id="svg" class="svg"></svg>
被载入DOM。所以它找不到要引用的元素。该问题与 Snap 完全无关,只是正常 HTML/SVG 和 JS 加载和排序。
原始代码中不清楚的是,当您加载自己的 js 代码时。您可以尝试将其放在 svg 标记之后,但通常最好先确保文档准备就绪。 ..
$(document).ready( ... )
如您所见:).