2013-07-30 20 views
9

Basit bir yapıya sahibim ve drag'n'drop eklemek istiyorum. Ek olarak farklı renklerde vurgulu öğeyi ve dragover öğesini vurgulamak istiyorum. Ancak WebKit'te sıra dışı bir hatadır.: Vurgulu sürükle ve bırak elemanına yapışıyor

  1. Son öğeyi yakala.
  2. En üste sürükleyin.
  3. İlk öğeye bırakın.

Ve son element, vurgulu psödoklassı yakalar! Niye ya? Bunu nasıl önleyebilirim?

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

Özel olarak hangi tarayıcıyı görüyorsunuz? Jsfiddle benim için kırılmadı. – TimHayes

+0

Kenar kromunda da aynı sorun var (35.0.1916.153). Bu sinir bozucu ve bir böcek olmalı. Vurgulu durumu yapmak için JS kullanmaktan memnun değilim, bence daha cerrahi bir çözüm var. – SimplGy

cevap

4

Sadece bir .onmouseover ve .onmouseout işlev eklemek ve ekleme/yerine CSS en :hover kullanmanın hovered denilen bir sınıf kaldırabilirsiniz:

Hover bug

Bu

bir örnektir. İşte 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; 
} 

Yan not (for döngüsü içinde) eklemektir: Ben id='dragableList' gibi ol bir kimlik eklemek ve çizgi var lis = document.querySelectorAll("li") değişebilir var lis = document.getElementById('dragableList').querySelectorAll("li") sadece projenizde daha sonra başka bir listeye sahip olmanız durumunda. Here, dahil olan jsFiddle'la birlikte

+0

Sadece css hover davranışını JS davranışıyla değiştiren bu çözüme dayanarak, tarayıcıyı farenin aslında herhangi bir öğeyi, fareyi "mouseleave" ve diğer olayları tetikleme de dahil olmak üzere, öğelerin yüksekliğini okuyarak dahil olmadığını fark etmesini sağlamak için denedim. bir reflow tetiklemek ve görsel bir etkiye sahip olması gereken bir sınıfı değiştirmek. Bu bir webkit hatası, değil mi? Bu hala bir yıl sonra nasıl takılıyor? – SimplGy

+0

@SimpleAsCouldBe Neden javascript kullanır çünkü bir çalışma çözümüne direniyor merak ediyorum ... Bir hata bir hata, birçok gözardı olsun –

+0

Ben 'mouseover', mouseout 've değiştirerek sınıf bağlama ile bir performans aşağı bekliyoruz her liste öğesi için yapı. Uygulamamın bazı davranışları paylaşan çeşitli listeleri vardır. Uygulamadaki çoğu liste öğesi türü bir css hover'ına tepki gösterir, bazıları seçmek için tıklayabilir, bazıları da [sürüklenebilir] 'olabilir. Hover, harika çalışıyor, muhtemelen en hızlı ve hiçbir olay temizleme gerektirmiyor. Benim için, erdi ': vurguluyu' dünya çapındaki css davranışını geçersiz kılmaktan daha çok yıkamak daha iyi olurdu. – SimplGy

0

İşte bunu nasıl çözdüm. Maalesef biraz da JS'ye başvurmak zorunda kaldım.

Sayfamda, üzerine gelindiğinde vurgulanan daraltılmış kayıtlar var. Kayıt tıklandığında genişletilecek ve vurgulama devre dışı bırakılacak. Tekrar tıklandığında yeniden çökecek ve gezinmeye devam edeceksiniz:

$(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

Tarayıcı hataları yaşadım (FF 50.0.0 ya da öylesine bulanık özel SVG sınırları), ancak web sitesinde yamaları öneriyorum: tarayıcıda bir tarayıcı çözülmelidir. Hatayı onlara rapor etmek ve herkes için düzeltmek daha verimli. – Xenos