2013-06-22 3 views
5

В mousedown Я хочу добавить новый элемент в DOM и сразу же перетащить его (т. Е. Триггер dragstart), не нажимая новый элемент еще раз.Инициализировать элемент и начать перетаскивание одним щелчком мыши

Я использую d3.js много в моем проекте. Но я не знаю, смогу ли я вызвать dragstart событие с помощью d3, поэтому я попытался с помощью JQuery:

$("circle#pen").trigger("dragstart"); 

Но это не работает.

Вот ссылка на jsFiddle, где я продемонстрирую свою проблему, пытаясь создать «ручку» на mousedown, и если пользователь перетаскивает перо, он рисует линию. При dragend ручка удаляется и линия исчезает. Но перо должно быть инициализировано, а затем его можно перетащить с помощью нового клика. Это просто для демонстрации проблемы.

Здесь related question for jQuery, но на это нет хорошего ответа.

ответ

2

Я нашел библиотеку jQuery под названием jquery-simulate. Используя, что я решил проблему так:

var coords = { 
    clientX : d3.event.x, 
    clientY : d3.event.y 
}; 

d3.select("g#selects").append("circle") 
    .attr("id", "pen") 
    .attr("r", 10) 
    .attr("cx", coords.clientX) 
    .attr("cy", coords.clientY) 
    .call(dragPen); 

$("circle#pen").simulate("mousedown", coords); 

Элемент #pen теперь получает впрыскивается и перетащить инициируют только с одним щелчком мыши. Если вы знаете решение без библиотеки, например query-simulate, пожалуйста, дайте мне знать.

+0

такой kludge ... –

+0

@TimSeguine Я согласен, не очень хорошее решение. Но это было то, с чем я закончил в 2013 году. Каково ваше решение? – swenedo

+0

Основываясь на том, что вы описали, я бы, вероятно, поместил обработчики событий в область, где разрешено функционирование «пера». Мышь добавляет «ручку», как вы уже делали. Обработчик mousemove обновляет положение «перо». Обработчик mouseup удаляет «перо». Нет никакой реальной причины настаивать на том, чтобы делать это с помощью поведения перетаскивания, если это не так, как вы описали в своем вопросе. –

0

Я думаю, вы можете не понимать, как работает метод запуска jQuery. Он предназначен для запуска кода, который вы подключили к событию. Это не означает, что что-то произойдет в том смысле, что вход пользователя будет.

Чтобы решить вашу проблему, вам необходимо прикрепить некоторые элементы к элементу, который определит логику перемещения элементов вокруг.

+0

Хорошо, но хм .. Я думаю, что я привязываю события к элементу ?! Я использую 'd3.behavior.drag()' и вызываю это на элементе. См. Скрипт для кода (он не подходит очень хорошо здесь, в комментарии). – swenedo