Работа с элементами полигона SVG
Я пытаюсь работать с полигоном SVG и javascript. Я создаю многоугольник и устанавливаю его начальный список точек следующим образом:
var polygon = document.createElementNS('http://www.w3.org/2000/svg','polygon');
polygon.setAttribute("points", "0,0 100,100 200,200");
теперь что мне делать, если я хочу изменить второй пункт (100 100)? Сейчас я в основном восстанавливаю всю строку. Но можем ли мы как-то обращаться к "polygon.points" как к массиву, или это просто простая простая строка? Это может работать нормально для очень простых полигонов, но если мой многоугольник в конечном итоге имеет сотни пар точек, мне бы не хотелось восстанавливать весь атрибут "точек" в виде строки каждый раз, когда я хочу изменить один элемент.
Спасибо
Ответы
Ответ 1
Я не боюсь. Вы должны снова восстановить строку. Но это не сложно обернуть все это в объект, что-то вроде:
function Polygon () {
var pointList = [];
this.node = document.createElementNS('http://www.w3.org/2000/svg','polygon');
function build (arg) {
var res = [];
for (var i=0,l=arg.length;i<l;i++) {
res.push(arg[i].join(','));
}
return res.join(' ');
}
this.attribute = function (key,val) {
if (val === undefined) return node.getAttribute(key);
node.setAttribute(key,val);
}
this.getPoint = function (i) {return pointList[i]}
this.setPoint = function (i,x,y) {
pointList[i] = [x,y];
this.attribute('points',build(pointList));
}
this.points = function () {
for (var i=0,l=arguments.length;i<l;i+=2) {
pointList.push([arguments[i],arguments[i+1]]);
}
this.attribute('points',build(pointList));
}
// initialize 'points':
this.points.apply(this,arguments);
}
var polygon = new Polygon(0,0, 100,100, 200,200);
polygon.setPoint(0, 50,10); // set point and automatically re-build points
polygon.points(50,50, 50,100, 200,100); // set everything
polygon.node; // refer to the actual SVG element
* не лучшая реализация, но вы получаете идею.
Ответ 2
Вы можете получить доступ к отдельным значениям точки с помощью SVG DOM:
var p = polygon.points.getItem(1);
p.x = 150;
p.y = 300;
(Предположим, что ваш UA реализует этот интерфейс.) См. SVGPolygonElement
, SVGAnimatedPoints
, SVGPointList
и SVGPoint
.
Я нахожу, что использование этих интерфейсов SVG DOM (по крайней мере для меня в Batik, в котором я использую большинство моих материалов SVG) часто не быстрее, чем просто обновление атрибута с помощью манипуляций с строкой.
Ответ 3
Вам нужно использовать setAttributeNS
. Вероятно, вам захочется кэшировать это пространство имен в переменной где-то, поэтому вам не нужно будет ее печатать.
Ответ 4
Вам нужно установить все точки сразу, производительность довольно прочная, что вам может понадобиться - это управлять массивом снаружи и объединить его в вызовы setAttribute