因此,我试图创建一个包含两个canvas元素的项目,每个canvas元素都有其自己的paperscript,并且每个控件的外部都具有用于控制两者中某些功能的按钮。
在Paperscript下的文档下,它表示:
请注意:
当在页面中包含多个PaperScript时,每个脚本都将在其自己的范围内运行,而不会看到其他脚本中声明的对象和函数。要使PaperScript与其他PaperScript或> JavaScript代码进行通信,请参阅有关PaperScript互操作性的教程。
...这很不幸,因为该教程的内容如下:
即将推出!
我在这个过程中很快陷入困境。我试过将函数放在全局范围内,从其画布外部调用它们,然后看到它们在错误的画布上打印。我尝试通过模块导出函数,但似乎可以运行该函数(?!?!)。最糟糕的是,“ paper.projects”对象是其中一个项目(第一个画布)的数组。
所以我很困惑。
有人知道怎么做吗?
编辑:显然有this answer,但是我看不到如何从全局范围脚本中调用PaperScript范围中的函数。
这似乎是一个调用PaperScope中的全局函数的脚本,如果我试图让外部按钮执行操作,则该脚本对我不起作用。
显然我缺少了一些东西。
第二次编辑:我在window.global中或在没有var声明的情况下独自坐着,使用过各种全局函数……但是似乎发生的是,当我尝试调用我定义的函数时,表示为:
globals.makecircle = function () {
var o = new Path.Circle({
radius: 50,
center: new Point (200,200)
})
}
在主作用域中,它将与正确的窗口一样在错误的窗口中运行。另外,在运行之前还有一个令人难以置信的延迟,我无法弄清楚。
第三编辑:为清楚起见。
我在HTML中将
firstcanvas.js
附加到canvas1
,将secondcanvas.js
附加到canvas2
。两者都被称为paperscript类型,如下所示:<script type="text/paperscript" src="scripts/firstcanvas.js" canvas="canvas1"></script>
<script type="text/paperscript" src="scripts/secondcanvas.js" canvas="canvas2"></script>
我按照Jurg的建议创建了
window.globals
对象。我用一个按钮从main.js调用它,例如:window.globals = {}
`$('document').ready($('#dfs').on('click', window.globals.makecircle))`
如上所述,我将此功能添加到
firstcanvas.js
中的全局变量中。如果我最近单击canvas2,单击带有
id='DFS'
的按钮将导致该功能在canvas2上极度延迟地运行。而且
paper.projects
不会列出两个项目,所以我不能使用activate()
函数。 最佳答案
好的!解决了!!!
以下是从全局范围引用/激活PaperScript创建的范围的方法。尽管没有用户可访问的范围数组(我知道),但PaperScope.get(id)
会检索它们。由于某种原因,我发现PaperScope.get(0)
已经填充,并且我的两个canvas / PaperScript元素实际上引用的是ID为1和2的作用域。
因此:
pscope1 = PaperScope.get(1)
pscope2 = PaperScope.get(2)
然后,在任何我想在第一个画布上做某事的函数中:
pscope1.activate()
// cool paper.js graphics stuff
pscope1.view.update()
最后一行是因为
paper.js
不会自动更新用户未与之交互的视图。感谢Jurg Lehni提示使用
.activate()
。PS使用
PaperScope.get
之前,请确保已创建paperscript对象。我为此使用了很好的'ol JQuery $('document').ready()
...PPS Jurg Lehni本人的另一个小小的冲击:在PaperScript中,
this
将指向当前范围。您可以使用它并将其存储在全局对象中。