2013-07-30 9 views
9

私は単純なオルリ構成で、ドラッグアンドドロップを追加したい。私は、ホバー項目と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機能を追加し、代わりにCSSの:hoverを使用してのhoveredと呼ばれるクラスを追加/削除することができます。ここで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; 
} 

サイドノート(ループの内側)を追加することです:私はid='dragableList'ようolにIDを追加し、ラインvar lis = document.querySelectorAll("li")を変更する場合がありますvar lis = document.getElementById('dragableList').querySelectorAll("li")あなたのプロジェクトのどこかに別のリストが後である場合に備えて。 Hereはそれを含むjsFiddleです

+0

CSSのホバーの振る舞いをJSの振る舞いに置き換えたこの解決策に抵抗して、私はマウスが実際にマウスを動かしていなかったことにブラウザが気づくように多くのことを試みました。リフローをトリガし、視覚効果を持つクラスを切り替えることができます。これはWebkitのバグですよね?これは一年後もまだどうやってぶら下がっているのですか? – SimplGy

+0

@SimpleAsCouldBeなぜ私は、単にjavascriptを使用しているので、実際のソリューションに抵抗するのは不思議です...バグはバグであり、多くは見落とされています –

+0

'mouseover'、' mouseout'、およびクラスを修正することでパフォーマンスが低下することが予想されますリスト項目ごとの構造。私のアプリケーションには、いくつかの動作を共有するいくつかのタイプのリストがあります。アプリケーションのほとんどのタイプのリストアイテムは、CSSのホバーに反応し、いくつかはクリックして選択することができ、またいくつかは 'ドラッグ可能 'です。 ':hover'はうまく動作し、おそらく最も速く、イベントをクリーンアップする必要はありません。私にとっては、誤った ':hover'を全面的にCSSの振る舞いを上書きするよりも、ずっと面白いでしょう。 – 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

私はブラウザのバグ(FF 50.0.0でぼやけたカスタムSVGの境界線)を経験しましたが、ウェブサイトにパッチを当てることはお勧めできません。ブラウザのバグをブラウザで解決する必要があります。彼らにバグを報告し、誰にでもそれを修正することがより効率的です。 – Xenos

関連する問題