:悬停在拖放时粘到元素上

时间:2013-07-30 12:20:23

标签: javascript html5 drag-and-drop hover

我有简单的ol-li结构,想要添加拖拽它。另外我想突出显示不同颜色的悬停项目和dragover项目。但它在WebKit中是一个不寻常的错误。

  1. 捕获最后一项。
  2. 将其拖到顶部。
  3. 将它放到第一个项目。
  4. 最后一个元素捕获悬停伪类!为什么?我该如何预防?

    Hover bug

    这是一个例子:

    http://jsfiddle.net/zFk2V/3/

    var lis = document.querySelectorAll("li"),
        ol = document.querySelector("ol"),
        dragged = false,
        dragover = false;
    ol.addEventListener("drop", function(event) {
        ol.insertBefore(dragged,dragover);
        this.classList.remove("insistent");
    }, false);
    for (var i=0, n = lis.length; i < n; i++) {
        lis[i].addEventListener("dragstart", function(event) {
            dragged = this;
            ol.classList.add("insistent");
        }, false);
        lis[i].addEventListener("dragover", function(event) {
            if (dragover) {
                dragover.classList.remove("dragover");
            }
            event.preventDefault();
            dragover = this;
            this.classList.add("dragover");
        }, false);
    }
    

2 个答案:

答案 0 :(得分:6)

您只需添加.onmouseover.onmouseout函数,然后添加/删除名为hovered的类,而不是使用CSS :hover。这是updated jsFiddle

要添加的Javascript(内部循环)

lis[i].onmouseover = function() {
    // Adds the 'hovered' class
    this.className = this.className + " hovered";
}
lis[i].onmouseout = function() {
    // Removes the 'hovered' class
    this.className = this.className.split(' ').filter(function(v) {
        return v!='hovered'
    }).join(' ');
}

CSS

.hovered {
    background: #fc9;
}

附注:我可能会向ol id='dragableList'添加一个ID,并将行var lis = document.querySelectorAll("li")更改为var lis = document.getElementById('dragableList').querySelectorAll("li"),以防万一您的项目中有其他列表稍后的。 Here是包括

在内的jsFiddle

答案 1 :(得分:0)

以下是我如何解决它。不幸的是,我不得不求助于一点点。

我的网页折叠了悬停时突出显示的记录。单击该记录将展开它并禁用突出显示。再次单击将重新折叠并恢复悬停:

$(document).on('click', ".container.clickable", function(e){
  var $this = $(this);
  $this.toggleClass('expandable');
  if ($this.hasClass('expandable')) {
    $this.on('mouseenter', function(){
      // workaround to stop a stuck :hover
      $this.addClass('hilitable');
      $this.off('mouseenter');
    })
  } else {
    $this.removeClass('hilitable');
  }
});