Внешние библиотеки Javascript (cdnjs) не доступны HTML-кодом - PullRequest
0 голосов
/ 24 мая 2019

Я пытался добавить 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>

EDIT

Итак, в html-файле я поместил все внутри тега body. Библиотеки также включены до javascript. Я получаю ошибку «Невозможно получить свойство« x »с неопределенной или нулевой ссылкой», когда я дважды щелкаю, чтобы закрыть форму. Я уверен, потому что при нажатии на холсте баллы не добавляются

1 Ответ

2 голосов
/ 24 мая 2019

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-element

, если вы хотите запустить его на отдельномстраница (не на wix) и скрипты загружены попробуйте обернуть ваш код JavaScript в:

<script>
$(function() { 
     //your code here 
     var roof = null;
     var roofPoints = [];
     var lines = [];
     var lineCounter = 0;
     var drawingObject = {};
     ...
     ...

});
</script>
...