2013-07-30 27 views
9

我有简单的ol-li结构,并且想要添加drag'n'drop到它。另外我想突出悬停项目和dragover项目在不同的颜色。但这是WebKit中一个不寻常的错误。:悬停在元素上拖放

  1. 捕获最后一个项目。
  2. 将其拖动到顶部。
  3. 将它放到第一个项目。

而最后一个元素捕捉悬停伪类!为什么?我怎样才能防止它?

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); 
} 
+0

什么浏览器,你在具体看到? jsfiddle不会为我打破。 – TimHayes

+0

我有边缘铬(35.0.1916.153)相同的问题。这很烦人,而且必须是一个错误。我不满意使用JS做悬停状态,我认为有更多的手术方案。 – SimplGy

回答

4

您可以简单地添加一个.onmouseover.onmouseout功能,并添加/删除一个名为hovered而不是使用CSS的:hover类。这里是updated jsFiddle

Javascript功能来添加(在for循环)

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; 
} 

附注:我想补充一个ID,olid='dragableList'和改线var lis = document.querySelectorAll("li")var lis = document.getElementById('dragableList').querySelectorAll("li")以防万一你在你的项目中的某个地方有其他列表。 Here是与该的jsfiddle包括

+0

抵制这种解决方案刚刚替换JS行为CSS悬停行为,我试过很多东西,让浏览器发现鼠标实际上并没有任何徘徊元素,包括触发'mouseleave'和其他活动,阅读元素的高度触发回流,并切换一个应该具有视觉效果的类。这是一个webkit的bug,对吧?一年后这仍然如何? – SimplGy

+0

@SimpleAsCouldBe我很好奇,为什么你反抗,只是因为它使用JavaScript一个有效的解决方案......一个错误是一个错误,很多人忽略 –

+0

我期待着一个性能缺点与结合'mouseover','mouseout'和修改类每个列表项的结构。我的应用程序有几种类型的列表共享一些行为。应用程序中的大部分类型的列表项对CSS悬停有反应,有些可以点击选择,有些则是[可拖动]。 ':hover'效果很好,可能是最快的,并且不需要事件清理。对我来说,清除错误的':hover'会比覆盖全局的css行为w/js好得多。 – SimplGy

0

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

我的页面已经崩溃,突出悬停记录。点击记录将展开它并禁用突出显示。再次点击将重新合拢并恢复悬停:

$(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'); 
    } 
}); 
+0

我遇到过浏览器bug(FF 50.0.0左右的模糊自定义SVG边框),但我极力不建议修补网站中的东西:浏览器的bug必须在浏览器中解决。向他们报告错误并让他们为每个人修复它更有效。 – Xenos