12

是否有可能从网页中的 SVG 元素接收拖放事件?

我尝试了 Google Closure 库,但无济于事。

具体来说,假设我的页面包含

<ul id = "list">
  <li class="item" id="item1">foo</li>
  <li class="item">bar</li>
  <li class="item">baz</li>
</ul>

我的脚本包含(Clojurescript/C2)

(let [items (select-all ".item")
      lst (select "#list")
      target (fx/DragDrop. lst nil)]
  (dorun (map
    (fn [item]
      (let [source (fx/DragDrop. item nil)]
        (. source (addTarget target))
        (. source (init))))
    items))
  (. target (init)))

然后我确实得到了一个拖动图像(幽灵),虽然我没有设法接收拖动事件,例如通过做

(on-raw "#item1" :dragstart (fn [e] (.log js/console (str "dragstart " e))))

对 SVG 元素使用类似的代码,我什至没有得到一个幽灵......

有什么提示吗?

谢谢

4

2 回答 2

21

SVG 元素不支持拖动事件:http: //www.w3.org/TR/SVG/svgdom.html#RelationshipWithDOM2Events

您可以使用鼠标事件伪造拖动事件,请参阅http://svg-whiz.com/svg/DragAndDrop.svg(查看源代码)。

于 2012-09-05T19:10:30.760 回答
2

你总是可以实现它。基本上,您必须在拖动时检查元素是否与另一个元素接触:

this.isTouching = function(element){
        if(this.x <= element.x && element.x <= (this.x + this.width) && 
           this.y <= element.y && element.y <= (this.y + this.height)){
           return true;
        }else{
            return false;
        }
    };

它适用于所有浏览器。希望能帮助到你 :)

于 2015-07-29T05:46:19.920 回答