RaphaelJS 2.1 vs. 1.5.2 ошибка getBBox
Я пытаюсь создать перетаскиваемый граф, подобный http://raphaeljs.com/graffle.html (работает как в 1.5.2, так и в 2.1), но я хочу включить текст в поля.
Я добавил текст, используя предложение в другом вопросе: Как я могу объединить объекты в библиотеке javascript Рафаэля?
Это решение отлично работает с RaphaelJS 1.5.2, но оно ломается в RaphaelJS 2.1.
Пример JsFiddle: http://jsfiddle.net/ScBtZ/
Единственное различие, которое я обнаружил, заключается в том, чтоElement.getBBox()
возвращает совсем другой результат.
образец:
в 1.5.2:
SVGRect
height: 40
width: 100
x: 526.5
y: 25
В 2.1:
Object
height: 500780.9482062537
width: 1009980
x: 526.51
x2: 1010506.51
y: -399735.94795512746
y2: 101045.00025112627
Я что-то упустил в изменении с v1.5 на v2, или этот странный BBox-ошибка? Есть идеи, как я могу исправить эту проблему?
Спасибо!
5 ответов:
Ну, похоже, была попытка заменить собственный метод
getBBox
пользовательской реализацией, в Рафаэле. Причиной этого может быть то, что собственный метод getBBox имеет некоторые ошибки, и он возвращает неправильные результаты для некоторых фигур. Другой причиной может быть переносимость браузера, я не уверен, есть ли метод getBBox в VML.Однако из значений, которые вы указали, похоже, что эта пользовательская реализация имеет свои недостатки. Вы можете использовать родной getBBox в Рафаэль 2.x с этим кодом:
var bb1 = obj1.node.getBBox(), bb2 = obj2.node.getBBox(),
Я проверил его и выглядит хорошо: http://jsfiddle.net/ScBtZ/2/
Raphael 2 getBBox может быть немного глючным, но в вашем случае ваши данные неверны. Попробуйте удалить " вокруг чисел:
Http://jsfiddle.net/nhatcher/ScBtZ/9/
Хороший пример!
(обратите внимание, что другое решение разбито в VML)
Я пришел сюда уже после того, как ответ был принят, но у меня все еще были некоторые проблемы. Если вы похожи на меня, вы можете захватить последнюю версию dev от Рафаэля.js GitHub: https://github.com/DmitryBaranovskiy/raphael/
Рафаэль, похоже, включил ответ Андреаса (в строке 1972, а не 1300, как было в случае, когда ответ был написан). Последний выпуск dev Рафаэля работал на меня.
Рафаэль действительно имел ошибку, если вы используете BBox в сочетании с трансформацией. Я нашел решение, которое работает на меня.
Линия 1300 в Рафаэле.js
var pathDimensions = R.pathBBox = function (path) { var pth = paths(path); if (pth.bbox) { return clone(pth.bbox) ; // FREEGROUP FIX!!!!!! } if (!path) { return {x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0}; }
Ответ Андреаса верен ...
Также упоминается в https://github.com/DmitryBaranovskiy/raphael/issues/543
Clone-это правильное решение, если вам нужно повторно использовать функцию getBBox () больше, чем пару раз, поскольку она внутренне изменяется ....
Кстати: спасибо Дмитрию за Рафаэля.js, это действительно замечательная работа !!