HTML5拖放和触摸文本

Posted

技术标签:

【中文标题】HTML5拖放和触摸文本【英文标题】:HTML5 Drag & Drop and touching text 【发布时间】:2012-12-13 15:05:06 【问题描述】:

我在 html5 中的拖放有一个奇怪的问题。

有 3 个目标区域是包含文本的 div,还有 1 个源区域是包含图像的 div。

我使用 dragenter 和 dragleave 事件来改变活动目标区域的边框,以投影被拖动对象将要降落的位置。

问题是,一旦你将它拖到文本上,它会出于某种原因触发 dragleave 事件,移除边框。

Here is a jsfiddle example illustrating the problem

这是一些内联代码:

HTML

<h1>Targets</h1>
<div class="targets">
    <div class="target">I am a target<br/>Touch text while dragging to see the problem</div>
    <div class="target">I am a target<br/>Touch text while dragging to see the problem</div>
    <div class="target">I am a target<br/>Touch text while dragging to see the problem</div>
</div>
<h1>Source</h1>
<div class="source" draggable="true">
    <img class="source_image" src="http://lorempixel.com/output/technics-q-c-184-69-8.jpg"   />
</div>

JS

$("div.source").on('dragstart', function(e) 
    $(this).fadeTo('slow', 0.4);
);

$("div.source").on('dragend', function(e) 
    $(this).fadeTo('slow', 1);
);

$("div.target").on('dragover', function(e) 
    if (e.preventDefault) 
        e.preventDefault();
    

    e.dataTransfer.dropEffect = 'move';

    return false;
);

$("div.target").on('dragenter', function(e) 
    $(this).addClass('over');
);

$("div.target").on('dragleave', function(e) 
    $(this).removeClass('over');
);

CSS

h1 
    font-size: 2em;
    text-align: center;


.target 
    margin: 1em;
    display:inline-block;
    width: 184px;
    height: 69px;
    border: 5px #995555 solid;
    border-radius: 5px;
    background-color: #AAAAAA;
    vertical-align: bottom;
    text-align: center;
    font-size: 1.1em;
    font-weight: bold;
    line-height: 0.9em;


.target.over 
    border: 5px #0A0 dashed;


.source 
    margin: 1em;
    display:inline-block;
    width: 184px;
    height: 69px;
    border: 5px #555599 solid;
    border-radius: 5px;
    background-color: #CCCCCC;
    vertical-align: bottom;
    text-align: center;
    font-size: 1.4em;
    font-weight: bold;      

有没有人知道即使在触摸文本时也能保持边框变化的任何解决方案?

另一个问题是是否可以保持被拖动的源 div 周围的边框?

最后一点,我意识到这两件事都可以通过使用可拖放的 jQuery UI 来完成,但我特别想知道是否可以使用原生 HTML5 拖放来做到这一点。

【问题讨论】:

【参考方案1】:

问题在于文本在 DOM 中构成了一个额外的节点,dragleavedragenter 既考虑了子元素,也考虑了父元素。当光标进入文本节点时,它离开div。这类似于mouseout vs mouseleave 问题。解决此问题的一种简单方法是保留事件计数,并且仅在所有事件都考虑在内时才删除样式:

var count=0;
$("div.target").on('dragenter', function(e) 
    $(this).addClass('over');
    count++;
).on('dragleave', function(e) 
    if (--count<=0) 
        $(this).removeClass('over');
    
);

This isn't necessarily completely reliable(请记住在drop 事件中将count 设置为零),但它会比您当前的设置更好。另一种选择是根本不在 div 元素中添加任何内容,而是使用 CSS 添加:

.target:after 
    content: 'I am a target \A Touch text while dragging to see the problem';
    white-space: pre-wrap;

这有一些可访问性的缺点,因为生成的内容对辅助技术是不可见的,并且只会让您添加文本,但在许多方面a cleaner solution。

【讨论】:

非常感谢,通过 CSS 的第二个解决方案非常完美!由于这只是为了我正在从事的“为了好玩”项目,可访问性不是主要问题,我对寻找干净的解决方案和学习相对较新的技术更感兴趣。作为一个额外的问题,有没有办法在拖动时保留边框?再次,非常感谢! @Bio2hazard 我不这么认为,但如果您还有其他问题,请提出其他问题。 @robertc 我有类似的问题here 在 javascript 中拖放。如果可能的话,你能帮我吗?任何帮助将不胜感激。

以上是关于HTML5拖放和触摸文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中的地图上拖放和拖动图钉

触摸屏设备上的 HTML5 拖放 API

css / html5:拖放后悬停状态保持不变

拖放和调整大小重叠

jQuery 可在两个容器之间拖放和拖放,并且可排序

在 FabricJS 画布上拖放和删除对象