Comments (7)
from jshero.
Dazu hätte ich eine Idee: Kannst du nicht zur Code-Ausführung einen iFrame platzieren und darin einen Script-Tag erzeugen, in welchen du den Code injizierst? Dann sparst du dir eval
und hast den Vorteil dass aufgrund des iFrame der Code etwas abgeschottet läuft.
Wenn du den Code dann noch dekorierst, wie z.b. hier:
(() => {
// ORIGINALER USERCODE HIER EINFÜGEN
// Hier kommen die Prüfroutinen:
if(typeof quersumme !== 'function'){
jsheroApi.reportError('quersumme ist keine Funktion!');
}
})();
Dann kannst du deine Prüfroutinen einfach unter den User-Code kleben und im gleichen Scope ausführen. Calls zu jsheroApi
wären dann dafür zuständig Nachrichten aus dem iFrame heraus nach "oben" zum Kurs zu kommunizieren.
from jshero.
Daran habe ich noch garnicht gedacht (also Code im iFrame laufen lassen). Allerdings führe ich das eval in einem Webworker aus, um Endlosschleifen abzufangen. Geht das auch mit iFrames? Also das ich in der Hauptseite das IFrame nach x Sekunden abschieße, wenn es kein Ergebnis liefert? Sollte eigentlich.
Bisher dachte ich, etwas sowas zu machen (alles in dem Webworker):
Zuerst ein leeres export Objekt zu definieren. In den Koans selber neben den Tests ein export-Feld hinzuzufügen. Dieses Export-Feld enthält den Namen der zu testenden Funktion. An den User-Code würde ich dann etwas folgende Zeile anfügen (als String):
export.functionUnderTest = koan.export;
... und den User-Code inklusive dieser Zeile in eval ausführen. Dann müsste ich nach dem eval über export.functionUnderTest auf die zu testende Funktion zugreifen können.
(Allerdings muss ich manchmal mehr als nur die zu testende Funktion exportieren. Z.B. Koan #69: Funktionen benutzen Funktionen)
Was ist besser?
from jshero.
Naja, das kommt drauf an was dir am Wichtigsten ist...
Ich denke dass auch eine Endlosschleife im iFrame den Tab mit dem Kurs aufhängen würde. Allerdings hast du das Problem, dass du im Webworker komplett vom Browser abgeschottet bist. Das heisst keinerlei Zugriff auf den DOM und/oder window. Also auch sowas wie console.log gibts dann nicht.
Das mag genügen, wenn du einfach nur generell Javascript lehren willst. Aber damit schliesst du aus, dass du auch mal ein wenig auf die Browser API in Javascript eingehst.
from jshero.
Abfangen von Endlosschleifen ist ein 'Muss'. Mindestens bei Aufgaben, bei denen es um Schleifen geht.
Aber das mit der Browser API stimmt auch. Sowas habe ich im Kopf. Vielleicht muss ich dann beides machen: iFrame und webworker-eval.
from jshero.
Jep, dachte ich auch grade. Einmal in einen Webworker geben um Endlosschleifen zu erkennen und dann im iFrame ausführen.
from jshero.
Habe das jetzt mit eval gefixt. Es wird nicht mehr global-eval verwendet, sondern das normale eval. Der Testaufruf wird als String an den Übungscode angehängt und beides zusammen mit eval ausgewertet. Das Ergebnis des Testaufrufs wird durch das eval zurückgegeben.
Als positiven Nebeneffekt ist es nicht mehr möglich, im Übungscode eine Testcode-Variable zu überschreiben (theoretisch schon, praktisch aber wohl nicht). Mögliche Verbesserung wäre noch, eval im strict mode zu verwenden. Die Auswertung im iFrame behalte ich im Hinterkopf.
Nochmals vielen Dank für die Bug-Meldung!!!
from jshero.
Related Issues (20)
- Text in Lektion 3, Funktionen, verbessern! HOT 4
- 14. String: indexOf(): Test zu leicht bestanden HOT 5
- 9. Loggen: Die Hürde :-) HOT 9
- testutil.js in allen Übungen benutzen HOT 1
- assert_de_... und assert_en_ aus testutil ausbauen HOT 1
- Weitere Lektionen übersetzen HOT 1
- Weitere Lektionen hinzufügen HOT 1
- Semicolons HOT 3
- 11. String: toUpperCase(): Test error HOT 1
- 15. String: indexOf(), 2. Parameter HOT 1
- Rechtschreibfehler in Beschreibungstext [Datum und Uhrzeit ändern]
- Rechtschreibfehler in Beschreibungstext [Römische Zahlen I]
- Rechtschreibfehler in Code Beispiel [Methoden]
- Replace var by let and const HOT 1
- Local export/import.
- Add Exponentiation (**) koans.
- Quiz-Funktion HOT 1
- Extra-Aufgaben HOT 3
- Hinweis, wenn Javascript deaktiviert ist / Lizenz HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jshero.