【发布时间】:2019-10-11 08:47:57
【问题描述】:
我一直在尝试向我的网站添加一些 html 和 javascript,以便用户可以绘制一些形状。我在JS Fiddle 上找到了一个非常好的示例。当我在 JSFiddle 上运行代码时,它运行良好,但是当我自己在浏览器上运行它时(我尝试过 Edge、Firefox 和 Chrome),它就不起作用了。 当我自己运行它时,我将所有脚本和 css 包含在一个 html 文件中,因为这是将它添加到我的 Wix 网站的唯一方法。脚本(本地 javascript 和外部 cdn 库)一起位于 html 的正文部分。我找到的所有教程都让我觉得可以使用 CDN 库。我很肯定我的问题与与 CDN 库的连接有关,那么我该如何解决呢?
代码如下:
var roof = null;
var roofPoints = [];
var lines = [];
var lineCounter = 0;
var drawingObject = {};
drawingObject.type = "";
drawingObject.background = "";
drawingObject.border = "";
function Point(x, y) {
this.x = x;
this.y = y;
}
$("#poly").click(function () {
if (drawingObject.type == "roof") {
drawingObject.type = "";
lines.forEach(function(value, index, ar){
canvas.remove(value);
});
//canvas.remove(lines[lineCounter - 1]);
roof = makeRoof(roofPoints);
canvas.add(roof);
canvas.renderAll();
} else {
drawingObject.type = "roof"; // roof type
}
});
// canvas Drawing
var canvas = new fabric.Canvas('canvas-tools');
var x = 0;
var y = 0;
fabric.util.addListener(window,'dblclick', function(){
drawingObject.type = "";
lines.forEach(function(value, index, ar){
canvas.remove(value);
});
//canvas.remove(lines[lineCounter - 1]);
roof = makeRoof(roofPoints);
canvas.add(roof);
canvas.renderAll();
console.log("double click");
//clear arrays
roofPoints = [];
lines = [];
lineCounter = 0;
});
canvas.on('mouse:down', function (options) {
if (drawingObject.type == "roof") {
canvas.selection = false;
setStartingPoint(options); // set x,y
roofPoints.push(new Point(x, y));
var points = [x, y, x, y];
lines.push(new fabric.Line(points, {
strokeWidth: 3,
selectable: false,
stroke: 'red'
}).setOriginX(x).setOriginY(y));
canvas.add(lines[lineCounter]);
lineCounter++;
canvas.on('mouse:up', function (options) {
canvas.selection = true;
});
}
});
canvas.on('mouse:move', function (options) {
if (lines[0] !== null && lines[0] !== undefined && drawingObject.type == "roof") {
setStartingPoint(options);
lines[lineCounter - 1].set({
x2: x,
y2: y
});
canvas.renderAll();
}
});
function setStartingPoint(options) {
var offset = $('#canvas-tools').offset();
x = options.e.pageX - offset.left;
y = options.e.pageY - offset.top;
}
function makeRoof(roofPoints) {
var left = findLeftPaddingForRoof(roofPoints);
var top = findTopPaddingForRoof(roofPoints);
roofPoints.push(new Point(roofPoints[0].x,roofPoints[0].y))
var roof = new fabric.Polyline(roofPoints, {
fill: 'rgba(0,0,0,0)',
stroke:'#58c'
});
roof.set({
left: left,
top: top,
});
return roof;
}
function findTopPaddingForRoof(roofPoints) {
var result = 999999;
for (var f = 0; f < lineCounter; f++) {
if (roofPoints[f].y < result) {
result = roofPoints[f].y;
}
}
return Math.abs(result);
}
function findLeftPaddingForRoof(roofPoints) {
var result = 999999;
for (var i = 0; i < lineCounter; i++) {
if (roofPoints[i].x < result) {
result = roofPoints[i].x;
}
}
return Math.abs(result);
}
.canvas {
border: 1px solid black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<button id="poly" title="Draw Polygon" ">Draw Polygon </button>
<label style="color:blue"><b>Press double click to close shape and stop</b></label>
<canvas id="canvas-tools" class="canvas" width="500" height="500"></canvas>
编辑
因此,在 html 文件中,我将所有内容都放在了 body 标记中。这些库也包含在 javascript 之前。当我双击关闭形状时,我收到错误“无法获取未定义或空引用的属性‘x’”。我很肯定,因为当我在画布中单击时没有添加任何点
【问题讨论】:
-
相对于 html 的 javascript 在哪里?
-
您必须在脚本之前包含库。除此之外,除非您分享错误是什么,否则我无法判断导致错误的原因...
-
因此,在 html 文件中,我将所有内容都放在了 标记中。这些库也包含在 javascript 之前。当我双击关闭形状时,我收到错误“无法获取未定义或空引用的属性‘x’”。我很肯定,因为当我在画布中单击时没有添加任何点
标签: javascript jquery html css fabricjs