【问题标题】:drag div ignoring certain element拖动 div 忽略某些元素
【发布时间】:2021-03-14 15:45:43
【问题描述】:

我想在网页上拖动 div,以下是我的 html。现在它拖动 div,无论我右键单击 div id draggable

var isMouseDown, initX, initY, height = draggable.offsetHeight,
  width = draggable.offsetWidth;

draggable.addEventListener('mousedown', function(e) {
  isMouseDown = true;
  document.body.classList.add('no-select');
  initX = e.offsetX;
  initY = e.offsetY;
})

document.addEventListener('mousemove', function(e) {
  if (isMouseDown) {
    var cx = e.clientX - initX,
      cy = e.clientY - initY;
    if (cx < 0) {
      cx = 0;
    }
    if (cy < 0) {
      cy = 0;
    }
    if (window.innerWidth - e.clientX + initX < width) {
      cx = window.innerWidth - width;
    }
    if (e.clientY > window.innerHeight - height + initY) {
      cy = window.innerHeight - height;
    }
    draggable.style.left = cx + 'px';
    draggable.style.top = cy + 'px';
  }
})

draggable.addEventListener('mouseup', function() {
  isMouseDown = false;
  document.body.classList.remove('no-select');
})
<div id="draggable" class="no-select">
  <div class="ignore">
    <select></select>
  </div>
  <div>Other contents</div>
</div>

如果用户在 div 类中拖动 div,我如何禁用拖动 ignore

【问题讨论】:

  • 哪个元素是可拖动的?
  • 元素 ID #draggable

标签: javascript


【解决方案1】:

只需取消class="ignore" 元素上的mousedown 事件:

var isMouseDown, initX, initY, height = draggable.offsetHeight,
        width = draggable.offsetWidth;
    
    draggable.addEventListener('mousedown', function (e) {
      // Check to see if the event originated with the class="ignore" element
      if(e.target.classList.contains("ignore")){
        // If so, cancel the event and prevent it from bubbling
        e.preventDefault();
        e.stopPropagation();
      }
    
        isMouseDown = true;
        document.body.classList.add('no-select');
        initX = e.offsetX;
        initY = e.offsetY;
    })
    
    document.addEventListener('mousemove', function (e) {
        if (isMouseDown) {
            var cx = e.clientX - initX,
                cy = e.clientY - initY;
            if (cx < 0) {
                cx = 0;
            }
            if (cy < 0) {
                cy = 0;
            }
            if (window.innerWidth - e.clientX + initX < width) {
                cx = window.innerWidth - width;
            }
            if (e.clientY > window.innerHeight - height + initY) {
                cy = window.innerHeight - height;
            }
            draggable.style.left = cx + 'px';
            draggable.style.top = cy + 'px';
        }
    })
    
    draggable.addEventListener('mouseup', function () {
        isMouseDown = false;
        document.body.classList.remove('no-select');
    })
<div id="draggable" class="no-select">
            <div class="ignore">
                <select>               
                </select>
            </div>
    
    <div>
    Other contents
    </div>
    </div>

【讨论】:

  • 感谢工作,我需要输入 isMouseDown = false;不过在那个参数里面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 2010-11-17
  • 2017-02-03
  • 2020-07-23
  • 1970-01-01
相关资源
最近更新 更多