Как обновить переменные Javascript из HTML-ввода в реальном времени? - PullRequest
0 голосов
/ 09 апреля 2019

Я создаю программу, в которой прямоугольники можно изменять в реальном времени (в зависимости от того, что вводит пользовательская клавиатура) с использованием fabric.js.

Я ужасно долго этим занимаюсь.

Я пытаюсь получить ввод id=width и ввод id=height, чтобы иметь возможность редактировать rect.width и rect.height и PREFERABLY заставляют его менять форму прямоугольника, как я это делаю.

Я включил свой код ниже, я только что удалил все свои попытки на document.getElementById('height').value;, потому что все они былиабсолютно бесполезно, и когда я включаю их, это нарушает весь сценарий (который я не считаю очень полезным для jsfiddle).

Я думаю, что я немного над головой.

Любая помощь будет высоко ценится.

jsfiddle

HTML

<body>
  <input id="width" type="number" value="100"> <br>
  <input id="height" type="number" value="100"> <br>
</body>

<canvas id="canvas" width="800" height="800"></canvas>

Javascript

     var canvas = new fabric.Canvas('canvas');
     var grid = 20;

 for (var i = 0; i < (800 / grid); i++) {
         canvas.add(new fabric.Line([ i * grid, 0, i * grid, 800], 
            {strokeDashArray: [3, 17], strokeWidth : 3, stroke: 'black', selectable: false }));
         canvas.add(new fabric.Line([ 0, i * grid, 800, i * grid], 
            {strokeDashArray: [3, 17], strokeWidth :3, stroke: 'black', selectable: false }))
    }

 var rect = new fabric.Rect({
            top : 50,
            left : 50,
            width : 100,
            height : 100,
            fill : 'red',
            hasControls : false
        });

   canvas.add(rect);

   canvas.on('object:moving', function(options) { 
         options.target.set({
             left: Math.round(options.target.left / grid) * 
grid,
             top: Math.round(options.target.top / grid) * grid
          });
        });

    canvas.on('object:moving', function (e) {
       var obj = e.target;
         // if object is too big ignore
        if(obj.currentHeight > obj.canvas.height || obj.currentWidth 
> obj.canvas.width){
            return;
        }        
        obj.setCoords();        
        // top-left  corner
        if(obj.getBoundingRect().top < 0 || 
 obj.getBoundingRect().left < 0){
            obj.top = Math.max(obj.top, obj.top- 
 obj.getBoundingRect().top);
             obj.left = Math.max(obj.left, obj.left- 
obj.getBoundingRect().left);
            }
        // bot-right corner
        if(obj.getBoundingRect().top+obj.getBoundingRect().height  > 
obj.canvas.height || 
     obj.getBoundingRect().left+obj.getBoundingRect().width  > 
obj.canvas.width){
            obj.top = Math.min(obj.top, obj.canvas.height- 
obj.getBoundingRect().height+obj.top-obj.getBoundingRect().top);
            obj.left = Math.min(obj.left, obj.canvas.width- 
obj.getBoundingRect().width+obj.left-obj.getBoundingRect().left);
        }
});

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Итак, вы действительно задаете два вопроса:

1.Как узнать, когда значение текстового поля изменяется?

Вы можете найти ввод с помощью getElementById и присоединить и прослушивать событие к изменению event.

let widthInput = document.getElementById('width');

widthInput.addEventListener('change', (event) => {
});

2.Как изменить размер объекта в fabric.js

Вы используете метод set для объекта Fabric.js.Затем вызовите renderAll на холсте.

rect.set('width', parseInt(widthInput.value));
canvas.renderAll();

Все вместе:

Примечание. Для изменения необходимо щелкнуть текстовое поле.событие для запуска.

https://jsfiddle.net/9v5zogju/

HTML

Я удалил недействительные атрибуты type, дал каждому входу уникальный идентификатор иубрал лишний тег body.

<input id="width" value="100"><br>
<input id="height" value="100"><br>
<canvas id="canvas" width="800" height="800"></canvas>

Javascript

Я оставил ваш код как есть.Мой код внизу.

     var canvas = new fabric.Canvas('canvas');
     var grid = 20;

 for (var i = 0; i < (800 / grid); i++) {
         canvas.add(new fabric.Line([ i * grid, 0, i * grid, 800], 
            {strokeDashArray: [3, 17], strokeWidth : 3, stroke: 'black', selectable: false }));
         canvas.add(new fabric.Line([ 0, i * grid, 800, i * grid], 
            {strokeDashArray: [3, 17], strokeWidth :3, stroke: 'black', selectable: false }))
        }

 var rect = new fabric.Rect({
            top : 50,
            left : 50,
            width : 100,
            height : 100,
            fill : 'red',
            hasControls : false
        });

   canvas.add(rect);

   canvas.on('object:moving', function(options) { 
         options.target.set({
             left: Math.round(options.target.left / grid) * grid,
             top: Math.round(options.target.top / grid) * grid
          });
        });

        canvas.on('object:moving', function (e) {
        var obj = e.target;
         // if object is too big ignore
        if(obj.currentHeight > obj.canvas.height || obj.currentWidth > obj.canvas.width){
            return;
        }        
        obj.setCoords();        
        // top-left  corner
        if(obj.getBoundingRect().top < 0 || obj.getBoundingRect().left < 0){
            obj.top = Math.max(obj.top, obj.top-obj.getBoundingRect().top);
            obj.left = Math.max(obj.left, obj.left-obj.getBoundingRect().left);
        }
        // bot-right corner
        if(obj.getBoundingRect().top+obj.getBoundingRect().height  > obj.canvas.height || obj.getBoundingRect().left+obj.getBoundingRect().width  > obj.canvas.width){
            obj.top = Math.min(obj.top, obj.canvas.height-obj.getBoundingRect().height+obj.top-obj.getBoundingRect().top);
            obj.left = Math.min(obj.left, obj.canvas.width-obj.getBoundingRect().width+obj.left-obj.getBoundingRect().left);
        }
});

//new code below this line
let widthInput = document.getElementById('width');

widthInput.addEventListener('change', (event) => {
    rect.set('width', parseInt(widthInput.value));
    canvas.renderAll();
});

let heightInput = document.getElementById('height');

heightInput.addEventListener('change', (event) => 
    rect.set('height', parseInt(heightInput.value));
    canvas.renderAll();
});  
1 голос
/ 09 апреля 2019

https://jsfiddle.net/andrwrbnsn/doynL163/30/

После быстрого просмотра, я надеюсь, что это немного поможет - ткань имеет setWidth и setHeight, как можно объяснить здесь:

Таким образом, по сути вы используете document.GetElementById, чтобы получитьвходные данные и добавить обработчик событий, который в keyup обновляет ширину / высоту и обновляет холст.

Как изменить значение для объекта Fabric.js?

...