Не удается прикрепить конвертированный img base64 к img src, как исправить?

Работа с кодом создает рабочую базу 64, но когда я пытаюсь img.src = imgbase64; на лету это не работает, но если скопировать это изображение base64 и вставить вручную в src, оно сработает. ВО ФРАГМЕНТЕ КОДА НАЖМИТЕ НА ИЗОБРАЖЕНИЕ И ЗАГРУЗИТЕ ЛЮБОЕ ИЗОБРАЖЕНИЕ

Вопрос:

Как прикрепить сгенерированную на лету строку base64 изображения к html img элемент?

Шаги:

  1. Нажмите на любое изображение
  2. Загрузить любое изображение
  3. Затем код преобразует загруженное изображение в base64.
  4. Ошибка здесь, при добавлении base64 в src не работает

function log(msg){return console.info(msg); } function removeClass(el, _className = "active"){if (el){return hasClass(el, _className) ? el.classList.remove(_className) : true; } return false; } function hasClass(el, _className = "active"){if (el.classList.contains(_className)){return true; } else {return false; } return false; } function getElement(target, targetFrom=false){return targetFrom ? targetFrom.querySelector(target) : document.querySelector(target); } function getElements(target, targetFrom=false){return targetFrom ? [...targetFrom.querySelectorAll(target)] : [...document.querySelectorAll(target)]; } function getElementById(target, targetFrom=false){return targetFrom ? targetFrom.getElementById(target) : document.getElementById(target); } function addClass(el, _className = "active"){if (el){return !hasClass(el, _className) ? el.classList.add(_className) : true; } return false; } function getParent(el, idx){previouslyParent = el.parentElement; for (let index = 0; index < idx - 1; index++) {previouslyParent = previouslyParent.parentElement; } return previouslyParent; } function getOffset(el) {const rect = el.getBoundingClientRect(); return {"top": rect.top + window.scrollY, "left": rect.left + window.scrollX }; } function objectToTagStyles(selector, styles){if (styles){var style = document.createElement('style'); resonanceCssString = `${selector} {`; for (const [key, value] of Object.entries(styles)) {resonanceCssString += `${key}:${value};`; } resonanceCssString += "}"; if (style.styleSheet) {style.styleSheet.cssText = resonanceCssString; } else {style.appendChild(document.createTextNode(resonanceCssString)); } document.getElementsByTagName('head')[0].appendChild(style); return true; } return false; } function objectToCssTextStyles(styles){if (styles){resonanceCssString = ''; for (const [key, value] of Object.entries(styles)) {resonanceCssString += `${key}:${value};`; } return resonanceCssString; } return false; } function getAttribute(element, attr, isReturnValue){return isReturnValue ? element.attributes[attr].value : element.attributes[attr]; } function stringGen(yourNumber){var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i < yourNumber; i++){text += possible.charAt(Math.floor(Math.random() * possible.length)); } return text; }


let base64String = "";
  
function imageUploaded() {
    var file = this['files'][0];
  
    var reader = new FileReader();
      
    reader.onload = function () {
        base64String = reader.result;
  
        imageBase64Stringsep = base64String;
  
        console.info(base64String);
    }


    imgToChange = getElement(`.change-this-image__${this.id}`);
        
    imgToChange.src = base64String;

    reader.readAsDataURL(file);
    
    return base64String;
}




imgs = getElements('img');
svgs = getElements('svg');



getElement('body').style.position = 'relative';

for(let imageElement of imgs){

    newChangeImageWrapper = document.createElement("label");
    newChangeImageInput = document.createElement("input");

    addClass(newChangeImageWrapper, 'reverb-image-changer');

    randomNewWapperId = stringGen(10);
    randomNewInputId = stringGen(10);

    currentImgOffset = getOffset(imageElement);

    addClass(newChangeImageWrapper, `reverb-image-changer--id_${randomNewWapperId}`);
    newChangeImageWrapper.setAttribute("for", randomNewInputId);

    newChangeImageInput.setAttribute("id", randomNewInputId);
    newChangeImageInput.type = "file";

    newChangeImageInput.onchange = imageUploaded;
    
    newChangeImageWrapper.appendChild(newChangeImageInput)

    addClass(imageElement, `change-this-image__${randomNewInputId}`);

    currentImageBoundaries = imageElement.getBoundingClientRect();


    currentWrapperStyles = {
        "width": `${currentImageBoundaries.width}px`,
        "height": `${currentImageBoundaries.height}px`,
        "position": "fixed",
        "top": `${currentImageBoundaries.y}px`,
        "left": `${currentImageBoundaries.x}px`
    }


    newChangeImageWrapper.style.cssText = objectToCssTextStyles(currentWrapperStyles);

    getElement('body').appendChild(newChangeImageWrapper);

}
.reverb-image-changer{
    display: block;
    border: 1px solid transparent;
    text-align: center;
    color: white;
    cursor: pointer;
    margin-top: 0;
    transition: .3s;
    z-index: 999;
}

.reverb-image-changer:hover{

    border-color: rgb(46, 204, 113);
    cursor: pointer;
}

.reverb-image-changer input{
    
    width: 0px;
    height: 0px;
  visibility: hidden;
    position: absolute;
    top: 0;
    left: -100%;

}
<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
    <img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
    <img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
    <img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
  
</body>
</html>

Похоже, ваш пост в основном код; пожалуйста, добавьте некоторые подробности.

Пожалуйста, не обходите намеренно наши фильтры качества сообщений, копируя/вставляя бесполезный текст в свой вопрос. Эти фильтры существуют по какой-то причине, и обходить их стороной действительно довольно грубо.

esqew 14.09.2022 13:04

@esqew поверь мне, я не хочу этого, но стек скажи мне добавить больше деталей, но я добавлю как можно больше, просто не позволяй мне публиковать вопрос

perolamutr 14.09.2022 13:06

Пожалуйста, обрежьте свой код, чтобы было легче найти вашу проблему. Следуйте этим рекомендациям, чтобы создать минимально воспроизводимый пример.

Community 14.09.2022 13:12

ВО ФРАГМЕ КОДА НАЖМИТЕ НА ИЗОБРАЖЕНИЕ" - и что дальше? Что должно произойти? Вы могли бы добавить правильное объяснение того, что должен делать ваш скрипт, вместо того, чтобы добавлять элементы копирования и вставки в конец вашего вопроса.

CBroe 14.09.2022 13:34

@CBroe, я добавил, сэр, нажмите на изображение, загрузите любое изображение, а затем оно преобразуется в base64 и вставляется в то же изображение, которое вы выбрали из 1 шага. Но когда он проходит, он не работает, но когда проходит тот же base64 вручную, он работает

perolamutr 14.09.2022 13:35

Отвечает ли это на ваш вопрос? Как отображать изображения Base64 в HTML

Peter Krebs 14.09.2022 14:29

Внимательно посмотрите на конец этой строки, похоже, там какой-то ложный текст.

A Haworth 14.09.2022 14:48

@PeterKrebs, прежде чем пытаться помочь прочитать вопрос, то, что вы показали, не имеет ничего похожего на то, что мне нужно.

perolamutr 14.09.2022 15:48
Поведение ключевого слова "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) для оценки ваших знаний,...
0
9
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вам нужно дождаться загрузки изображения.
Лучше измените <img> src в обратном вызове события onload:

function imageUploaded() {
  var file = this["files"][0];
  var currentID = this.id;
  var reader = new FileReader();
  reader.onload = function () {
    base64String = reader.result;
    imageBase64Stringsep = base64String;
    imgToChange = getElement(`.change-this-image__${currentID}`);
    imgToChange.src = base64String;
  };
  reader.readAsDataURL(file);
  return base64String;
}

function log(msg) {
  return console.info(msg);
}

function removeClass(el, _className = "active") {
  if (el) {
    return hasClass(el, _className) ? el.classList.remove(_className) : true;
  }
  return false;
}

function hasClass(el, _className = "active") {
  if (el.classList.contains(_className)) {
    return true;
  } else {
    return false;
  }
  return false;
}

function getElement(target, targetFrom = false) {
  return targetFrom ?
    targetFrom.querySelector(target) :
    document.querySelector(target);
}

function getElements(target, targetFrom = false) {
  return targetFrom ?
    [...targetFrom.querySelectorAll(target)] :
    [...document.querySelectorAll(target)];
}

function getElementById(target, targetFrom = false) {
  return targetFrom ?
    targetFrom.getElementById(target) :
    document.getElementById(target);
}

function addClass(el, _className = "active") {
  if (el) {
    return !hasClass(el, _className) ? el.classList.add(_className) : true;
  }
  return false;
}

function getParent(el, idx) {
  previouslyParent = el.parentElement;
  for (let index = 0; index < idx - 1; index++) {
    previouslyParent = previouslyParent.parentElement;
  }
  return previouslyParent;
}

function getOffset(el) {
  const rect = el.getBoundingClientRect();
  return {
    top: rect.top + window.scrollY,
    left: rect.left + window.scrollX
  };
}

function objectToTagStyles(selector, styles) {
  if (styles) {
    var style = document.createElement("style");
    resonanceCssString = `${selector} {`;
    for (const [key, value] of Object.entries(styles)) {
      resonanceCssString += `${key}:${value};`;
    }
    resonanceCssString += "}";
    if (style.styleSheet) {
      style.styleSheet.cssText = resonanceCssString;
    } else {
      style.appendChild(document.createTextNode(resonanceCssString));
    }
    document.getElementsByTagName("head")[0].appendChild(style);
    return true;
  }
  return false;
}

function objectToCssTextStyles(styles) {
  if (styles) {
    resonanceCssString = "";
    for (const [key, value] of Object.entries(styles)) {
      resonanceCssString += `${key}:${value};`;
    }
    return resonanceCssString;
  }
  return false;
}

function getAttribute(element, attr, isReturnValue) {
  return isReturnValue ?
    element.attributes[attr].value :
    element.attributes[attr];
}

function stringGen(yourNumber) {
  var text = "";
  var possible =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  for (var i = 0; i < yourNumber; i++) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  return text;
}

let base64String = "";

function imageUploaded() {
  var file = this["files"][0];
  var currentID = this.id;
  var reader = new FileReader();

  reader.onload = function() {
    base64String = reader.result;
    imageBase64Stringsep = base64String;
    imgToChange = getElement(`.change-this-image__${currentID}`);
    imgToChange.src = base64String;
  };
  reader.readAsDataURL(file);
  return base64String;
}

imgs = getElements("img");
svgs = getElements("svg");

getElement("body").style.position = "relative";

for (let imageElement of imgs) {
  newChangeImageWrapper = document.createElement("label");
  newChangeImageInput = document.createElement("input");

  addClass(newChangeImageWrapper, "reverb-image-changer");

  randomNewWapperId = stringGen(10);
  randomNewInputId = stringGen(10);

  currentImgOffset = getOffset(imageElement);

  addClass(
    newChangeImageWrapper,
    `reverb-image-changer--id_${randomNewWapperId}`
  );
  newChangeImageWrapper.setAttribute("for", randomNewInputId);

  newChangeImageInput.setAttribute("id", randomNewInputId);
  newChangeImageInput.type = "file";

  newChangeImageInput.onchange = imageUploaded;

  newChangeImageWrapper.appendChild(newChangeImageInput);

  addClass(imageElement, `change-this-image__${randomNewInputId}`);

  currentImageBoundaries = imageElement.getBoundingClientRect();

  currentWrapperStyles = {
    width: `${currentImageBoundaries.width}px`,
    height: `${currentImageBoundaries.height}px`,
    position: "fixed",
    top: `${currentImageBoundaries.y}px`,
    left: `${currentImageBoundaries.x}px`
  };

  newChangeImageWrapper.style.cssText = objectToCssTextStyles(
    currentWrapperStyles
  );

  getElement("body").appendChild(newChangeImageWrapper);
}
.reverb-image-changer {
  display: block;
  border: 1px solid transparent;
  text-align: center;
  color: white;
  cursor: pointer;
  margin-top: 0;
  transition: .3s;
  z-index: 999;
}

.reverb-image-changer:hover {
  border-color: rgb(46, 204, 113);
  cursor: pointer;
}

.reverb-image-changer input {
  width: 0px;
  height: 0px;
  visibility: hidden;
  position: absolute;
  top: 0;
  left: -100%;
}
<img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
<img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
<img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
<img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">

imgToChange.src = base64String; должен быть внутри функции reader.onload. потому что base64String пусто там, где вы его сейчас ставите. надеюсь, это имеет смысл. было бы разумнее, если бы вы проверили его в отладчике и нажали F8, чтобы посмотреть поток кода.

function log(msg){return console.info(msg); } function removeClass(el, _className = "active"){if (el){return hasClass(el, _className) ? el.classList.remove(_className) : true; } return false; } function hasClass(el, _className = "active"){if (el.classList.contains(_className)){return true; } else {return false; } return false; } function getElement(target, targetFrom=false){return targetFrom ? targetFrom.querySelector(target) : document.querySelector(target); } function getElements(target, targetFrom=false){return targetFrom ? [...targetFrom.querySelectorAll(target)] : [...document.querySelectorAll(target)]; } function getElementById(target, targetFrom=false){return targetFrom ? targetFrom.getElementById(target) : document.getElementById(target); } function addClass(el, _className = "active"){if (el){return !hasClass(el, _className) ? el.classList.add(_className) : true; } return false; } function getParent(el, idx){previouslyParent = el.parentElement; for (let index = 0; index < idx - 1; index++) {previouslyParent = previouslyParent.parentElement; } return previouslyParent; } function getOffset(el) {const rect = el.getBoundingClientRect(); return {"top": rect.top + window.scrollY, "left": rect.left + window.scrollX }; } function objectToTagStyles(selector, styles){if (styles){var style = document.createElement('style'); resonanceCssString = `${selector} {`; for (const [key, value] of Object.entries(styles)) {resonanceCssString += `${key}:${value};`; } resonanceCssString += "}"; if (style.styleSheet) {style.styleSheet.cssText = resonanceCssString; } else {style.appendChild(document.createTextNode(resonanceCssString)); } document.getElementsByTagName('head')[0].appendChild(style); return true; } return false; } function objectToCssTextStyles(styles){if (styles){resonanceCssString = ''; for (const [key, value] of Object.entries(styles)) {resonanceCssString += `${key}:${value};`; } return resonanceCssString; } return false; } function getAttribute(element, attr, isReturnValue){return isReturnValue ? element.attributes[attr].value : element.attributes[attr]; } function stringGen(yourNumber){var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var i = 0; i < yourNumber; i++){text += possible.charAt(Math.floor(Math.random() * possible.length)); } return text; }


let base64String = "";
  
function imageUploaded() {
    var file = this['files'][0];
  
    var reader = new FileReader();
      
    reader.onload = function () {
        base64String = reader.result;
        imageBase64Stringsep = base64String;/*=====> 1.this executes after the imgTochange.src*/
        imgToChange.src = base64String;
        console.info(base64String);
    }


    imgToChange = getElement(`.change-this-image__${this.id}`);
        
    /*imgToChange.src = base64String;   =====> 1.this executes first,here base64String is empty*/ 

    reader.readAsDataURL(file);
    
    return base64String;
}




imgs = getElements('img');
svgs = getElements('svg');



getElement('body').style.position = 'relative';

for(let imageElement of imgs){

    newChangeImageWrapper = document.createElement("label");
    newChangeImageInput = document.createElement("input");

    addClass(newChangeImageWrapper, 'reverb-image-changer');

    randomNewWapperId = stringGen(10);
    randomNewInputId = stringGen(10);

    currentImgOffset = getOffset(imageElement);

    addClass(newChangeImageWrapper, `reverb-image-changer--id_${randomNewWapperId}`);
    newChangeImageWrapper.setAttribute("for", randomNewInputId);

    newChangeImageInput.setAttribute("id", randomNewInputId);
    newChangeImageInput.type = "file";

    newChangeImageInput.onchange = imageUploaded;
    
    newChangeImageWrapper.appendChild(newChangeImageInput)

    addClass(imageElement, `change-this-image__${randomNewInputId}`);

    currentImageBoundaries = imageElement.getBoundingClientRect();


    currentWrapperStyles = {
        "width": `${currentImageBoundaries.width}px`,
        "height": `${currentImageBoundaries.height}px`,
        "position": "fixed",
        "top": `${currentImageBoundaries.y}px`,
        "left": `${currentImageBoundaries.x}px`
    }


    newChangeImageWrapper.style.cssText = objectToCssTextStyles(currentWrapperStyles);

    getElement('body').appendChild(newChangeImageWrapper);

}
.reverb-image-changer{
    display: block;
    border: 1px solid transparent;
    text-align: center;
    color: white;
    cursor: pointer;
    margin-top: 0;
    transition: .3s;
    z-index: 999;
}

.reverb-image-changer:hover{

    border-color: rgb(46, 204, 113);
    cursor: pointer;
}

.reverb-image-changer input{
    
    width: 0px;
    height: 0px;
  visibility: hidden;
    position: absolute;
    top: 0;
    left: -100%;

}
<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
    <img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
    <img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
    <img src = "https://picsum.photos/200/300" alt = "" width = "200" height = "300">
  
</body>
</html>

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