javascript - 防止拖动不可拖动元素时出现重影?

标签 javascript html css browser drag-and-drop

我正在创建一个利用 HTML5 拖放 API 的网站。

但是,为了提高用户体验,我想在用户拖动不可拖动元素时防止出现重影。这可能吗?

此外,默认情况下,几乎每个元素都"可拖动"。人们可以单击然后快速拖动浏览器中的几乎任何元素,这会创建一个重影图像以及一个no-drop光标。有什么办法可以防止这种行为吗?

  • draggable="false" 不起作用。
  • user-select: none 不起作用。
  • pointer-events: none 不起作用。
  • mousedown 上的 event.preventDefault() 不起作用。
  • dragstart 上的
  • event.preventDefault() 也不起作用。

我已经没有主意了,到目前为止,事实证明在网上找到有关此问题的信息非常困难。我发现了以下thread ,但是,draggable="false" 似乎不适用于我的情况。

下面的屏幕截图表明它不起作用;当然,您在屏幕截图中看不到我的光标,但您可以看到我如何将数字拖动到左侧。

enter image description here

我认为该问题可能与其父级具有与其关联的 dragoverdrop 事件有关。尽管如此,我还是一脸茫然。

HTML

...
<body>
  ...
  <div id="backgammon-board-container">
    <div class="column" id="left-column">
      <div class="quadrant" id="third-quadrant">
        <div class="point odd top-point" id="point-13-12"><text>13</text>
          <div class="checker player-one-checker" id="checker-03" draggable="true"></div>
        </div>
      </div>
    </div>
    ...
  </div>
</body>
</html>

CSS

#backgammon-board-container {
  height: 100vh;
  width: 60vw;
  position: absolute;
  right: 0;
  display: flex;
}

  .column {
    height: 100%;
    display: flex;
    flex-direction: column; /* column-reverse for player two perspective */
  }

  #left-column {
    flex: 6;
  }

    .quadrant {
      flex: 1;
      display: flex;
    }

      .point {
        flex: 1;
        padding: 10px 0;
        display: flex;
        flex-direction: column;
        align-items: center;
      }

        .checker {
          z-index: 1;
          width: 48px;
          height: 48px;
          border-radius: 50%;
        }

text {
  position: fixed;
  font-family: impact;
  font-size: 24px;
  color: white;
  display: flex;
  justify-content: center;
  align-items: center;

  user-select: none;
  pointer-events: none;
}

JS

const p1checkers = document.getElementsByClassName('player-one-checker');
const p2checkers = document.getElementsByClassName('player-two-checker');
const pointClass = document.getElementsByClassName('point');

function setTurn(player) {
  if (player === 'p1') {
    allowCheckerMovement = p1checkers;
    disallowCheckerMovement = p2checkers;
  } else {
    allowCheckerMovement = p2checkers;
    disallowCheckerMovement = p1checkers;
  }

  // enable checker control for player
  for (var i = 0; i < allowCheckerMovement.length; i++) {
    allowCheckerMovement[i].style.cursor = 'pointer';
    allowCheckerMovement[i].setAttribute('draggable', true);
    allowCheckerMovement[i].addEventListener('dragstart', start); // for drag-and-drop.js
    allowCheckerMovement[i].addEventListener('dragend', stop);    // for drag-and-drop.js
  }

  // disable checker control for player
  for (var i = 0; i < disallowCheckerMovement.length; i++) {
    disallowCheckerMovement[i].style.cursor = 'default';
    disallowCheckerMovement[i].setAttribute('draggable', false);
    disallowCheckerMovement[i].removeEventListener('dragstart', start); // for drag-and-drop.js
    disallowCheckerMovement[i].removeEventListener('dragend', stop);    // for drag-and-drop.js
  }

  // allow drag and drop
  for (var i = 0; i < pointClass.length; i++) {
    pointClass[i].addEventListener('dragover', allowDrop); // for drag-and-drop.js
    pointClass[i].addEventListener('drop', droppedOn);     // for drag-and-drop.js
  }
}

function start(event) {
  var checker = event.target;
  event.dataTransfer.setData('text/plain', checker.id);
  event.dataTransfer.effectAllowed = 'move';
  window.requestAnimationFrame(function(){
    checker.style.visibility = 'hidden';
  });
}

function allowDrop(event) {
  event.preventDefault();
}

function droppedOn(event) {
  event.preventDefault();
  var data = event.dataTransfer.getData('text/plain');
    event.target.appendChild(document.getElementById(data));
}

function stop(event){
  var element = event.srcElement;
  window.requestAnimationFrame(function(){
    element.style.visibility = 'visible';
  });
}

最佳答案

这就是您正在寻找的解决方案。 ;)

对于任何需要可拖动的内容,只需添加“enable-drag”CSS 类即可。

$('*:not(".enable-drag")').on('dragstart', function (e) {
    e.preventDefault();
    return false;
});

关于javascript - 防止拖动不可拖动元素时出现重影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44149403/

相关文章:

javascript - 无论如何,是否可以将数组返回到不同的网格列

html - 一次只有一个背景过滤器工作

css - 使用 Bootstrap 在单行上的多个输入字段和按钮

html - iPhone 上的 Twitter Bootstrap 3(颠覆 3.0)的 Navbar Toogle 问题

javascript - 使代码适用于多个链接

php - 如何转义 php 中的新行字符以输出到 javascript 字符串值?

php - 向表发送数据时保持表单打开

jquery - 修复了带有可滚动主体的列表在 IE 9 和 10 中无法正确呈现的问题

javascript - 显示和隐藏带链接的 div

javascript - React Native - 动画宽度收缩