在IPython笔记本中,可以预期以下代码会导致Raphael.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])
但是,它在使用require.js的最新版本的IPython中不起作用。事实证明,IPython使用jQuery.getScript()
加载的Raphael.js识别出require.js的存在,因此不会将自身插入到全局命名空间中。实际上,如果首先运行javascript代码删除window.define
对象,Raphael就不再意识到require.js存在,并且它会根据我的意愿将自身插入到全局命名空间中。换句话说,上面的代码在运行以下代码后起作用:
Javascript('window.define = undefined;')
因此,我能够在最新版本的IPython笔记本中加载Raphael的唯一方法是删除(或预留)window.define
。
确定问题后,我对require.js不太熟悉,知道哪些软件对协议起作用。拉斐尔是否使用了一种糟糕的方法来测试require.js的存在?在加载用户提供的javascript库时,IPython是否应该直接使用require.js而不是jQuery.getScript()
?或者有一种方式我作为用户应该拥抱require.js,这将给我Raphael
对象,而不需要任何特殊的黑客攻击? (如果上一个问题的答案是肯定的,有没有办法我也可以支持旧版本的IPython笔记本,它们不使用require.js?)
答案 0 :(得分:4)
我的回答的第一部分不会让你高兴,但是IPython-notebook-webapp中javascript库的加载和要求还没有解决,所以现在我建议不要在假设上建立很多您可以像这样加载库,现在更多地依赖custom.js.
话虽这么说,如果raphael不在全局命名空间中,则需要足够智能来缓存它,并为您提供引用。然后在回调中,您只需分配给全局:
require(['raphael'],function(raph){ window.raphael = raph; })
或类似的东西应该可以解决问题。