Ich möchte den Hintergrund in JS dynamisch ändern und meine Bilder sind in Base64-codiert. Ich versuche:
document.getElementById("bg_image").style.backgroundImage =
"url('http://amigo.com/300107-2853.jpg')";
mit perfektem Ergebnis,
Trotzdem mache ich nicht dasselbe mit:
document.getElementById("bg_image").style.backgroundImage =
"url('data:image/png;base64,iVBORw0KGgoAAAAAAAAyCAYAAAAUYybjAAAgAElE...')";
Noch
document.getElementById("bg_image").style.backgroundImage =
"data:image/png;base64,iVBORw0KGgoAAAAAAAAyCAYAAAAUYybjAAAgAElE...";
Gibt es eine Möglichkeit, dies zu tun?
javascript
base64
background-image
Igor Savinkin
quelle
quelle
url('
sollte funktionieren, mein Problem war, dass die ActionScript dataURL tatsächlich Zeilenumbrüche hatte, und ich musstereplace(/\n/g, '')
Antworten:
Ich habe versucht, dasselbe wie Sie zu tun, aber anscheinend funktioniert backgroundImage nicht mit verschlüsselten Daten. Als Alternative schlage ich vor, CSS-Klassen und den Wechsel zwischen diesen Klassen zu verwenden.
Wenn Sie die Daten "on the fly" generieren, können Sie die CSS-Dateien dynamisch laden.
CSS:
.backgroundA { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDUxRjY0ODgyQTkxMTFFMjk0RkU5NjI5MEVDQTI2QzUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDUxRjY0ODkyQTkxMTFFMjk0RkU5NjI5MEVDQTI2QzUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENTFGNjQ4NjJBOTExMUUyOTRGRTk2MjkwRUNBMjZDNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENTFGNjQ4NzJBOTExMUUyOTRGRTk2MjkwRUNBMjZDNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuT868wAAABESURBVHja7M4xEQAwDAOxuPw5uwi6ZeigB/CntJ2lkmytznwZFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYW1qsrwABYuwNkimqm3gAAAABJRU5ErkJggg=="); } .backgroundB { background-image:url("data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmdakyH5BAQUAP8ALAAAAABQAA8AAAPbWLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVrApTYWy5FKM1IQe+Mp+L4rphz+qIOBAUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHiMGb5KTkpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxMAF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs="); }
HTML:
<div id="test" height="20px" class="backgroundA"> div test 1 </div> <div id="test2" name="test2" height="20px" class="backgroundB"> div test2 </div> <input type="button" id="btn" />
Javascript:
function change() { if (document.getElementById("test").className =="backgroundA") { document.getElementById("test").className="backgroundB"; document.getElementById("test2").className="backgroundA"; } else { document.getElementById("test").className="backgroundA"; document.getElementById("test2").className="backgroundB"; } } btn.onclick= change;
Ich habe hier herumgespielt, den Knopf gedrückt und es wird den Hintergrund der Divs wechseln: http://jsfiddle.net/egorbatik/fFQC6/
quelle
#ancestor.backgroundA .Change{background-image:...}
und#ancestor.backgroundB .Change{background-image...}
, wo#ancestor
ist die ID des gemeinsamen Vorfahren, und.Change
ist die Klasse, die auf alle Elemente angewendet wird, auf die einer der Hintergründe angewendet werden soll.Hatte das gleiche Problem mit base64. Für alle in der Zukunft mit dem gleichen Problem:
url = "data:image/png;base64,iVBORw0KGgoAAAAAAAAyCAYAAAAUYybjAAAgAElE...";
Dies würde über die Konsole ausgeführt, jedoch nicht über ein Skript:
$img.css("background-image", "url('" + url + "')");
Aber nachdem ich ein bisschen damit gespielt hatte, kam ich auf Folgendes:
var img = new Image(); img.src = url; $img.css("background-image", "url('" + img.src + "')");
Keine Ahnung, warum es mit einem Proxy-Image funktioniert, aber es funktioniert. Getestet auf Firefox Dev 37 und Chrome 40.
Hoffe es hilft jemandem.
BEARBEITEN
Ein bisschen weiter untersucht. Es scheint, dass manchmal die Base64-Codierung (zumindest in meinem Fall) aufgrund von Zeilenumbrüchen im codierten Wert mit CSS unterbrochen wird (in meinem Fall wurde der Wert dynamisch von ActionScript generiert).
Einfach mit zB:
$img.css("background-image", "url('" + url.replace(/(\r\n|\n|\r)/gm, "") + "')");
funktioniert auch und scheint sogar einige ms schneller zu sein als die Verwendung eines Proxy-Images.
quelle
Versuchen Sie dies, ich habe Erfolgsreaktion .. es funktioniert
$("#divId").css("background-image", "url('data:image/png;base64," + base64String + "')");
quelle
data:image/png;base64
es lang ist und die Zeichenfolge als jquery-Variable definiert ist, dann funktioniert es nicht. Funktioniert aber, wenn der String als PHP-Variable definiert ist, wie das PHClaus-Beispiel .... Nur Infos zu dem, was ich getestet habeHinzufügen dieses Tricks zu Gabriel Garcias folgender Lösung:
var img = 'data:image/png;base64, ...'; //place ur base64 encoded img here document.body.style.backgroundImage = 'url(' + img + ')';
In meinem Fall funktionierte dies jedoch nicht. Das Verschieben der URL in die Variable img hat den Trick getan. SO sah der endgültige Code so aus
var img = "url('data:image/png;base64, "+base64Data + "')"; document.body.style.backgroundImage = img;
quelle
Ich habe es versucht (und für mich gearbeitet):
var img = 'data:image/png;base64, ...'; //place ur base64 encoded img here document.body.style.backgroundImage = 'url(\'' + img + '\')';
ES6-Syntax:
let img = 'data:image/png;base64, ...' document.body.style.backgroundImage = ´url('${img}')´
Ein bisschen besser:
let setBackground = src=>{ this.style.backgroundImage = `url('${src}')` } let node = nodeIGotFromDOM, img = imageBase64EncodedFromMyGF setBackground.call(node, img)
quelle
Was ich normalerweise mache, ist, zuerst die vollständige Zeichenfolge in einer Variablen zu speichern, wie folgt:
<?php $img_id = 'data:image/png;base64,iVBORw0KGgoAAAAAAAAyCAY...'; ?>
Dann, wo ich möchte, dass entweder JS etwas mit dieser Variablen macht:
<script type="text/javascript"> document.getElementById("img_id").backgroundImage="url('<?php echo $img_id; ?>')"; </script>
Sie können dieselbe Variable über PHP direkt referenzieren, indem Sie Folgendes verwenden:
<img src="<?php echo $img_id; ?>">
Funktioniert bei mir ;)
quelle
Dies ist der richtige Weg, um einen reinen Anruf zu tätigen. Kein CSS.
<div style='background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAFCAYAAABW1IzHAAAAHklEQVQokWNgGPaAkZHxPyMj439sYrSQo51PBgsAALa0ECF30JSdAAAAAElFTkSuQmCC)repeat-x center;'></div>
quelle
Ich denke, dies wird helfen, Base64 wird von CSS auf eine andere Weise angesprochen. Sie sollten den Datentyp des Bildes auf base64 setzen. Dies wird dem CSS helfen, das base64 in image zu ändern und es dem Benutzer anzuzeigen. und Sie können dies aus Javascript heraus verwenden, indem Sie das Hintergrundbild mithilfe des JQuery-Skripts zuweisen. Dadurch wird die Base64 automatisch in Magier geändert und angezeigt
url = "data:image;base64,"+data.replace(/(\r\n|\n|\r)/gm, ""); $("body").css("background-image", "url('" + url.replace(/(\r\n|\n|\r)/gm, "") + "')");
quelle
In meinem Fall war es nur, weil ich das
height
und nicht eingestellt habewidth
.Aber es gibt noch ein anderes Problem.
Das Hintergrundbild kann mit entfernt werden
element.style.backgroundImage=""
konnte aber nicht mit eingestellt werden
element.style.backgroundImage="some base64 data"
Jquery funktioniert gut.
quelle