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 2

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, это действительно замечательная работа !!