ich habe das Problem, dass ich bestimmte Werte in einer SAP Datenbank abfragen möchte, was auch funktioniert.
Leider muss ich jede Abfrage 2 mal durchführen um das richtige Ergebnis zu erhalten.
Nach Neuladen der Seite bekomme ich beim ersten Klick auf den Button immer undefined und beim 2. Klick erst mein Ergebnis.
Wiederhole ich das mit anderen Daten ohne die Seite neu zu laden, bekomme ich immer erst den alten abgefragten Wert und bei erneuten Klick erst die gewünschten Ergebnisse.
Frontend
'use strict';
document.getElementById("anzeige").addEventListener("click",function(){
var mat = document.getElementById("mat").value
var lgort = document.getElementById("lgort").value
var mhd = document.getElementById("mhd").value
var data = {
"material" : mat,
"lagerort" : lgort,
"mhd" : mhd
};
const options = {
method: 'POST',
headers:{ 'Content-Type': 'application/json' },
body:JSON.stringify(data)
};
postfile(options);
});
async function postfile(options){
const response = await fetch('/zwmbestand',options);
const data = await response.json();
console.log(data);
}
Backend
'use strict';
var express = require('express');
var sap = require('./zbestand.js');
var router = express();
router.post('/zwmbestand',async (req,res,next) => {
let result = await sap.bestandquery(req.body);
res.send(`${result}`);
});
module.exports = router;
DB Abfrage sap.Bestandsquery
module.exports = {
bestandquery : function(body){
var dbConnection = hana.createConnection();
select = SQL Abfrage
// aktuelles select auslesen
dbConnection.connect(connOptions, async function (err) {
if (err) console.log(err);
var han = await dbConnection.exec(select);
datatransport = JSON.stringify(han, null, 2);
});
dbConnection.disconnect();
return datatransport;
},
};
Hallo,
ich hoffe inständig mich kann Jemand von meinem Leiden erlösen... oder mir zumindest Rat geben :-)
Folgendes :
Ich werkle an einer Chrome Extension für eine Rouletteseite rum und es hapert am Javascriptpart.
die manifest.json und direkt extension bezogenen sachen sind nicht das Problem (bis jetzt).
Konkret habe ich einerseits einen eventlistener auf einem canvas element eingebaut.
zum anderen habe ich mittels
(function(xhr) {
var XHR = XMLHttpRequest.prototype;
var open = XHR.open;
var send = XHR.send;
var setRequestHeader = XHR.setRequestHeader;
XHR.open = function(method, url) {
this._method = method;
this._url = url;
this._requestHeaders = {};
this._startTime = (new Date()).toISOString();
return open.apply(this, arguments);
};
XHR.setRequestHeader = function(header, value) {
this._requestHeaders[header] = value;
return setRequestHeader.apply(this, arguments);
};
XHR.send = function(postData) {
...
})(XMLHttpRequest);
abgeändert, was bei Auftauchen einer XMLHttpRequest passiert.
Konkret werden darin, abhängig vom Inhalt dees Response Bodys, diverse globale Variabeln sowie Attribute mancher Objekte geändert.
Jetzt versuche ich verzweifelt, abseits davon, einen in der Theorie simplen Codeblock hinzukriegen, eine Art "Controls Setup" wie man in aus diversen games kennt:
Gegeben ein String Array.
Gehe die Elemente des Arrays der Reihe nach durch (for loop halt)
und mache für jedes diese 3 Schritte:
1. ändere den innerText eines bestimmten divs auf das String Element ab (Damit auf der Seite sowas wie "Drücke schießen Taste" steht)
2. Warte bis ein click erfolgt.
3. nutze koordinaten des klicks, zusammen mit dem element string, um beides in einer liste zu speichern
Damit ich am Ende vom Lied eine Liste von Strings mit zugehörigen x,y koordinaten habe.
Schritt 1 ist mehr nutzerfreundlichkeit, dmait man weiß worauf man als nächstes klicken soll.
simpel in der theorie, oder?
problem nur:
ich habe keine Ahnung wie ich schritt 2 hinbekomme.
vor allem, dass javascript nicht einfach mit der näcshten iteration oder so weitermacht bevor der gerade benötgte klick reingekommen ist.
Ginge es nur drum 2 sekunden zu warten, könnte man ein await sleep() mit passender async sleep function und settimeout darin nutzen.
Aber wie wartet man bitte auf das geschehen eines clicks bzw. dass der zugehörige eventlistener abfeuert?
------------------------------------------------------------------------------------------------------------------------------------------------
Der aktuelle (Fehl?)versuch:
Ich wollte mir vom allmächtigen Chatgpt helfen lassen und habe nun folgendes gemacht:
Im click eventlistener, sowie im passenden Teil des xhr konstrukts,
werden erst die dortigen befehle wie bisher ausgeführt und zum abschluss ein customevent mit passendem namen gebaut und mit dispatchevent() auf den weg geschickt.
Heißt also, je nachdem was passiert (click, xhr request mit "hund" im responsebody, etc.), wird ein ganz bestimtmes customevent getriggert.
Dann habe ich noch eine neue funktion gebaut bzw. chatgpt hat gebaut:
mit await A() sollte nun folgendes passieren:
erst wird 1 gedruckt auf die konsole.
dann sind wir am punkt wo wir einen click abwarten wollen.
dann wird also waitforcustmevent("click") ausgeführt, es wird also auf das window element ein orübergehender event listener geklatscht und gewartet bis ein click erfolgt, dann wird der eventlistener wieder entfernt.
dann wird die nächste zeile in A ausgeführt, also "2" auf die konsole gedruckt.
So sollte es in der theorie möglich sein, mitten zwischen (sync) code zeilen überall diese zeile einzubauen und der code hält dort an und läuft nicht weiter bis der click da ist. kurzum, zwangsweise den code anhalten bis ein bestimmtes customevent reingekommen ist.
Gleiches im prinzip mit den httprequests, nur heißen dort die customevents anders.
funcktioniert das generell so?
chatgpt braucht man nicht fragen, das sagt immer "You are right, I was wrong" egal was man fragt.
Und ein daraus aber wieder resultierendes problem:
da await drin vorkommt, ist A folglich async und wir müssen wiederum await beim Aufruf von A davor packen.
Was die Funktion, die A aufruft, auch wieder async macht.
Dadurch muss ich faktisch ALLES in meinem code async machen, constructor, funktionen ,etc. pp.
Weil halt auf Umwegen Alles Alles andere früher oder später mal aufruft.
Gibts da einen Weg das zu umgehen?
weil mir ja eigentlich nur wichtig ist, dass der code genau an den stellen anhält wo ich auf das bestimmte custom event warte.
der rest kann ja ruhig synchron laufen.
nur zwingt mich ein einzelnes await ja schon ,alles von ganz unten bis ganz oben in der funktionenaufrufhierarchie async zu machen und zu "awaiten".
chatgp konnte keine wirkliche Lösung nennen ausser "lass das await weg. dann hast du halt aber ein promise und noch keinen Wert, das du später dann doch awaiten musst".
also keine lösung.
Javascipt kann Dinge, die PHP nicht kann. Und ich kann Javascript nicht. Darum frage ich hier um Hilfe:
Ich brauche eine Funktion, die eine Abbildung so anzeigt, wie HTML es mit der Anweisung "<img class='full' src='foto.jpg'>" tun würde.
Wie sollte ich den folgenden Code ergänzen, um das zu erreichen?
ist es bereits möglich Daten lokal auf dem Rechner zu speichern?
Das mit localStorage finde ich soweit super und würde es verwenden, doch was ist wenn der Cache mal gelöscht wird? Alle Daten futsch, das würde ich gerne verhindern.
Eine kleine Textdatei würde vollkommen ausreichen oder eine HTML-Datei, Excel Tabelle, Word...vollkommen wurscht.
Der Speicherort ist bekannt und der Weg über ein Input, das irgendwo hochladen wie es viele BSP zeigen, ist leider keine Option.
Hat da jemand eine Idee wie ich das umsetzen kann?
hab da mal eine allgemeine Frage zu JavaScrit, FireFox und Visual Studio Code.
Ich arbeite mich im Moment mit einem "Lehrbuch" in die Thematik ein und frage mich dabei oft, "Warum wird genau der selbe Code (Lösung) korrekt ausgeführt und mein erstellter Code nicht?"
Das ist jetzt schon das drittemal und nach stunden langen Abgleichen der Dokumente, gibt es keine Fehler mehr. In meinem Code stehen die selben Anweisungen und er sieht auch nicht anders aus, aber der wird nicht richtig ausgeführt. Während der Code aus Lösung problemlos funktuniert, wie er es vorgesehen ist.
Kann mir mal Jemand dazu etwas erzählen? In C und C++ gab es keine solche Probleme, da funktionierte dann auch mein Code. Und zwar auch dann, wenn er ein wenig von der Lösung abwich.
Ist JavaScipt vielleicht noch nicht so ausgegoren wie C und C++ oder woran liegt das?
ist es möglich ein Word-Dokument zu öffnen, Textbausteine zu suchen und zu ersetzen?
Das ganze muss nicht gespeichert werden. Möchte nur vorhandene Word-Dokumente als Vorlage nutzen und automatsch ausfüllen, anschließend ausdrucken und schließen.
Das selbe mit einer Excel-Datei.
Wäre super wenn es eine Möglichkeit gibt, habe leider nix im Netz gefunden.
die Plattform »eifelkrimi.de« präsentiert nicht nur Bücher und Autoren, sondern auch Filme und TV-Serien, die seit den dreißiger Jahren in der Region gedreht worden sind.
Als besonderer »Eyecatcher« wird eine horizontale Zeitleiste am oberen Seitenrand auf das Jahr der Veröffentlichung bewegt - allerdings bisher noch viel zu schnell.
Beispiel: https://www.wackerberg.de/tatort/maik.php
Die Anweisung --- document.body.style.scrollBehavior = 'smooth; --- reicht für den gewünschten Effekt offensichtlich nicht aus. Statt dessen würde ich gerne einen Parameter mit der gewünschten Zeitdauer der Bewegung einführen (z.B. 4.000 Millisekunden) und zusätzlich eine Art »ease-in-out« nutzen.
In den bestehenden Code (s.u.) soll diese Funktionalität mit ein paar Zeilen JavaScript/JQuery integriert werden. Dazu fehlen mir als absoluter Anfänger und »Nicht-Programmierer« jedoch die Fähigkeiten.
<script type="text/javascript">
let timelineYear = 2018
let paddingRight = 136
let delayForScriptToRun = 1000// ms
const ScrollTimelineYearIntoView = (timelineYear, paddingRight) => {
document.body.style.scrollBehavior = 'smooth;'
let timelineDiv = document.getElementsByClassName("timelines-years")[0]
let targetParent = document.getElementById(timelineYear)
let targetSpan = targetParent.getElementsByTagName("span")[0];
let getDistance = function (){ return window.innerWidth - $(targetParent).position().left - paddingRight}
targetSpan.className="rot"
timelineDiv.scrollBy({
left: getDistance() < 0 ? -getDistance() : 0,
behavior: 'smooth'
});
}
$(document).ready(function(){
setTimeout(ScrollTimelineYearIntoView(timelineYear, paddingRight), delayForScriptToRun);
console.debug(`ScrollTimelineYearIntoView(${timelineYear}, ${padding}), ${delayForScriptToRun})`)
});
</script>
Hallo zusammen,
ich bin ganz neu hier und auch nicht der Javascript-Profi!
Ich verzweifle gerade an meinem Script.
Ich habe mir eine html/Javascript Datei gebaut, bei dieser gibt es ein Bild (image.png) auf diesem werden per input type Namen eingegeben und mit canvas Namen auf dem Bild platziert. Es klappt auch alles ganz Prima, das Problem ist, ich habe noch einen Dowload-Button eingebaut, mit dem man das neu generierte Bild mit den Namen herunterladen können soll. Nur dieser will einfach nicht, es passiert nichts! Es wird nur Lokal auf meinem Rechner ausgeführt, es gibt keine Webseite.
Hier kommt mal mein Code HTML: