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