2013-10-21 6 views
6

In einem IPython-Notizbuch sollte der folgende Code Raphael.js veranlassen, erfolgreich in den globalen Namespace geladen zu werden.Wie kann ich Raphael in IPython-Notebook laden, um einige Probleme zu vermeiden, die aufgrund von require.js auftreten?

from IPython.display import Javascript 

raphael_url = "https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js" 
Javascript('alert(Raphael);', lib=[raphael_url]) 

Allerdings funktioniert es nicht in den letzten Versionen von IPython, die require.js verwenden. Es zeigt sich, dass Raphael.js, das IPython mit jQuery.getScript() lädt, das Vorhandensein von require.js erkennt und sich daher nicht selbst in den globalen Namespace einfügt. In der Tat, wenn man zuerst JavaScript-Code ausführt und das window.define Objekt entfernt, realisiert Raphael nicht mehr, dass require.js vorhanden ist, und fügt sich selbst in den globalen Namensraum ein, wie ich es möchte. Mit anderen Worten, funktioniert der Code oben nach dem folgenden ausgeführt wird:

Javascript('window.define = undefined;') 

So ich der einzige Weg, der Lage bin, Raphael innerhalb einer aktuellen Version von IPython Notebook zu laden zu bekommen, ist zu löschen (Seite oder setzen) window.define.

Nachdem ich das Problem erkannt habe, kenne ich require.js nicht genug, um zu wissen, welche Software gegen das Protokoll arbeitet. Benutzt Raphael eine schlechte Testmethode für die Existenz von require.js? Soll IPython require.js direkt anstelle von jQuery.getScript() verwenden, wenn es vom Benutzer bereitgestellte Javascript-Bibliotheken lädt? Oder gibt es einen Weg, den ich als der Benutzer require.js annehmen sollte, der mir das Raphael Objekt geben wird, ohne irgendwelche speziellen Hacks zu benötigen? (Wenn die Antwort auf die letzte Frage ja ist, gibt es eine Möglichkeit, ich kann auch ältere Versionen von IPython Notebook unterstützen, die require.js nicht verwenden?)

Antwort

4

Der erste Teil meiner Antwort wird Ihnen nicht gefallen, aber das Laden und die Anforderung von Javascript-Bibliothek in der IPython-Notebook-Webapp wurde noch nicht gelöst, so für jetzt würde ich vorschlagen, nicht zu viel auf der Annahme, dass Sie Bibliothek wie das laden, und verlassen Sie sich mehr auf custom.js für jetzt.

Wenn gesagt wird, wenn Raphael nicht im globalen Namespace ist, ist require intelligent genug, um es zu cachen und Ihnen einen Bezug darauf zu geben. Dann in den Rückruf können Sie einfach zu einem globalen zuweisen:

erfordern ([ 'raphael'], Funktion (raph) { window.raphael = raph; })

Oder so ähnlich sollte das tun Trick.

+0

Tatsächlich führt sogar das Laden von raphael.js durch '$ .getScript()' zu 'ReferenceError: eve is not defined'. Es scheint, dass Raphael erwartet, dass 'eve' im globalen Namespace ist, aber es wird nicht von eve (welches auch Teil von raphael.js ist) platziert, wenn require.js vorhanden ist. –

+0

Dann habe ich keine Ahnung. Wird das Wort manuell auf der Seite mit "require" geladen? Wenn ja, veröffentlichen Sie ein Snippet von JS, das es tut, anstatt 'lib =' kw zu verwenden. – Matt

+0

Ich habe versucht, mit 'require' zu ​​laden, aber kein Glück. Der aktuelle Befehl, den ich benutze (in einer Zeile), ist 'Javascript (require.config ({paths: {Raphael: 'https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min) .js '}}); require ([' Raphael '], Funktion (raph) {window.Raphael = raph;}); ")' –