Работа с кодом создает рабочую базу 64, но когда я пытаюсь img.src = imgbase64;
на лету это не работает, но если скопировать это изображение base64 и вставить вручную в src, оно сработает. ВО ФРАГМЕНТЕ КОДА НАЖМИТЕ НА ИЗОБРАЖЕНИЕ И ЗАГРУЗИТЕ ЛЮБОЕ ИЗОБРАЖЕНИЕ
Вопрос:
Как прикрепить сгенерированную на лету строку base64 изображения к html img элемент?
Шаги:
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 поверь мне, я не хочу этого, но стек скажи мне добавить больше деталей, но я добавлю как можно больше, просто не позволяй мне публиковать вопрос
Пожалуйста, обрежьте свой код, чтобы было легче найти вашу проблему. Следуйте этим рекомендациям, чтобы создать минимально воспроизводимый пример.
ВО ФРАГМЕ КОДА НАЖМИТЕ НА ИЗОБРАЖЕНИЕ" - и что дальше? Что должно произойти? Вы могли бы добавить правильное объяснение того, что должен делать ваш скрипт, вместо того, чтобы добавлять элементы копирования и вставки в конец вашего вопроса.
@CBroe, я добавил, сэр, нажмите на изображение, загрузите любое изображение, а затем оно преобразуется в base64 и вставляется в то же изображение, которое вы выбрали из 1 шага. Но когда он проходит, он не работает, но когда проходит тот же base64 вручную, он работает
Отвечает ли это на ваш вопрос? Как отображать изображения Base64 в HTML
Внимательно посмотрите на конец этой строки, похоже, там какой-то ложный текст.
@PeterKrebs, прежде чем пытаться помочь прочитать вопрос, то, что вы показали, не имеет ничего похожего на то, что мне нужно.



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


Вам нужно дождаться загрузки изображения.
Лучше измените <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>