Raphael.js - пользовательские атрибуты
Можно ли определить пользовательский атрибут для элемента Raphael?
например
r.circle(25,50,10).attr({fill:'#b71e16', stroke:'#71140f', 'my_custom_attribute':'a value'});
Причина в том, что мне нужно это то, что я хочу сделать довольно сложную анимацию для целого набора элементов, и я хочу где-нибудь сохранить исходную координату y для каждого из них.
3 ответа
Является ли пользовательский атрибут, который вы хотите:
- Простое хранилище для произвольных данных, которые будут записаны и получены?
- Атрибут, в котором необходимо изменить пользовательское действие при его изменении (например, атрибуты, контролируемые с помощью Рафаэля
.attr()
а также.animate()
)? - Что-то, что вы хотите использовать в атрибутах выходной разметки SVG / VML на странице / DOM? (обычно не рекомендуется, но иногда необходимо)
1. Таможенное хранение и поиск данных
Я на 99% уверен, что официальным, предполагаемым способом хранения произвольных данных в Рафаэле является использование .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 говорят о том, что она предназначена для использования именно так, поэтому я вполне уверен, что это метод, предназначенный для присоединения произвольных данных к Raphael объекты.
2. Пользовательские функции, запускаемые attr()
или же animate()
Если вам нужен пользовательский атрибут, который ведет себя как атрибуты Raphael - запуск функции или преобразования при изменении с помощью 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 не синхронизируется с элементом, которым он управляет, что может привести к поломке. Если вы не осторожны и не используете такую технику...).
Вот пример (при условии, что jQuery также используется, jQuery не обязателен, но более удобен), который устанавливает свойство SVG dy
, который позволяет вам контролировать межстрочный интервал текста Рафаэля (примечание - пример кода, еще не протестированный в VML/IE. обновится, если он не будет работать в режиме VML):
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);
Я думаю, что вы можете сделать:
var circle = r.circle(25,50,10).attr({fill:'#b71e16', stroke:'#71140f'});
затем
circle["custom-attribute"] = value;
Надеюсь это поможет.
Да, вы должны быть в состоянии сделать следующее:
.attr({title: value});
Конечно, заголовок - это имя атрибута, который вы хотите установить или создать, а значение должно быть значением. Конечно, рассматриваемый элемент рафаэля будет получателем attr.