防止单击复制代码镜像

4
我们正在使用 Code Mirror 在一个 Angular Web 应用程序中。目前,当用户选择了一段文本并稍后再次单击已选择的部分时,Code Mirror 会将选定区域的副本放入剪贴板。这不是我们想要的行为。我们希望通常情况下只取消选择文本。
我尝试捕获鼠标点击事件并返回 false 或将 codemirrorIgnore 设置为 true,但都没有起作用。我还尝试重新定义 "LeftDown" 的键映射,但找不到现有动作名称的信息。
有谁能帮忙吗?
以下是我尝试更改 KeyMap 的代码:
$scope.editorOptions = {
    lineWrapping: true,
    lineNumbers: true,
    smartIndent: true,
    autoCloseTags: true,
    cursorScrollMargin: 25,
    styleActiveLine: true,
    mode: "text/html",
    theme: "default",
    matchBrackets: true,
    matchTags: {
        bothTags: true
    },
    extraKeys: {
        "F11": function (cm) {
            cm.setOption("fullScreen", !cm.getOption("fullScreen"));
        },
        "Esc": function (cm) {
            if (cm.getOption("fullScreen")) {
                cm.setOption("fullScreen", false);
            }
        },
        //Don't know where "autocomple", "findPersistent" are defined so I can see what is available
        "LeftClick": "LeftClick",
        "Ctrl-Space": "autocomplete",
        "Alt-B": "findPersistent",
        "Ctrl-J": "toMatchingTag"
    },
    viewportMargin: 10,
    textWrapping: true
};

我也尝试使用了ui-codemirror="{ onLoad : codemirrorLoaded }"并使用以下代码:

$scope.codemirrorLoaded = function(_editor) {
    _editor.on("mouseDown", function(cm, event) {
        cm.codemirrorIgnore = true;
        //also tried return false
    }
};

返回false没有起到任何作用,将codemirrorIgnore设置为true可以防止左键单击执行任何操作。


提供您已有的代码以及您尝试解决问题时所编写的代码会更有帮助。 - Ghassen Louhaichi
好的,我得等到周一了。谢谢。 - markbernard
@GhassenLouhaichi 添加了我尝试过的代码示例。 - markbernard
1个回答

2
我发现这是Code Mirror的一个bug。以下是Code Mirror代码的第一部分:
if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&
    type == "single" && (contained = sel.contains(start)) > -1 &&
    (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) &&
    (cmp(contained.to(), start) > 0 || start.xRel < 0))
  leftButtonStartDrag(cm, e, start, modifier);
else
  leftButtonSelect(cm, e, start, type, modifier);

根据此,如果启用了拖放功能(默认情况下是启用的),则将开始拖动。但在下面的代码中:
// Start a text drag. When it ends, see if any dragging actually
// happen, and treat as a click if it didn't.
function leftButtonStartDrag(cm, e, start, modifier) {

如果没有拖动行为,请将点击视为点击。我还没有深入研究代码以查看是否可以修复它,但是由于拖动使用剪贴板,剪贴板已经被清除并替换为所选文本。
因此,为了避免发生这种情况,您需要禁用拖放功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接