单击 SVG Snap canvas 时触发事件
Fire an event when SVG Snap canvas is clicked
我想跟踪我的 SVG Snap canvas 何时被点击。
var s = Snap("#svgout"), //creates the canvas
source = "data:image;base64," + $('#imageBtn').val(), //set map background for canvas
img = s.image(source, 0, 0, "100%", "100%"), currRect, numNodes = 0;
s.click(function(){
console.log("clicked canvas");
});
基本上,我的 SVG 是一个背景,我在其中拖放了一些元素(组)。我的问题是,单击不仅在单击 canvas 时发生,而且在我单击我的元素之一进行拖动或仅单击它们时也会发生。如何仅在单击 canvas 时触发此事件,而不是在单击 canvas 中的元素时触发此事件?
var rect = s.rect(posx, posy, 40, 40, 6).attr({
fill: "none",
stroke: "#F44336",
strokeWidth: 3,
myId: guidGenerator(),
});
var group = s.group(rect).attr({
cursor: "move",
});
if(numNodes > 0){
currRect.removeAttribute('stroke');
}
currRect = group.node.childNodes[0];
group.append(s.image("../images/pi.svg", posx, posy, 40, 40));
group.drag(move,start, up);
我能想到的选项很少...
在 svg 上放置一个不透明度非常小的矩形,例如。 0.00001。将点击处理程序放在上面,而不是 canvas.
或者,如果您将点击处理程序放在 canvas 上,请检查点击的目标。如果它是 canvas,那么就做点什么,否则忽略它(或做其他事情)。
或者,可以设置一个 class 的 svgcanvas,以及 canvas 具有的 svgdraggables,或者可拖动元素。然后更改 class 如果需要,svgdraggables 是否具有 'pointer-events: none',然后将其放回原处。
检查是否确实是 canvas 被点击的一种方法是检查目标 ID。
var paper = Snap("#svgout");
paper.click(function(e) {
if(e.target.id == "svgout") {
console.log("Canvas Clicked");
}
});
另一种在单击子项时停止单击 canvas 的方法是对传递给子项的单击方法的事件执行 stopPropagation()
。
此方法的问题是您必须将它添加到每个子元素。如果我是你,我会选择第一个例子。
var rect = paper.rect(0,0,40,40);
rect.click(function(e) {
e.stopPropagation();
});
注意:两种方法均由我使用SnapSVG V0.4.1测试过
我想跟踪我的 SVG Snap canvas 何时被点击。
var s = Snap("#svgout"), //creates the canvas
source = "data:image;base64," + $('#imageBtn').val(), //set map background for canvas
img = s.image(source, 0, 0, "100%", "100%"), currRect, numNodes = 0;
s.click(function(){
console.log("clicked canvas");
});
基本上,我的 SVG 是一个背景,我在其中拖放了一些元素(组)。我的问题是,单击不仅在单击 canvas 时发生,而且在我单击我的元素之一进行拖动或仅单击它们时也会发生。如何仅在单击 canvas 时触发此事件,而不是在单击 canvas 中的元素时触发此事件?
var rect = s.rect(posx, posy, 40, 40, 6).attr({
fill: "none",
stroke: "#F44336",
strokeWidth: 3,
myId: guidGenerator(),
});
var group = s.group(rect).attr({
cursor: "move",
});
if(numNodes > 0){
currRect.removeAttribute('stroke');
}
currRect = group.node.childNodes[0];
group.append(s.image("../images/pi.svg", posx, posy, 40, 40));
group.drag(move,start, up);
我能想到的选项很少...
在 svg 上放置一个不透明度非常小的矩形,例如。 0.00001。将点击处理程序放在上面,而不是 canvas.
或者,如果您将点击处理程序放在 canvas 上,请检查点击的目标。如果它是 canvas,那么就做点什么,否则忽略它(或做其他事情)。
或者,可以设置一个 class 的 svgcanvas,以及 canvas 具有的 svgdraggables,或者可拖动元素。然后更改 class 如果需要,svgdraggables 是否具有 'pointer-events: none',然后将其放回原处。
检查是否确实是 canvas 被点击的一种方法是检查目标 ID。
var paper = Snap("#svgout");
paper.click(function(e) {
if(e.target.id == "svgout") {
console.log("Canvas Clicked");
}
});
另一种在单击子项时停止单击 canvas 的方法是对传递给子项的单击方法的事件执行 stopPropagation()
。
此方法的问题是您必须将它添加到每个子元素。如果我是你,我会选择第一个例子。
var rect = paper.rect(0,0,40,40);
rect.click(function(e) {
e.stopPropagation();
});
注意:两种方法均由我使用SnapSVG V0.4.1测试过