经过反复试验,我想出了一个办法。它可能并不完美,但它适用于我尝试过的每种情况。
我们需要使用wp.data.select
函数,并选择“核心/块编辑器”,最后使用getSelectionStart()
作用这将告诉我们当前块是否有可选择的文本,如果有,我们的选择从哪里开始。如果没有选择,或者选择从零开始,我想防止Backspace执行任何操作。
代码
document.body.addEventListener(\'keydown\', function(event){
if ( ( event.key == \'Backspace\' ) ) {
let selectionStart = wp.data.select(\'core/block-editor\').getSelectionStart();
// selectionStart will return an empty object {} if there is no block selected that has editable text. If will have the key \'offset\' if there is. So we check for offset, and whether it\'s value is 0.
if ( ( ! ( \'offset\' in selectionStart ) ) || ( selectionStart.offset === 0 ) ) {
event.preventDefault();
}
}
});
编辑:另一个选项在进一步研究之后,我决定如果块不是父块的第一个子块,我想允许backspace删除块。这意味着,如果我有三个段落排成一行,我希望能够保留退格,删除第三段,然后删除第二段,但要以paragraph 1停止。这里有一个版本可以做到这一点。
document.body.addEventListener(\'keydown\', function(event){
if ( ( event.key == \'Backspace\' ) ) {
let selectionStart = select(\'core/block-editor\').getSelectionStart();
let notInEditableBlock = ! ( \'offset\' in selectionStart );
let cursorIsAtBeginningOfEditableBlock = notInEditableBlock ? false : selectionStart.offset === 0;
let currentBlockIsFirstChild = select(\'core/block-editor\').getPreviousBlockClientId() === null;
if ( ( notInEditableBlock ) || ( cursorIsAtBeginningOfEditableBlock && currentBlockIsFirstChild ) ) {
event.preventDefault();
}
}
});