当我问这个问题时,我真正想要的是在“编辑”模式下类似于 Google Docs 的行为(如 Nate Mielnik 所述)。我在 Medium Editor 跟踪器上打开了一个问题,他们决定不将其作为核心媒体编辑器的一部分来实现,但他们指出,他们很乐意有人将该功能添加为扩展。
因此,我决定按照建议将该功能作为扩展来实现。它可以作为MediumTools 1的一部分找到。该项目仍处于非常早期的阶段(例如,我没有做任何事情来使样式看起来更好,或者使用更好的缩小实践等,但我们很乐意接受拉取请求)。
代码的核心如下所示:
var ClassName = {
INNER: 'medium-editor-toolbar-anchor-preview-inner',
INNER_CHANGE: 'medium-editor-toolbar-anchor-preview-inner-change',
INNER_REMOVE: 'medium-editor-toolbar-anchor-preview-inner-remove'
}
var AnchorPreview = MediumEditor.extensions.anchorPreview;
GdocMediumAnchorPreview = MediumEditor.Extension.extend.call(
AnchorPreview, {
/** @override */
getTemplate: function () {
return '<div class="medium-editor-toolbar-anchor-preview">' +
' <a class="' + ClassName.INNER + '"></a>' +
' -' +
' <a class="' + ClassName.INNER_CHANGE + '">Change</a>' +
' |' +
' <a class="' + ClassName.INNER_REMOVE + '">Remove</a>' +
'</div>';
},
/** @override */
createPreview: function () {
var el = this.document.createElement('div');
el.id = 'medium-editor-anchor-preview-' + this.getEditorId();
el.className = 'medium-editor-anchor-preview';
el.innerHTML = this.getTemplate();
var targetBlank =
this.getEditorOption('targetBlank') ||
this.getEditorOption('gdocAnchorTargetBlank');
if (targetBlank) {
el.querySelector('.' + ClassName.INNER).target = '_blank';
}
var changeEl = el.querySelector('.' + ClassName.INNER_CHANGE);
this.on(changeEl, 'click', this.handleClick.bind(this));
var unlinkEl = el.querySelector('.' + ClassName.INNER_REMOVE);
this.on(unlinkEl, 'click', this.handleUnlink.bind(this));
return el;
},
/** Unlink the currently active anchor. */
handleUnlink: function() {
var activeAnchor = this.activeAnchor;
if (activeAnchor) {
this.activeAnchor.outerHTML = this.activeAnchor.innerHTML;
this.hidePreview();
}
}
});
作为解释,我只是使用媒体的原型继承来“子类化”原始/内置AnchorPreview
扩展。我重写了getTemplate
将附加链接添加到标记中的方法。然后我从 的基本实现中借了很多东西getPreview
,但我在每个链接上都酌情绑定了新的操作。最后,我需要在单击“删除”时执行“取消链接”链接的操作,因此我为此添加了一个方法。使用 contenteditable 魔法(以确保它是浏览器撤消堆栈的一部分),取消链接方法可能会做得更好一些,但我没有花时间弄清楚这一点(尽管它会为任何有兴趣的人:-)。
1目前,它是唯一的部分,但我希望这会在某个时候改变。. .