In un notebook IPython, ci si aspetterebbe che il codice seguente causi il caricamento rapido di Raphael.js nello spazio dei nomi globale.Come caricare Raphael all'interno del notebook IPython, evitando alcuni problemi dovuti a require.js?
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])
Tuttavia, non funziona nelle versioni recenti di IPython che utilizzano require.js. Risulta, Raphael.js, che IPython carica utilizzando jQuery.getScript()
, riconosce la presenza di require.js e come tale non si inserisce nello spazio dei nomi globale. Infatti, se si esegue per la prima volta il codice javascript rimuovendo l'oggetto , Raphael non si rende più conto che require.js è presente e si inserisce nello spazio dei nomi globale come vorrei. In altre parole, il codice precedente funziona dopo aver eseguito il seguente:
Javascript('window.define = undefined;')
Così, l'unico modo in cui sono in grado di ottenere Raphael per caricare all'interno di una versione recente di IPython notebook è di eliminare (o messo da parte) window.define
.
Dopo aver identificato il problema, non ho familiarità con require.js per sapere quale parte del software sta agendo contro il protocollo. Raphael sta usando un modo scadente di test per l'esistenza di require.js? Se IPython utilizza direttamente require.js invece di jQuery.getScript()
quando carica le librerie javascript fornite dall'utente? O c'è un modo in cui l'utente dovrebbe abbracciare require.js, che mi darà l'oggetto Raphael
senza bisogno di alcun hack speciale? (Se la risposta all'ultima domanda è sì, c'è un modo per supportare anche le versioni precedenti del notebook IPython, che non usano require.js?)
In realtà, anche caricando raphael.js attraverso i risultati di '$ .getScript()' in ReferenceError: eve non è definito. Sembra che Raphael si aspetti che 'eve' sia nello spazio dei nomi globale, ma non è collocato lì da eve (che fa anche parte di raphael.js) se require.js è presente. –
Allora non ne ho idea. Fa parola se caricato manualmente nella pagina con 'require'? se è così, pubblica uno snippet di JS che invece di usare 'lib =' kw. – Matt
Ho provato a caricare con 'require', ma senza fortuna. Il comando corrente che sto usando (su una riga) è 'Javascript (" require.config ({paths: {Raphael: 'https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min .js '}}); require ([' Raphael '], function (raph) {window.Raphael = raph;}); ")' –