【发布时间】:2019-03-02 21:32:53
【问题描述】:
在 Jupyter 输出单元格中,我无法使用其 id 检索新添加的 html 对象。我该怎么做?
编辑:我已经能够在 Azure 上托管的笔记本中复制相同的行为:
https://notebooks.azure.com/rickteachey/projects/sandbox/html/js_repr_id_access.ipynb
注意:要运行此笔记本,请单击右上角的Clone,然后在您自己的 Azure 项目/笔记本中运行它。
javacript 首先使用 Jupyter API 添加一个新的 html 按钮(即,element.html();在上下文中,element 指的是 Jupyter 输出单元格<div>)。
然后代码尝试使用document.getElementById()访问按钮:
class C:
def _repr_javascript_(self):
return f'''
element.html(`<button id="clearBtn">Clear</button>`)
var x = document.getElementById("clearBtn")
alert(x)
'''
C()
预期行为:警报应显示clearBtn html 按钮对象的字符串化版本。
实际行为:警报显示一个空对象,这意味着脚本无法获取 clearBtn - 即使我在查看源代码时可以在 DOM 中看到它。
我可能错误地使用了 API。如果是这样,我该怎么做?
另一个奇怪的问题:当我在 nbviewer 上查看同一个笔记本时,警报会按预期弹出 clearBtn html 对象。它在我的本地计算机或 Azure 上不会以这种方式运行。我应该将此报告为错误吗?
https://nbviewer.jupyter.org/urls/dl.dropbox.com/s/dwfmnozfn42w0ck/access_by_id_SO_question.ipynb
【问题讨论】:
-
嗨 Rick,在运行你的 Jupyter 之后,我觉得没什么奇怪的,如果你收到警告说“[object HTMLButtonElement]”没关系,这只是意味着 JS 解释器试图对对象进行字符串化并以这种(不是很有用)语法结束。如果您想了解有关此对象的更多信息,我建议您将警报行更改为
console.log(x)并打开 dev tool console 以更详细地查看您的对象 -
如我所见,您分享的在线版本由Online Jupyter engine 运行。我建议你检查一下你在本地运行的 jupyter 版本,并与在线引擎的version 进行比较
-
Rick,调试 javascript 代码并不难。断点方法工作正常,您也可以使用控制台的输出进行调试,但我会让您从this doc 中做出选择
-
我看到了两个可能的答案。 - 当您执行 javascript 代码时,按钮还不存在(易于检查,在运行 js 代码时尝试查找 DOM 元素) - js 代码仅在 python 中运行并且无法访问 DOM(也许检查 nbviewer python 如何链接到 jupyter 页面并将其与您的设置进行比较)
-
我希望你在这个棘手的问题上好运......我可能有的另一个建议是尝试捕捉你第一行的返回
element.html('<button id="clearBtn">Clear</button>'),也许你可以通过这种方式直接访问按钮(如果这是你想要的)
标签: javascript python jupyter-notebook jupyter