Как изменить URL-адрес изображения в Fabric.js

После добавления изображения на холст (и разрешения Fabric.js сделать это) я хочу изменить URL-адрес изображения.

Проблема в том, что работает только часть. После того, как я нажимаю кнопку (что приводит к изменению кодировки), изображение не отображается. Просто место, где был образ, которым я все еще могу манипулировать. Когда я манипулирую изображением, оно внезапно становится видимым. Однако хотелось бы сразу увидеть изображение.

В качестве примера

<button id = "change">Change</button>
<canvas id = "canvas" class = "myStage" width = "800" height = "400"></canvas>

<script>      
 "use strict";
  const canvas = new fabric.Canvas("canvas", { containerClass: "myStage" });
  const changeBtn = document.getElementById("change");
  changeBtn.addEventListener("click", changeSelected);
  let _selectedInstrument = null;

  fabric.Image.fromURL("https://stackoverflow.design/assets/img/logos/teams/teams-logo-compact.svg", function (img) {
      canvas.add(img);
      img.on("mouseup", function (e) {
        _selectedInstrument = e;
      }
    );
  });
  
//this has the same result as the uncommented method beneath
//function changeSelected() {
//    fabric.util.loadImage(
//      "https://stackoverflow.design/assets/img/logos/so/logo-stackoverflow.svg",
//      function (img) {
//        return _selectedInstrument.currentTarget.setElement(img);
//      }, this);
//}

function changeSelected() {
    _selectedInstrument.target._element.src =
      "https://stackoverflow.design/assets/img/logos/so/logo-stackoverflow.svg";
    canvas.renderAll();
}

Чтобы использовать демо-версию в Fiddle, сначала щелкните логотип «SO For Teams» (чтобы выбрать его), а затем нажмите кнопку «Изменить». Затем перетащите пустое изображение, и оно внезапно отобразит логотип stackoverflow.

Я бы предпочел, чтобы изображение просто изменилось, без необходимости его затем перемещать.

Я попробовал 2 разных подхода (согласно моему коду выше). Я звоню renderAll() согласно документации Fabric.js.

Я не уверен, что я делаю неправильно

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При настройке нового изображения src браузер должен загрузить данные изображения. Немедленно вызвав canvas.renderAll(), вы повторно визуализируете холст, пока новое изображение еще загружается. Вместо этого добавьте прослушиватель событий «загрузки» к созданному изображению и повторно визуализируйте холст только тогда, когда новое изображение будет готово.

<button id = "change">Change</button>
<canvas id = "canvas" class = "myStage" width = "800" height = "400"></canvas>

<script>      
  "use strict";
  const canvas = new fabric.Canvas("canvas", { containerClass: "myStage" });
  const changeBtn = document.getElementById("change");
  changeBtn.addEventListener("click", changeSelected);
  let _selectedInstrument = null;

  fabric.Image.fromURL("https://stackoverflow.design/assets/img/logos/teams/teams-logo-compact.svg", function (img) {
    canvas.add(img);
    img._element.addEventListener("load", canvas.renderAll.bind(canvas)); // <-- automatically re-renders the canvas when a new image is ready
    img.on("mouseup", function (e) {
      _selectedInstrument = e;
    });
  });


 function changeSelected() {
   _selectedInstrument.target._element.src =
  "https://stackoverflow.design/assets/img/logos/so/logo-stackoverflow.svg";
   // canvas.renderAll(); <-- Removed, is called when the new image has been loaded
 }

Это потрясающе, и я полностью понимаю, почему ваше объяснение не сработало. Спасибо

MyDaftQuestions 10.06.2024 19:28

Другие вопросы по теме