我在PaperScript中创建了两类对象:Node
和Line
。每行都有一个this.nodes
属性,该属性是一个引用两个Node对象的数组,每个对象用于该行的每一端。节点具有this.dragging
属性,在创建Node对象时初始化为false
,但在true
事件中设置为onMouseDown
并重新设置为{{1在false
。这样我就可以跟踪节点是否打算在某个时间点移动。
现在我希望能够检查onMouseUp
个对象是否在任何时间点拖动了相关的节点。为此,我有一个if语句来检查是否Line
。如果返回true,则可能发生进一步的操作。
问题是(this.nodes[0].dragging == true || this.nodes[1].dragging == true)
总是返回false,无论我是否在拖动Node。为什么会这样?特别是当我从this.nodes[i].dragging
对象中检查this.dragging
的值时,它确实在拖动时返回正确的值,否则返回false。
EDIT包含了一些代码:
以下是我的代码的精简版本。重要的是Node
变量。
this.dragging
以下是Line对象的构造函数的一部分:
function Node(pos) {
///// Stuff
this.dragging = false;
this.node.onMouseDown = function(event) {
this.dragging = true;
// Do other stuff
}
this.node.onMouseDrag = function(event) {
if (this.dragging == true) {
// Do stuff
}
}
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}
}
第二个EDIT评论者请求我如何实例化这些对象:
我将它们实例化如下:
function Line(p1, p2) {
this.nodes = [p1, p2];
///// Stuff
this.update = function() {
if (this.nodes[0].dragging === true || this.nodes[1].dragging === true) {
// True
} else {
// False
}
}
}
提供现场演示
答案 0 :(得分:1)
我认为问题是this
,如下面代码中this.dragging
引用的是全局对象(窗口),而不是您创建的对象。
this.node.onMouseDown = function(event) {
this.dragging = true;
// Do other stuff
}
this.node.onMouseDrag = function(event) {
if (this.dragging == true) {
// Do stuff
}
}
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}
您可以通过查看是否已创建全局变量拖动来进行检查。我无法修改您的代码,除非它在小提琴或其他易于使用的位置,但您应该能够通过绑定每个鼠标处理函数来修复它对此如下:
this.node.onMouseUp = function(event) {
// Do stuff
this.dragging = false;
}.bind(this)
或者通过创建一个具有本地引用的闭包,该闭包不会发生变化,如:
self = this;
然后从函数中引用self
而不是this
。