古登堡:我怎样才能禁止退格键删除空的段落块?

时间:2019-11-27 作者:Andy Mercer

背景大家好!我最近潜入古腾堡,试图改变一个旧主题。我多次遇到的一个问题是,如果我有一个段落块,并且我要删除文本以重新开始,我会按住backspace。发生了什么i:

最后,最后一个字符被删除,然后块被删除

问题

如何禁用退格删除空段落块的行为?如果光标位于空段落块中,我宁愿让backspace键什么都不做。

1 个回复
SO网友:Andy Mercer

经过反复试验,我想出了一个办法。它可能并不完美,但它适用于我尝试过的每种情况。

我们需要使用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();

        }

    }

});

相关推荐