4

我正在尝试在我的 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 库?

4

1 回答 1

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 中 - 请注意,该库仅提供蜘蛛猴的说明,而不是 V8。即这将是棘手的。

因此,正如我所见,您有以下选择(按照复杂性和/或所需技能的增加顺序):

  1. 有人显然已经在下面的线程中解决了 python 的这个问题,但显然使用了一些使用 OTR 的矩形近似 - 请参阅他在接受答案的评论中的 github 链接。我会检查一下并确定近似值是否足够好。在没有互联网访问的情况下查找国家/地区的 GPS 坐标
  2. 切换到基于浏览器的环境并直接使用传单。
  3. 切换到 node.js 并使用 rclark 的端口。
  4. 尝试以某种方式将 DOM 放入您的 PyV8,可能使用 andreasgal,然后从那里使用传单。
  5. 调整传单以满足您的需求,使其不再具有任何 DOM 依赖项(首先使用诸如if (typeof(window) === 'object' && window !== null){...}.其他人可能会从你的工作中受益。
于 2014-04-16T05:40:18.357 回答