如何在 Jupyter 中使用 JavaScript select 当前单元格?

How to select current cell with JavaScript in Jupyter?

我有一个包含 JavaScript 代码的笔记本单元格,我想要 select 这个特定单元格的代码。不幸的是,get_selected_cell 的行为取决于我是就地执行单元格,还是执行和 select 下面的单元格。

示例:

%%javascript
var cell = Jupyter.notebook.get_selected_cell();
console.log(Jupyter.notebook.find_cell_index(cell));

执行此单元格时,无论我使用 Ctrl+Enter 还是 Shift+Enter 执行,控制台输出都会不同。在一种情况下,它记录包含 JavaScript 代码的单元格的索引,在另一种情况下,它记录下面单元格的索引。

有没有办法select我想要的单元格?

您的 Javascript 将在应用 Javascript 的 OutputArea 上有一个句柄,但不会一直到单元格(通常,输出区域可以在没有单元格或笔记本的情况下使用)。您可以通过识别父 .cell 元素找到单元格,然后获取与该元素对应的单元格:

%%javascript
var output_area = this;
// find my cell element
var cell_element = output_area.element.parents('.cell');
// which cell is it?
var cell_idx = Jupyter.notebook.get_cell_elements().index(cell_element);
// get the cell object
var cell = Jupyter.notebook.get_cell(cell_idx);

在使用 display(HTML("javascript code")) 执行 javascript 的情况下,this 将 return Window 对象。

因此您应该使用 display(Javascript("javascript code")) 来获取当前单元格的 output_area。

如果您正在编写 jupyter lab 小部件,则可以通过迭代 widget 数组来获取单元格索引。这就是 jupyter lab 内部所做的 (source)。

const cellIndex = ArrayExt.findFirstIndex(
  notebook.content.widgets,
  widget => widget.node === this.originalCell.node
);

然后您可以通过更改笔记本小部件的 activeCellIndex 属性 来分配新的活动单元格:

notebook.content.activeCellIndex = cellIndex;