2015-05-05 17 views
18

Bir kullanıcı DIV'yi sürüklerken (aşağıdaki örnekte kırmızı boşluk) imleç ikonunu ayarlamalıyım. CSS cursor:move ve event.dataTransfer.dropEffect'u kullanma da dahil olmak üzere birkaç deneme yapmayı denedim, çünkü simge her zaman "çapraz daire" gösteriyor.HTML5’te sürüklerken imleç simgesi nasıl değiştirilir?

HTML5 sürükle ve bırak API'sini kullanarak bu sorunu nasıl çözebilirim?

http://jsbin.com/hifidunuqa/1/

<script> 
     window.app = { 
      config: { 
       canDrag: false, 
       cursorOffsetX: null, 
       cursorOffsetY: null 
      }, 
      reset: function() { 
       this.config.cursorOffsetX = null; 
       this.config.cursorOffsetY = null; 
      }, 
      start: function() { 
       document.getElementById('target').addEventListener('dragstart', function (event) { 
        console.log('+++++++++++++ dragstart') 
        this.config.cursorOffsetX = event.offsetX; 
        this.config.cursorOffsetY = event.offsetY; 
        this.adjustPostion(event); 
        event.dataTransfer.effectAllowed = 'move'; 
        event.dataTransfer.dropEffect = 'move'; 
       }.bind(this)); 
       document.getElementById('target').addEventListener('drag', function (event) { 
        console.log('+++++++++++++ drag') 
        this.adjustPostion(event); 
       }.bind(this)); 
       document.getElementById('target').addEventListener('dragend', function (event) { 
        console.log('+++++++++++++ dragend') 
        this.reset(); 
       }.bind(this));; 
      }, 
      adjustPostion: function (event) { 
       if (event.pageX <= 0 || event.pageY <= 0) { 
        console.log('skipped'); 
        return; 
       } 
       var elm = document.getElementById('target'); 
       elm.style.left = (event.pageX - this.config.cursorOffsetX) + 'px'; 
       elm.style.top = (event.pageY - this.config.cursorOffsetY) + 'px'; 
       console.log(event.pageX); 
       console.log(event.pageY); 
      } 

     }; 
    </script> 
+1

neyi mousedown olay hakkında mousemove? –

+0

Jquery tamam mı? – Akshay

+0

evet jquery çözümleri de tamam. teşekkürler – GibboK

cevap

4

kullanım mousedown görmek ve

window.app = { 
 
    dragging: false, 
 
    config: { 
 
    canDrag: false, 
 
    cursorOffsetX: null, 
 
    cursorOffsetY: null 
 
    }, 
 
    reset: function() { 
 
    this.config.cursorOffsetX = null; 
 
    this.config.cursorOffsetY = null; 
 
    }, 
 
    start: function() { 
 
    document.getElementById('target').addEventListener('mousedown', function (event) { 
 
     console.log('+++++++++++++ dragstart'); 
 
     this.dragging = true; 
 
     this.config.cursorOffsetX = event.offsetX; 
 
     this.config.cursorOffsetY = event.offsetY; 
 
     this.adjustPostion(event); 
 
    }.bind(this)); 
 
    document.getElementById('target').addEventListener('mousemove', function (event) { 
 
     if (this.dragging) { 
 
     console.log('+++++++++++++ drag'); 
 
     event.target.style.cursor = 'move'; 
 
     this.adjustPostion(event); 
 
     } 
 
    }.bind(this)); 
 
    document.getElementById('target').addEventListener('mouseup', function (event) { 
 
     console.log('+++++++++++++ dragend'); 
 
     this.dragging = false; 
 
     event.target.style.cursor = 'pointer'; 
 
     this.reset(); 
 
    }.bind(this)); 
 
    }, 
 
    adjustPostion: function (event) { 
 
    if (event.clientX <= 0 || event.clientY <= 0) { 
 
     console.log('skipped'); 
 
     return; 
 
    } 
 
    var elm = document.getElementById('target'); 
 
    elm.style.left = (event.clientX - this.config.cursorOffsetX) + 'px'; 
 
    elm.style.top = (event.clientY - this.config.cursorOffsetY) + 'px'; 
 
    console.log(event.pageX); 
 
    console.log(event.pageY); 
 
    } 
 

 
};
#target { 
 
      position: absolute; 
 
      top: 100px; 
 
      left: 100px; 
 
      width: 400px; 
 
      height: 400px; 
 
      background-color: red; 
 
      -moz-user-select: none; 
 
      -ms-user-select: none; 
 
      -webkit-user-select: none; 
 
      user-select: none; 
 
     } 
 

 
     #ui1 { 
 
      position: absolute; 
 
      top: 50px; 
 
      left: 50px; 
 
      width: 100px; 
 
      height: 400px; 
 
      background-color: blue; 
 
      z-index: 100; 
 
     } 
 

 
     #ui2 { 
 
      position: absolute; 
 
      top: 50px; 
 
      left: 550px; 
 
      width: 100px; 
 
      height: 400px; 
 
      background-color: green; 
 
      z-index: 100; 
 
     }
<!-- simulate --> 
 

 
<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>title</title> 
 
</head> 
 
<body onload="window.app.start();"> 
 
    <div id="ui1"></div> 
 
    <div id="ui2"></div> 
 
    <div id="target"></div> 
 
</body> 
 
</html>

+0

Neden imleç ofsetlerini kontrol etmeniz gerekiyor? Örnek mükemmel koştu, ancak uygulamamda çoğalamadı, nedenini bilmiyorum. –

+0

öğenin atladığından emin olmamanız için, öğeyi tıklattığınızda öğenin içine tıkladınız ve öğenin içinde bu imleç konumu ofsetine ihtiyacınız vardır. – Ihsan

2

event.dataTransfer.setData(); ekleme sorunu çözmek gerekir. Öğe sürüklenebilir olarak algılandığında, tarayıcı sürükledikten sonra otomatik olarak bir hareket imleci ekler. Tabii ki, sürüklerken imleci değiştiğini görmek için diğer tüm cursor: move bildirimlerini kaldırmanız gerekecektir.

Minimal örnek: Hala simgeyi değiştirmek isterseniz

document.getElementById('target').addEventListener('dragstart', function (event) { 
    event.dataTransfer.setData('text/plain', ''); 
}.bind(this)); 

(örn özel bir sürükle simge kullanmak üzere), sen event.target.style.cursor kullanarak eleman stilini erişebilir. Daha fazla bilgi için

MDN Drag & Drop ve MDN Recommended Drag Types

+0

Maalesef işe yaramaz gibi görünüyor. event.target.style.cursor = 'none' kullanarak; imleci değiştirmez. Lütfen çözümünüzü jsfiddle'a uygulayabilir ve bana link gönderebilir misiniz? Teşekkürler – GibboK

+0

Dürüst olmak gerekirse, yapmaya çalıştığınız şeyden tam olarak emin değilim. Amacınız sürükleme sırasında simgeyi değiştirmek/kaldırmaksa, bunun mümkün olup olmadığını bilmiyorum. Görünüşe göre, CSS değişiklikleri sadece sürüklenmeyen öğeleri etkiler. Birkaç gösterici var: http://stackoverflow.com/questions/6079346/javascript-how-can-i-set-the-cursor-during-a-drag-drop-operation-on-a-website https: //developer.mozilla.org/en-US/docs/Web/Kılavuzu/HTML/Drag_operations – thenickname

+0

Doğru, HTML5 sürükle ve bırak API'sini kullanarak sürükleme sırasında simgeyi değiştirmem gerekiyor. Bunun için teşekkürler. – GibboK

İlgili konular