Я пытался добавить html и javascript на свой веб-сайт, чтобы пользователи могли рисовать некоторые фигуры. Я нашел действительно хороший образец для работы с JS-скрипт. Когда я запускаю код на JSFiddle, он работает отлично, но когда я сам запускал его в своем браузере (я пробовал Edge, Firefox и Chrome), он не работал. Когда я запустил его сам, я включил все скрипты и css в один html-файл, потому что это единственный способ добавить его на мой сайт Wix. Скрипты (локальный javascript и внешние библиотеки cdn) находятся вместе в разделе body 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.info("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-файле я помещаю все в тег <body></body>. Библиотеки также включены перед javascript. Я получаю сообщение об ошибке «Невозможно получить свойство «x» неопределенной или нулевой ссылки», когда я дважды щелкаю, чтобы закрыть фигуру. Я уверен, потому что точки не добавляются, когда я нажимаю на холст



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Wix не разрешает использовать Cloudflare. По следующей ссылке есть более подробная информация.
https://support.wix.com/en/article/request-cloudflare-support
Wix имеет ограниченный API для работы с элементами HTML. https://support.wix.com/en/article/corvid-working-with-the-html-элемент
если вы хотите запустить его на отдельной странице (не на wix) и загружены скрипты, попробуйте обернуть код javascript в:
<script>
$(function() {
//your code here
var roof = null;
var roofPoints = [];
var lines = [];
var lineCounter = 0;
var drawingObject = {};
...
...
});
</script>
Это имеет смысл, но библиотеки даже не работали, когда я запускал html-файл сам по себе, а не на своем веб-сайте Wix.
если вы хотите запустить его на отдельной странице (не на wix) и загружены скрипты, попробуйте обернуть код javascript в: $(function() { // ваш код здесь });
Это работает как шарм, спасибо. Я также попробовал это на Wix, и это сработало.
Где javascript по отношению к html?