• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Return x oder Blöcke komplett kapseln?

Elma

New member
Hi.

Beim Programmieren stelle ich mir gerade folgende Frage:
Ich habe mehrere "Befehlsblöcke" in einer Funktion, die nur korrekt arbeiten, wenn Daten zuvor gelesen wurden.

Ich habe nun folgende Möglichkeiten:

In den Blöcken die Ausführung der Funktion mit Return +Fehlercode abbrechen:

Code:
var imgdata=input.getElementsByTagName("img")[0];
if (!imgdata) return 1;
// Datenverarbeitung

Alternativ könnte ich auch folgendes machen:
Code:
var imgdata=input.getElementsByTagName("img")[0];
if (imgdata) {
    // Datenverarbeitung
}

Ist es überhaupt guter Stil, mit Return aus der Funktion zu gehen, und einen Fehlercode damit zu übermitteln? Oder ist es ehr dafür gedacht, das Ergebnis einer Funktion zu übermitteln?

LG
 
Ist es überhaupt guter Stil, mit Return aus der Funktion zu gehen, und einen Fehlercode damit zu übermitteln? Oder ist es ehr dafür gedacht, das Ergebnis einer Funktion zu übermitteln?
das ergebnis einer funktion kann auch ein fehler sein, allerdings frage ich mich hier:

Ich habe mehrere "Befehlsblöcke" in einer Funktion, die nur korrekt arbeiten, wenn Daten zuvor gelesen wurden.
warum die daten nicht gelesen wurden.
wenn du meinst, dass etwas bei der übertragung der daten schiefgegangen ist, dann sollte eher die funktion welche die daten besorgt einen fehler zurückgeben

einen fehler zurückgeben macht auch nur sinn, wenn man diesen auswertet und darau reagiert. sprich bei deinem beispiel ist es vermutlich eher die 2. variante. du machst etwas in abhängigkeit des vorhandenseins eines elementes. das ist in dem sinn ja kein fehler.
 
Es geht um eine DataLoader Funktion. Wenn die Daten noch nicht fertig geladen sind, gibts einen Fehler, und es soll dann nach 500ms Pause erneut versucht werden, bis eine maximale Anzahl von Versuchen überschritten ist.
 
Hi.

Die Funktion sieht derzeit so aus:

HTML:
var trys=0;

function checkImage() {
    console.log("checkimage aufgerufen");
    imgdata=input.getElementsByTagName("img")[0];

    var srcProto
    if (imgdata) {
        srcProto=imgdata.src.split(':')[0];
        }
    else if (trys < 10)
    { 
        trys++;
        setTimeout(checkImage, 500);

    }
    if (srcProto =="data" ) {
        drawImg();
        //Alles löschen
        while (input.firstChild) {
            input.removeChild(input.firstChild);
        }
    }
    else {
        console.log("Bild kein DataURL!")
        return -1;
    }
}


Die Funktion wird über den Mutation Observer aufgerufen, wenn sich die ChildList vom Input-Div ändert.
In Chrome wird das Bild über die Clipboard API ausgelesen und per JS in das Input Div eingefügt.
In Firefox wird es als natives Paste in das content editable div eingefügt.

Dann ruft der Mutation Observer eine Funktion auf, die wiederum meine CheckImage Funktion aufruft.
Leider ist es so, dass das Div noch nicht die Bilddaten enthält, wenn der Mutation Observer schon feuert.
Ich habe zunächst mit einer festen Verzögerung von 200ms vor dem Aufruf von CheckImage gearbeitet. Aber bei größeren Bildern reicht die Zeit nicht. Deswegen sollen mehrere Ladeversuche unternommen werden.
Sollte dies fehlschlagen, oder der Datentyp nicht korrekt sein, soll abgebrochen werden und durch die aufrufende Funktion ein Fehlerbild gezeigt werden. Hat alles geklappt, wird das bearbeitete Bild aus dem Canvas gezeigt.

Gibt es vielleicht einen Callback, der (im Gegensatz zum Mutation Observer) erst gefeuert wird, wenn eine Dom Manipulation komplett abgeschlossen ist? Der wäre vielleicht besser geeignet.

LG
 
Ja, image.onload wäre was. Aber geht das auch bei img Tags, welche durch das System angelegt werden? (Bei Paste in Content Editable Div im Firefox)?
 
das problem könnte sein, das das onload schon feuert ehe du den eventhandler registriert hast. das musst du abfangen
 
Dieser Link rockt zum Thema Bildupload hier wird auch erklärt wie man Bilder vor dem Upload im Browser anzeigen kann mit data-url.

warum muss das div contenteditable sein?
 
Hi.
Beim Paste Event direkt klappt es nicht. Da sind die Daten noch nicht ganz da beim Firefox. Man muss eine Verzögerung in irgend einer Art und Weise einbauen.

- - - Aktualisiert - - -

@andreax Danke für den Link, ist sehr interessant
 
Hi.
Bin noch nicht mal sicher, ob es ein Bug ist.
Firefox stellt ja keine Bilddaten im clipboardData Objekt bereit. Laut den Entwicklern mit Absicht, da der Zugriff auf solche Daten aus der Zwischenablage aus Datenschutzgründen nicht vorgesehen ist.
Über ein "Workaround" mit einem Content Editable Div kommt man trotzdem ran, weil in das Content Editable Div "Nativ" über das Betriebssystem gepastet wird.
Das funktioniert sogar noch in älteren IEs die die Clipboard API gar nicht unterstützen.

Allerdings kann man nicht über das Paste Event zugreifen, welches zwar feuert aber im Falle eines Bildes nur einen leeren Textknoten beinhaltet.

Man müsste also die Überwachung am Content Editable DIV vornehmen und dort andere, geeignete Events registrieren. (z.B. mutation Events).
Da muss man aber auch geeignete Maßnahmen ergreifen, da das Mutation Event auch schon feuert, sobald das IMG Tag eingefügt wurde, aber der Inhalt noch nicht vollständig geladen ist.
Eventuell kann man dort ein onload Event auf das noch leere IMG Tag registrieren, und die Paste Verarbeitung dann im Onload Event machen.
 
Wenn es doch irgendeinen Weg gibt, diese Informationen zu bekommen, dann hilft doch der Datenschutz nicht wirklich was...
 
Klar.
Im Bugtracker von Firefox wurde schon mehrfach und vor längerer Zeit als vermeintlicher Bug gepostet, dass die Bilder nicht über clipboardData auslesbar sind. Als Antwort kam da dann das mit dem Datenschutz. Also dass es kein Bug sondern ein "feature" aus Datenschutzgründen ist.
Man kann wohl über irgendwelche Config Files das manuell freigeben. Aber das kann man von Usern einer Webseite nicht erwarten. Also muss man den Workaround mit dem Content Editable DIV verwenden, mit dem man dann ganz nebenbei auch noch die Fallback Lösung für den Internet Explorer erledigt hat.

Bei Google Chrome kommt man problemlos an die Daten ran. Bei Edge funktioniert keiner der beiden Wege. Weder die Clipboard API noch ein natives Paste in ein Content Editable DIV. Da muss man wohl irgendwas über ActiveX o.ä machen. Bei Edge ist aber die Implementation der Clipboard Api von Microsoft angekündigt, so dass ich bei Edge einfach abwarte.
 
Hi.

Also der Input Event Listener kommt langsamer als der mutation Observer. Bei einem Input Event Listener reichts zeitlich meißtens schon um das Bild im Div auszulesen und in ein Canvas zu übertragen.

Ich arbeite ja an einem Bilder Uploader, der neben normalem File Upload auch Webcam Snapshots und Screenshots unterstützen soll (Um dem User es bequem zu machen)
 
Zurück
Oben