使用 Dojo boxConstrainedMoveable 将 movable div 约束为 window
Use Dojo boxConstrainedMoveable to constrain movable div to window
我有一个 div,我对其应用了 Dojo dojo/dnd/Moveable。但是,我想阻止用户将 div 拖到屏幕外。所以,我想我需要实施dojo/dnd/move/boxConstrainedMoveable。
我从这个开始:
var dnd = new Moveable(this.domNode, {
'handle': this.titleNode
});
这里有一个类似的 SO 问题:
Constrain a moveable object in Dojo。应用这个答案,我得到这样的结果:
var dnd = new move.boxConstrainedMoveable(
'handle': this.titleNode
constraints: {
l: 0,
t: 20,
w: 500,
h: 500
},
within: true
);
但是,我就是不明白边界框是如何工作的。我只是希望 div 留在 window 内。我已经尝试使用 window 框(div 的边距框)实现一些功能。什么都没用,弄得一团糟。
我在这里阅读了文档:
http://dojotoolkit.org/api/?qs=1.9/dojo/dnd/move.boxConstrainedMoveable
有人用 Dojo 做过吗?我会非常感激一个例子。
我查阅了一些旧代码,我确实实现了一次这种类型的可移动。这是针对 Dojo 1.7 编写的,因此在 1.9 中可能有所改变。 Fiddle 示范:https://jsfiddle.net/4ev1daqr/26/
您尝试的解决方案与此解决方案之间的主要区别在于 moveable
中的 constraints
属性 需要是 函数 而不是比静态边界框。使用boxConstrainedMoveable
模块时,静态边界框应该分配给box
属性,而不是constraints
属性.
恕我直言,这实际上是一个不错的设计,因为它允许约束对应用程序状态的变化做出反应,例如隐藏侧边栏或移动拆分器,但这确实会使简单的情况变得更难工作。
define(["dojo/_base/declare",
"dojo/dnd/move",
"dojo/dom",
"dojo/_base/window",
"dojo/dom-style",
"dojo/dom-geometry",
],
function (declare, move, dom, win, domStyle, domGeom) {
return declare( "my/dnd/move/BodyConstrainedMoveable", [move.constrainedMoveable], {
markupFactory: function(params, node){
return new this(node, params);
},
constructor: function(node, params) {
// Constrain the node to be within the body
this.constraints = function() {
var n = win.body(),
s = domStyle.getComputedStyle(n),
mb = domGeom.getMarginBox(n, s);
if ( this.node ) {
var menubox = domGeom.getMarginBox(this.node);
mb.w -= menubox.w;
mb.h -= menubox.h;
}
return mb;
};
}
})});
我有一个 div,我对其应用了 Dojo dojo/dnd/Moveable。但是,我想阻止用户将 div 拖到屏幕外。所以,我想我需要实施dojo/dnd/move/boxConstrainedMoveable。
我从这个开始:
var dnd = new Moveable(this.domNode, {
'handle': this.titleNode
});
这里有一个类似的 SO 问题: Constrain a moveable object in Dojo。应用这个答案,我得到这样的结果:
var dnd = new move.boxConstrainedMoveable(
'handle': this.titleNode
constraints: {
l: 0,
t: 20,
w: 500,
h: 500
},
within: true
);
但是,我就是不明白边界框是如何工作的。我只是希望 div 留在 window 内。我已经尝试使用 window 框(div 的边距框)实现一些功能。什么都没用,弄得一团糟。
我在这里阅读了文档: http://dojotoolkit.org/api/?qs=1.9/dojo/dnd/move.boxConstrainedMoveable
有人用 Dojo 做过吗?我会非常感激一个例子。
我查阅了一些旧代码,我确实实现了一次这种类型的可移动。这是针对 Dojo 1.7 编写的,因此在 1.9 中可能有所改变。 Fiddle 示范:https://jsfiddle.net/4ev1daqr/26/
您尝试的解决方案与此解决方案之间的主要区别在于 moveable
中的 constraints
属性 需要是 函数 而不是比静态边界框。使用boxConstrainedMoveable
模块时,静态边界框应该分配给box
属性,而不是constraints
属性.
恕我直言,这实际上是一个不错的设计,因为它允许约束对应用程序状态的变化做出反应,例如隐藏侧边栏或移动拆分器,但这确实会使简单的情况变得更难工作。
define(["dojo/_base/declare",
"dojo/dnd/move",
"dojo/dom",
"dojo/_base/window",
"dojo/dom-style",
"dojo/dom-geometry",
],
function (declare, move, dom, win, domStyle, domGeom) {
return declare( "my/dnd/move/BodyConstrainedMoveable", [move.constrainedMoveable], {
markupFactory: function(params, node){
return new this(node, params);
},
constructor: function(node, params) {
// Constrain the node to be within the body
this.constraints = function() {
var n = win.body(),
s = domStyle.getComputedStyle(n),
mb = domGeom.getMarginBox(n, s);
if ( this.node ) {
var menubox = domGeom.getMarginBox(this.node);
mb.w -= menubox.w;
mb.h -= menubox.h;
}
return mb;
};
}
})});