У меня теперь это работает.
По моему опыту, не используйте jquery.svg, возможно, это было давление, чтобы решить его, не изучая мой путь вокруг другого плагина, но я нашел это более труднымчем это стоило и вызвало проблемы с совместимостью.
Это можно решить, используя холст HTML5 и сценарий совместимости excanvas , и отличный обзор html5 , НО из-за того, какхолст HTML5 работает, он требует, чтобы все линзы на холсте были уничтожены и перерисованы, если необходимо удалить линию или обновить ее положение.
Элементы, между которыми я рисую линии, находятся внутри родительского элемента.элемент, который представляет отношения.Дочерние элементы представляют начало и конец, поэтому я могу перерисовать все эти отношения, получив коллекцию родителей, используя, например, $('.relationshipClass')
и опросив дочерние элементы набора, чтобы получить точки линии.
Чтобы использовать этокод, который вы должны будете придумать, чтобы легко получить точки линии, доступные для перерисовки.
Разметка:
Хорошо и просто, HTML <div>
для хранения любых элементовкоторые рисуются между (наиболее вероятно, перетаскиваемыми элементами JQuery UI) и <canvas>
, который будет находиться в той же позиции
<div id="divCanvasId" class="divCanvasClass"></div>
<canvas id="html5CanvasId"></canvas>
CSS:
Не контролируйте <canvas>
ширина элемента с помощью CSS, см. Вопрос по растяжке холста .Расположите <canvas>
в том же положении, что и <div>
и позади него (с z-индексом), это покажет линии вверх за <div>
и предотвратит блокировку <canvas>
любых взаимодействий перетаскивания спотомки <div>
.
canvas
{
background-color: #FFFFFF;
position: absolute;
z-index: -10;
/* control height and width in code to prevent stretching */
}
Подход Javascript:
Создание служебных методов: пример кода находится внутри плагина JQuery , который содержит:
- Вспомогательная функция для сброса холста (изменение ширины удалит все из
- Вспомогательная функция для рисования линий между двумя элементами
- Функция, которая рисует линиимежду всеми элементами, которым требуется один
Когда вы добавляете новую линию или корректируете положение линии, вы уничтожаете существующие линии и рисуете все линии. Вы можете поместить приведенный ниже код в обычныйфункции или оставить как плагин.
код Javascript:
NB не проверен после анонимизации.
$(document).ready(function () {
$.fn.yourExt = {
_readjustHTML5CanvasHeight: function () {
//clear the canvas by readjusting the width/height
var html5Canvas = $('#html5CanvasId');
var canvasDiv = $('#divCanvasId');
if (html5Canvas.length > 0) {
html5Canvas[0].width = canvasDiv.width();
html5Canvas[0].height = canvasDiv.height();
}
}
,
//uses HTML5 <canvas> to draw line representing relationship
//IE support with excanvas.js
_drawLineBetweenElements: function (sourceElement, targetElement) {
//draw from/to the centre, not the top left
//don't use .position()
//that will be relative to the parent div and not the page
var sourceX = sourceElement.offset().left + sourceElement.width() / 2;
var sourceY = sourceElement.offset().top + sourceElement.height() / 2;
var targetX = targetElement.offset().left + sourceElement.width() / 2;
var targetY = targetElement.offset().top + sourceElement.height() / 2;
var canvas = $('#html5CanvasId');
//you need to draw relative to the canvas not the page
var canvasOffsetX = canvas.offset().left;
var canvasOffsetY = canvas.offset().top;
var context = canvas[0].getContext('2d');
//draw line
context.beginPath();
context.moveTo(sourceX - canvasOffsetX, sourceY - canvasOffsetY);
context.lineTo(targetX - canvasOffsetX, targetY - canvasOffsetY);
context.closePath();
//ink line
context.lineWidth = 2;
context.strokeStyle = "#000"; //black
context.stroke();
}
,
drawLines: function () {
//reset the canvas
$().yourExt._readjustHTML5CanvasHeight();
var elementsToDrawLinesBetween;
//you must create an object that holds the start and end of the line
//and populate a collection of them to iterate through
elementsToDrawLinesBetween.each(function (i, startEndPair) {
//dot notation used, you will probably have a different method
//to access these elements
var start = startEndPair.start;
var end = startEndPair.end;
$().yourExt._drawLineBetweenElements(start, end);
});
}
Теперь вы можете вызывать эти функции из обработчиков событий (например Событие перетаскивания пользовательского интерфейса JQuery ) для рисования линий.