这个答案给出了一个有用的解释,说明如何向特定对象而不是画布上的所有对象添加“链接”(实际上是重定向到URL的事件):
How to add URL to an image in Fabric.js?
但是,当放置在生成多个对象的循环中时,它仅链接到创建的最后一个对象的值。
这是一个例子:
for (var p = 0; p<2; p++) {
var object = new fabric.Circle({ radius: 10, top: 10 + 20 * p, left: 10 });
object.on('selected', function() {
window.location.href = "mylink" + "/" + p;
})
canvas.add(object);
}
当我要的是第一个对象链接到“ mylink / 0”,第二个对象链接到“ mylink / 1”时,这两个对象都链接到“ mylink / 1”。
我的Java技术技能停留在1999年,但是对我来说,这似乎是个懒惰的加载问题。如何强制从每个循环创建的对象具有自己的功能?
最佳答案
它似乎与延迟评估/关闭有关。
使用这个漂亮的答案(Javascript: Creating Functions in a For Loop),我能够制定一个解决方案。希望在这里发布对其他人有用。请参阅链接的答案以了解其工作原理。
var fxnArr = [];
for( var p = 0; p < rows.length; p++ ) {
fxnArr[fxnArr.length] = (function(val) { return function(){
window.location.href = "mylink" + "/" + val;
} })(p);
}
for (var p = 0; p<2; p++) {
var object = new fabric.Circle({ radius: 10, top: 10 + 20 * p, left: 10 });
object.on('selected', fxnArr[p] );
canvas.add(object);
}