Raphael.js - пользовательские атрибуты - PullRequest
24 голосов
/ 08 июля 2011

Можно ли определить пользовательский атрибут для элемента Raphael?

, например

r.circle(25,50,10).attr({fill:'#b71e16', stroke:'#71140f', 'my_custom_attribute':'a value'});

Причина, по которой мне это нужно, заключается в том, что я хочу сделать довольно сложную анимацию для целого набора элементов, и я хочу где-то сохранить исходную координату y для каждого из них.

Ответы [ 3 ]

41 голосов
/ 23 февраля 2012

Это пользовательский атрибут, который вы хотите:

  1. A Простое хранилище для произвольных данных, подлежащих записи и извлечению?
  2. Атрибут, в котором пользовательское действие должно быть выполнено при его изменении (например, атрибуты, контролируемые с помощью .attr() и .animate() Рафаэля)?
  3. Что-то, что вы хотите ввести в атрибуты выходной разметки SVG / VML на странице / DOM? (обычно не рекомендуется, но иногда необходимо)

1. Хранение и поиск пользовательских данных

Я на 99% уверен, что официальным, предполагаемым способом хранения произвольных данных в Raphael является использование функции .data(), например,

var circle = r.circle(25,50,10).attr({fill:'#b71e16', stroke:'#71140f'});
// set it
circle.data('custom-attribute', 'value');

// get it
data = circle.data('custom-attribute');
alert(data);

Обратите внимание, что с Raphael 2.1 это работает для элементов, не устанавливает . Когда мне нужно присвоить данные набору, я стремлюсь установить их с помощью цикла for и получить с помощью someSet[0].data() - что-то вроде кучи, но это работает.

К сожалению, документация для .data вообще ничего не говорит о том, для чего она (на момент написания) ... но .data() в jQuery, data-* в HTML5, и т. д. и т. д. все имеют эту цель, используя это, как это работает, и другие на SO говорят о намерении использовать его вот так , так что я довольно уверен, что это предполагаемый метод для присоединения произвольных данные к объектам Рафаэля.


2. Пользовательские функции, вызванные attr() или animate()

Если вам нужен пользовательский атрибут, который ведет себя как атрибуты Рафаэля - запуск функции или преобразования при изменении с помощью attr или animate (вроде как крючок Рафаэля) - вот что paper.customAttributes для. Он определяет функцию, которая выполняется каждый раз, когда для любого элемента в этом объекте paper устанавливается именованный пользовательский атрибут. Возвращаемый объект применяется к стандартным атрибутам элемента.

Официальные документы имеют несколько довольно полезных примеров для этого, вот адаптированный:

// A custom attribute with multiple parameters:
paper.customAttributes.hsb = function (h, s, b) {
    return {fill: "hsb(" + [h, s, b].join(",") + ")"};
};
var c = paper.circle(10, 10, 10);
// If you want to animate a custom attribute, always set it first - null isNaN
c.attr({hsb: "0.5 .8 1"});
c.animate({hsb: [1, 0, 0.5]}, 1e3);

Обратите внимание, что this в каждом выполнении customAttribute - это объект Raphael, для которого устанавливается атрибут. Это значит ...


3. Форсирование пользовательского атрибута в разметку SVG или VML в браузере

Рафаэль на самом деле не поддерживает это, так что делайте это, только если вам действительно нужно. Но если вам действительно нужно нужное что-то в разметке, которое Рафаэль просто не поддерживает, вы можете создать элементарный элемент управления для манипулирования им, используя attr и animate, используя paper.customAttributes и element.node (обратите внимание, что документация для element.node в значительной степени просто очень бесполезна: " Не связывайтесь с ней " - причина, по которой вам не следует связываться с этим, заключается в том, что она дает вам элемент SVG или VML напрямую, что означает, что Raphael не знает ни о каких изменениях, которые вы вносите в него, что может привести к тому, что ваш объект Raphael не синхронизируется с элементом, которым он управляет, что может привести к поломке. Если вы не осторожны, и используйте такую ​​технику, как эта ...).

Вот пример (при условии, что jQuery также используется, jQuery не обязателен, но более удобен), который устанавливает свойство SVG dy, которое позволяет вам контролировать межстрочный интервал текста Рафаэля (примечание - пример кода еще нет протестировано в VML / IE. обновится, если не работает в режиме VML):

Пример Live jsfiddle

paper.customAttributes.lineHeight = function( value ) {
    // Sets the SVG dy attribute, which Raphael doesn't control
    var selector = Raphael.svg ? 'tspan' : 'v:textpath';
    var $node = $(this.node);
    var $tspans = $node.find(selector);
    $tspans.each(function(){
        // use $(this).attr in jquery v1.6+, fails for SVG in <= v1.5
        // probably won't work in IE
        this.setAttribute('dy', value );
    });
    // change no default Raphael attributes
    return {};
}
    // Then to use it...
    var text = paper.text(50,50,"This is \n multi-line \n text");
    // If you want to animate a custom attribute, always set it first - null isNaN
    text.attr({lineHeight: 0});
    text.animate({lineHeight: 100},500);
3 голосов
/ 19 июля 2011

Я думаю, что вы можете сделать:

var circle = r.circle(25,50,10).attr({fill:'#b71e16', stroke:'#71140f'});

тогда

circle["custom-attribute"] = value;

Надеюсь, это поможет.

0 голосов
/ 14 июля 2011

Да, вы должны быть в состоянии сделать следующее:

.attr({title: value});

Конечно, заголовок - это имя атрибута, который вы хотите установить или создать, и значение должно быть значением.Конечно, рассматриваемый элемент рафаэля мог бы быть получателем attr.

...