传数组给svg.js的polyline数组方法报错
Passing an array to feed svg.js's polyline array method throws an error
我正在使用 svg.js 的折线数组方法从通过在页面上存储光标的 x,y 坐标记录的值绘制线条。
想法是首先让用户浏览页面并四处移动光标,然后将值输入数组,然后在单击按钮时 svg.js 将根据光标的移动绘制线条.
this 语法遵循:
var polyline = draw.polyline([[0,0], [100,50], [50,100]]).fill('none').stroke({ width: 1 })
如果我手动复制粘贴数组中的值,如下所示:
var polyline = draw.polyline([[475,76], [475,76], [489,75], (...)]]).fill('none').stroke({ width: 1 });
svg.js 按预期工作。
如果我传入一个变量,它会告诉我:
svg.js:2632 Error: <polyline> attribute points: Expected number, "NaN,528 NaN,531 …".
这是我的代码:
// movement
var array_cursor_movement = [];
$(document).mousemove(function(e) {
var cursor_movement = "["+ e.pageX +","+ e.pageY +"]";
array_cursor_movement.push(cursor_movement);
var cursor_movement = array_cursor_movement.join(', ');
console.log("movement:" + cursor_movement);
localStorage.setItem("cursor_movement_pos", JSON.stringify(array_cursor_movement));
});
// click for preview lines
$(".preview--lines, .close--button").click(function(){
$(".preview").toggleClass("show--hide");
// draw lines
var retrievedData = localStorage.getItem("cursor_movement_pos");
var array_cursor_movement_b = JSON.parse(retrievedData);
var cursor_movement = array_cursor_movement_b.join(', ');
cursor_movement = "["+cursor_movement+"]";
console.log("preview:" + cursor_movement);
var width = window.innerWidth;
var height = window.innerHeight;
var draw = SVG('drawing').size(width, height);
var polyline = draw.polyline(cursor_movement).fill('none').stroke({ width: 1 });
})
有人有经验吗?
谢谢,
安德烈
正如我在评论中提到的那样:停止制作字符串!!传数组就行了!
// movement
var array_cursor_movement = [];
$(document).mousemove(function(e) {
// var cursor_movement = "["+ e.pageX +","+ e.pageY +"]"; // NO - stop making strings!
var cursor_movement = [ e.pageX, e.pageY ];
array_cursor_movement.push(cursor_movement);
// var cursor_movement = array_cursor_movement.join(', '); // STOP
console.log("movement:", cursor_movement);
localStorage.setItem("cursor_movement_pos", JSON.stringify(array_cursor_movement));
});
// click for preview lines
$(".preview--lines, .close--button").click(function(){
$(".preview").toggleClass("show--hide");
// draw lines
var retrievedData = localStorage.getItem("cursor_movement_pos");
var array_cursor_movement_b = JSON.parse(retrievedData);
// var cursor_movement = array_cursor_movement_b.join(', '); // what did I say?
// cursor_movement = "["+cursor_movement+"]";
// console.log("preview:", cursor_movement);
var width = window.innerWidth;
var height = window.innerHeight;
var draw = SVG('drawing').size(width, height);
// just pass the array and not the string
var polyline = draw.polyline(array_cursor_movement_b).fill('none').stroke({ width: 1 });
})
PS:更正代码笔:http://codepen.io/anon/pen/dMjgdO
// 编辑:我想我说得更清楚了:
正如您自己所说,创建折线的语法如下:
var polyline = draw.polyline([[0,0], [100,50], [50,100]]).fill('none').stroke({ width: 1 })
但您尝试这样做:
var polyline = draw.polyline("[[0,0], [100,50], [50,100]]").fill('none').stroke({ width: 1 })
^ you notice the quotes here?
所以你没有将数组传递给函数。您传递了一个看起来像数组的字符串。
请注意,创建多段线还有另一种语法:
var polyline = draw.polyline('0,0 100,50 50,100').fill('none').stroke({ width: 1 })
所以你实际上可以传递一个字符串。它只是一个逗号和 space 分隔的列表。但是不要那样做。您已经创建了数组。你不需要字符串。
我正在使用 svg.js 的折线数组方法从通过在页面上存储光标的 x,y 坐标记录的值绘制线条。
想法是首先让用户浏览页面并四处移动光标,然后将值输入数组,然后在单击按钮时 svg.js 将根据光标的移动绘制线条.
this 语法遵循:
var polyline = draw.polyline([[0,0], [100,50], [50,100]]).fill('none').stroke({ width: 1 })
如果我手动复制粘贴数组中的值,如下所示:
var polyline = draw.polyline([[475,76], [475,76], [489,75], (...)]]).fill('none').stroke({ width: 1 });
svg.js 按预期工作。
如果我传入一个变量,它会告诉我:
svg.js:2632 Error: <polyline> attribute points: Expected number, "NaN,528 NaN,531 …".
这是我的代码:
// movement
var array_cursor_movement = [];
$(document).mousemove(function(e) {
var cursor_movement = "["+ e.pageX +","+ e.pageY +"]";
array_cursor_movement.push(cursor_movement);
var cursor_movement = array_cursor_movement.join(', ');
console.log("movement:" + cursor_movement);
localStorage.setItem("cursor_movement_pos", JSON.stringify(array_cursor_movement));
});
// click for preview lines
$(".preview--lines, .close--button").click(function(){
$(".preview").toggleClass("show--hide");
// draw lines
var retrievedData = localStorage.getItem("cursor_movement_pos");
var array_cursor_movement_b = JSON.parse(retrievedData);
var cursor_movement = array_cursor_movement_b.join(', ');
cursor_movement = "["+cursor_movement+"]";
console.log("preview:" + cursor_movement);
var width = window.innerWidth;
var height = window.innerHeight;
var draw = SVG('drawing').size(width, height);
var polyline = draw.polyline(cursor_movement).fill('none').stroke({ width: 1 });
})
有人有经验吗?
谢谢, 安德烈
正如我在评论中提到的那样:停止制作字符串!!传数组就行了!
// movement
var array_cursor_movement = [];
$(document).mousemove(function(e) {
// var cursor_movement = "["+ e.pageX +","+ e.pageY +"]"; // NO - stop making strings!
var cursor_movement = [ e.pageX, e.pageY ];
array_cursor_movement.push(cursor_movement);
// var cursor_movement = array_cursor_movement.join(', '); // STOP
console.log("movement:", cursor_movement);
localStorage.setItem("cursor_movement_pos", JSON.stringify(array_cursor_movement));
});
// click for preview lines
$(".preview--lines, .close--button").click(function(){
$(".preview").toggleClass("show--hide");
// draw lines
var retrievedData = localStorage.getItem("cursor_movement_pos");
var array_cursor_movement_b = JSON.parse(retrievedData);
// var cursor_movement = array_cursor_movement_b.join(', '); // what did I say?
// cursor_movement = "["+cursor_movement+"]";
// console.log("preview:", cursor_movement);
var width = window.innerWidth;
var height = window.innerHeight;
var draw = SVG('drawing').size(width, height);
// just pass the array and not the string
var polyline = draw.polyline(array_cursor_movement_b).fill('none').stroke({ width: 1 });
})
PS:更正代码笔:http://codepen.io/anon/pen/dMjgdO
// 编辑:我想我说得更清楚了: 正如您自己所说,创建折线的语法如下:
var polyline = draw.polyline([[0,0], [100,50], [50,100]]).fill('none').stroke({ width: 1 })
但您尝试这样做:
var polyline = draw.polyline("[[0,0], [100,50], [50,100]]").fill('none').stroke({ width: 1 })
^ you notice the quotes here?
所以你没有将数组传递给函数。您传递了一个看起来像数组的字符串。
请注意,创建多段线还有另一种语法:
var polyline = draw.polyline('0,0 100,50 50,100').fill('none').stroke({ width: 1 })
所以你实际上可以传递一个字符串。它只是一个逗号和 space 分隔的列表。但是不要那样做。您已经创建了数组。你不需要字符串。