我试图在我的Python代码中使用leaflet.js库的一些功能。并且为了在代码中执行JS命令,我正在使用PyV8。但我无法将leaflet.js库加载到PyV8上下文中。当我这样做时,
ctxt.eval(open("leaflet.js").read())
我收到错误:
ReferenceError: window is not defined ( @ 9 : 68 ) -> of t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,doc
我甚至尝试加载jquery库,然后才想到传单可能依赖于它。但后来我得到了错误,
TypeError: Cannot read property 'defaultView' of undefined ( @ 2 : 68 ) -> :!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultVi
有没有办法可以成功加载JS库?
答案 0 :(得分:3)
您只能使用不依赖于DOM的库,因为它显然不是服务器端可用的。这种通用的库的一个例子是mustache.js。
编辑:看起来有一种方法,显然传单在没有DOM的情况下仍然有用 - 首先必须在某种程度上重新创建DOM,正如这位好人在这里展示的那样:https://github.com/rclark/server-side-leaflet。注意:不确定这是否与PyV8一起使用,你只需要尝试。
Edit2:在前一点上稍微扩展一下:你使用PyV8得到的是一个纯粹的非基于浏览器的javascript运行时环境。它不知道'窗口'或'文档'是什么,因为V8不关心UI。 Leaflet需要DOM来运行,因此它需要“思考”它存在于浏览器中。 rclark的服务器端传单需要node.js特定扩展,因此它在PyV8中不起作用。
这个javascript DOM实现可能在PyV8中工作:https://github.com/andreasgal/dom.js/。您必须以正确的顺序将所有提供的js源加载到PyV8中 - 请注意,此库仅提供spidermonkey的说明,而不是V8。即为了做到这一点,这将是棘手的。
所以,正如我所看到的,你有以下选择(按照增加的复杂性和/或技能要求):
if (typeof(window) === 'object' && window !== null){...}
。如果您使用此工作,我会制作一个请求传单项目,因为许多其他人可能会从您的工作中获益。