2014-02-18 4 views
1

svg 요소를 HTML 요소로 끌어오고 싶습니다. 어떤 스마트 방법으로 그렇게 할 수 있는지 잘 모릅니다.svg 요소를 HTML 요소 위로 끌기

그러나 내 방법이 더럽다고 생각하지만 d3.behavior.drag() 및 d3의 드래그 기능을 사용하여 svg 요소에서 끌기를 시작할 수 있다고 생각합니다. 사본을 복제하려고합니다 (제발 생각해보십시오). 단순히 circle 객체) jquery UI가 드래그 이벤트를 처리하도록합니다. 문제는 새로 생성 된 jquery 요소에서 드래그 이벤트를 트리거하는 방법을 모른다는 것입니다.

var drag= d3.behavior.drag() 
    .on("drag", function(d) { 
     // make a Clone html object .dragging-node 

     $('.dragging-node').attr('draggable', true); 
     $('.dragging-node').trigger('dragstart'); 

    }); 
var node = vis.selectAll("g.node") 
      .data(nodes) 
      .enter().append("svg:g") 
      .attr("class", "node") 
      .call(drag); 

이 새로 만든 복제 개체에 대해 드래그를 시작하는 방법에 대한 아이디어가 있으십니까? 또는 내가 원하는 것을 얻는 더 똑똑한 방법이 있습니까?

도움이 될 것입니다.

+0

이해 해달라고; 원래 요소를 왜 복사하고 있습니까? – halfbit

+0

음, 이것은 svg 요소가 svg 컨테이너 외부로 갈 수 없다는 것을 이해합니다. svg에서 끌 수 없습니다. 그것이 가장 중요한 이유입니다. 다른 이유가 있지만 여기에 열거 할 가치가 없습니다. 희망은 그 말이 맞습니다. – Alfred

+0

괜찮아요, revese하는 방법? HTML 객체를 생성하고 이것을 드래그합니까? – halfbit

답변

2

나는 이런 식으로 한 번 해봤지만 간단한 작업에서는 괜찮 았지만 얼마 지나지 않아 jQueryUI의 Draggable을 사용하는 것이 더 강력 해 졌으므로 이제는 더 건강 해졌다. 또한 Droppable 기능을 함께 사용해야했습니다. 어쩌면 당신의 요구가 덜 까다 롭습니다. 그렇다면 :

복제 된 요소 (jQueryUI의 드래그 가능한 용어로 "드래그 도우미"라고도 함)에서 이벤트를 인위적으로 트리거 할 필요가 없습니다. 대신 드래그를 시작한 요소에서 이벤트가 계속 트리거되고 드래그 동작이 적용되지만 도우미 위치가 업데이트됩니다. 이 같은

뭔가 :

// Helper is the cloned element, which doesn't exist until dragging begins 
// (alternatively it could pre-exist but be hidden) 
var $helper = null 

// the parent container of $helper, 
// which presumably is outside of the SVG 
var $helperParent = $('body') 

var drag = d3.behavior.drag() 
    .on("dragstart", function(d) { 
    $helper = ... // somehow make the cloned helper, on dragstart (not on drag) 
     .appendTo($helperParent) 
    }) 
    .on("drag", function(d) { 
    // determine the mouse position relative to the helper's parent 
    // (not relative to the SVG element that initiated the drag) 
    mousepos = d3.mouse($helperParent[0]) 

    // update the helper's position 
    $helper.css({ 
     left: mousepos[0], 
     top: mousepos[1] 
    }); 
    }) 
    .on("dragend", function(d) { 
    // remove (or hide) the helper 
    $helper.remove(); 
    }); 
+0

마우스 이벤트를 수동으로 트리거해야한다고 생각했지만이 코드 조각은 정상적으로 작동합니다. 나는이 대답 이전에 내가 원하는 것을 성취 했음에도 불구하고 대답에서 길을 따라 갔다. 고마워! – Alfred

+0

당신은 "jQueryUI의 Draggable을 사용하는 것이 더 건강하다"고 말했지만, jQueryUI의 Draggable은 SVG를 HTML 드래그 앤 드롭만으로 svg 드래그 앤 드롭을 처리 할 수 ​​없다고 말했습니다. SVG에서 HTML로 끌어서 놓기, SVG에서 SVG 끌어서 놓기와 관련하여 가장 좋은 해결책은 무엇입니까? –

+0

@EyalOfri 이제 언급 했으니, SVG가 아닌 HTML에서만 사용했다는 것을 알았습니다. SVG 제한에 대해 알지 못했습니다. SVG''을 드래그 가능하거나 드롭 가능하게 만들면 어떻게됩니까? 드래그하는 동안 어떤 이벤트도 발생하지 않습니까? 아직 시도하지는 않았지만, jQueryUI는 너무 오래되어서 요즘에는 새로운 라이브러리가 있는지 의심 스럽습니다. 특히 오래된 브라우저 지원이 중요하지 않은 경우 특히 그렇습니다. – meetamit

관련 문제