【问题标题】:How to get dropped data as HTML from a DropEvent?如何从 DropEvent 中以 HTML 格式获取丢弃的数据?
【发布时间】:2016-03-26 17:57:36
【问题描述】:

我正在尝试创建一个contenteditable,其中包含应该可以拖放的芯片元素。你可以在my github repo 上看看这个性能不佳的东西。

到目前为止,我如何让事情发挥作用的故事是另一个故事,经过 的努力,现在我终于能够想出一个似乎在 90% 的情况下都有效的解决方案.

剩下的一个问题是可以选择文本并将其拖放到此文本区域内:

此处的选择类似于“lling <div class="chip">Red Screwdriver</div> an”。为了禁止这样做,我看到了两个选项:

要么完全禁止文本选择(到目前为止我无法成功),要么查看 drop 事件并检查拖动的 HTML 内容。我的问题是我不知道我怎么能得到它。由于我只想允许一次拖放一个元素,我实际上可以将“lling <div class="chip">Red Screwdriver</div> an”与我拖动的元素进行比较:

String draggedHtmlDataAsString = event.getDraggedHtmlDataAsString();

if(this.draggedElement.getHtml().equals(draggedHtmlDataAsString) == false) {
    // Don't accept data
} else {
    // Accept data
}

但我不知道如何从 drop 事件中获取这些数据。对我来说,纯 GWT/Java 解决方案与 JavaScrit/JSNI 解决方案一样好。

欢迎任何比这更好的建议。

我也试图禁止选择,但是,看看你自己..

【问题讨论】:

    标签: javascript gwt contenteditable jsni


    【解决方案1】:

    编辑:

    要防止选择,请将此 CSS 类添加到您的小部件:

    .noselect {
      -webkit-touch-callout: none;
      -webkit-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
      user-select: none;
    }
    

    您可以将文本分解为单独的标记,而不是将文本显示为文本,每个标记由 InlineLabel 小部件(或“span”元素)表示。

    例如,您将拥有这些令牌:

    • 我们正在销售
    • 蓝色螺丝刀
    • 红色螺丝刀

    您将每个 InlineLabel 添加到容器中,在所有小部件上设置“contenteditable”,但仅在您允许拖动的小部件上设置“可拖动”。

    如果您需要在任何单词之间放置新筹码,则每个标记应仅代表一个单词。您还可以防止筹码被放在单词中 - 并且只允许在标记之间的空格中放置。

    【讨论】:

    • 我已经走了那条路,一团糟。一开始这听起来很合理,但据我所知,这变得越来越多毛和令人沮丧。但我也不确定这是否会阻止用户在文本区域内选择文本并最终搞乱我的拖放过程。
    • 我更新了我的答案。但是,使用建议的方法,您无需阻止用户选择文本。
    • 我的 css 中已经有了这些行 ^^ 问题是,无论出于何种原因,这都行不通。我为我的问题添加了屏幕截图。
    • 这是一场噩梦,我被困了几个星期。现在我正在考虑放弃并决定使用像# 这样的“提及”令牌,它将启动一个建议-框上下文。 contenteditable 中的整个拖放操作是最纯粹的邪恶..
    • 这不起作用,因为您使用 TextArea,我想。这就是我提供不同方法的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多