7

在 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;')

因此,我能够让 Raphael 在最新版本的 IPython 笔记本中加载的唯一方法是删除(或搁置)window.define

发现问题后,我对 require.js 还不够熟悉,无法知道哪个软件违反了协议。Raphael 是否使用了一种糟糕的方式来测试 require.js 的存在?IPython 是否应该直接使用 require.js 而不是jQuery.getScript()在加载用户提供的 javascript 库时使用?或者有没有一种方法我作为用户应该接受require.js,它会给我这个Raphael对象而不需要任何特殊的技巧?(如果最后一个问题的答案是肯定的,有没有办法我也可以支持不使用 require.js 的旧版本的 IPython 笔记本?)

4

1 回答 1

4

我的回答的第一部分不会让你满意,但是 IPython-notebook-webapp 中 javascript 库的加载和要求尚未解决,所以现在我建议不要在你可以加载的假设下构建太多像这样的库,现在更多地依赖 custom.js。

话虽这么说,如果 raphael 不在全局命名空间中,require 足够聪明,可以缓存它,并为您提供参考。然后在回调中你可以分配给一个全局:

要求(['raphael'],函数(raph){ window.raphael = raph; })

或者类似的东西应该可以解决问题。

于 2013-10-21T06:59:53.773 回答