- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图将一个圆圈拖到另一个圆圈上以连接两条路径。问题是当我将一个圆圈 (c2) 拖到另一个圆圈 (c1) 上时,如果圆圈 c1 是在圆圈 c2 之前创建的,则不会触发 c1 鼠标悬停事件。
var closedRoad = true;
var width = 960,
height = 500;
var points = d3.range(1, 5).map(function(i) {
return [i * width / 5, 50 + Math.random() * (height - 100)];
});
var points1 = d3.range(1, 5).map(function(i) {
return [i * width / 5, 50 + Math.random() * (height - 100)];
});
var points2 = d3.range(1, 5).map(function(i) {
return [i * width / 5, 50 + Math.random() * (height - 100)];
});
var count = 0;
var ways = [];
var currentWay = null;
var selected = null;
var line = d3.svg.line();
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
var rect = svg.append("rect")
.attr("width", width)
.attr("height", height);
ways.forEach(function(way, i) {
svg.append("path")
.datum(way)
.attr("id", "p" + way.id)
.attr("class", "line")
.call(redraw);
});
d3.select(window)
.on("keydown", keydown)
//.on("mousemove", mousemove)
//.on("mouseup", mouseup)
.on("mousedown", mousedown)
.on("dblclick", dblclick);
function redraw(way) {
way.attr("d", function(d) { return line(d.pts); });
var circle = svg.selectAll(".way" + way.data()[0].id)
.data(way.data()[0].pts, function(d) { return d; });
circle.enter().append("circle")
.attr("class", "way" + way.data()[0].id)
.attr("r", 1e-6)
.on("mousedown", function(d) {
if (closedRoad) {
currentWay = way.data()[0];
selected = d;
if (d3.event) {
d3.event.preventDefault();
d3.event.stopPropagation();
}
}
})
.on("mouseover", function() { d3.select(d3.event.target).classed("highlight", true); })
.on("mouseout", function() { d3.select(d3.event.target).classed("highlight", false); })
.transition()
.duration(750)
.ease("elastic")
.attr("r", 6.5);
circle
.attr("cx", function(d) { return d[0]; })
.attr("cy", function(d) { return d[1]; });
////
var drag = d3.behavior.drag();
drag.on("dragstart", function(d) {
console.log('START');
})
.on("drag", function(d) {
console.log('MOVE');
var m = d3.mouse(svg.node());
d[0] = Math.max(0, Math.min(width, m[0]));
d[1] = Math.max(0, Math.min(height, m[1]));
//redraw(way);
redrawAll();
})
.on("dragend", function(d) {
console.log('END');
});
circle.call(drag);
////
circle.exit().remove();
}
function dblclick() {
currentWay.pts.pop();
//redraw(svg.select("#p" + currentWay.id));
redrawAll();
closedRoad = true;
}
function mousedown() {
if (closedRoad) {
currentWay = { id: ++count, pts: [] };
ways.push(currentWay);
svg.append("path")
.datum(currentWay)
.attr("id", "p" + currentWay.id)
.attr("class", "line")
.on("mouseover", function() {
d3.select(d3.event.target).classed("highlight", true);
})
.on("mouseout", function() { d3.select(d3.event.target).classed("highlight", false); })
.call(redraw);
closedRoad = false;
}
currentWay.pts.push(selected = d3.mouse(svg.node()));
//redraw(svg.select("#p" + currentWay.id));
redrawAll();
}
function redrawAll() {
ways.forEach(function(way, i) {
redraw(svg.select("#p" + way.id));
});
}
function mousemove() {
}
function keydown() {
if (!selected) return;
switch (d3.event.keyCode) {
case 8: // backspace
case 46: { // delete
var i = currentWay.pts.indexOf(selected);
currentWay.pts.splice(i, 1);
selected = currentWay.pts.length ? currentWay.pts[i > 0 ? i - 1 : 0] : null;
redraw(svg.select("#p" + currentWay.id));
break;
}
}
}
你能帮帮我吗?
谢谢!前!
最佳答案
问题很简单,当两个元素重叠绘制时,'mouseover' 事件只会在最顶层的元素上触发。无论您是否正在处理最顶层元素的鼠标事件,都是如此。改变这种行为需要大量的变通办法,但没有一个是理想的。
一些可能的解决方案:
在您的拖动函数中,反复检查此时是否还有另一个圆圈。
您可以使用 SVGSVGElement.getIntersectionList()
方法来查找给定矩形中的所有元素。请注意,此方法是在 SVG 节点上调用的,而不是在 d3 选择上调用的。
当您拖动一个节点时,通过设置样式使其对鼠标事件“透明”pointer-events:none;
在上面。
当然,这也会使其对拖动事件透明,因此您必须将拖动事件添加到容器而不是节点,然后在'dragstart'事件中找出正在拖动哪个圆,更改它的指针事件样式,并将圆圈选择存储在您的 drag
可访问的变量中函数(它将像您当前的代码一样移动它)和 dragend
函数(它将重新设置其指针事件样式)。您还需要将背景矩形添加到 <svg>
或 <g>
分配了拖动行为的元素,这样即使鼠标仅在“透明”圆上,它也会响应鼠标事件。
当您拖动一个节点时,将其移至绘制顺序的底部,以便所有其他节点绘制在顶部。
由于 SVG 没有像 HTML 那样的“z-index”属性,实现这一点的唯一方法是使用 selection.order()
重新排序 DOM。或纯 Javascript insertBefore()
.
或者,接受这只是一个小的美学缺陷,不会改变代码的功能,因此不值得为上述方法带来的麻烦和性能影响。
如果您不喜欢 某些 圆圈在拖动时会改变颜色,您可以在拖动期间在 svg 上设置一个“拖动”类,并为'highlight' 类只有在它不是 'svg.dragging' 的子级时才进行可见的更改。
关于javascript - 在 d3.js 中的拖放操作期间不会触发鼠标悬停事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21523950/
这个问题已经有答案了: jQuery trigger click vs click ()? (3 个回答) 已关闭 5 年前。 我无法区分 trigger('click')与 trigger('cli
我正在运行 VS 2008 和 .NET 3.5 SP1。 我想在 HttpModule 中实现命中跟踪在我的 ASP.NET 应用程序中。很简单,我想。然而,BeginRequest我的事件 Htt
这是一段代码,我收到以下错误 #1064 - You have an error in your SQL syntax; check the manual that corresponds to yo
有没有办法用任意增量触发滚轮事件。就像 jQuery 对“点击”所做的那样: $('#selector').trigger('click'); 我需要类似的东西,只需一个滚轮即可: $('#selec
我正在尝试在配音数据库中触发时间。我想检查一下在不出现角色的电影配音中不能对角色进行配音。这是PDM: 和CDM 我是SQL的初学者,但我知道表“DUBBES”中应该有一些触发器。我试图做这样的事情,
这个问题已经有答案了: jquery programmatically click on new dom element (3 个回答) 已关闭 6 年前。 我有一个 jQuery 事件定义如下: $
主菜单的点击代码适用于类更改,但不适用于子菜单...当单击食物或鞋子等子菜单项时,它不会触发警报命令...事实上,悬停非常适合子菜单但不是活跃的 HTML
问题非常简单: $('#btn1').click(function(event){ alert( "pageX: " + event.pageX + "\npa
我使用 Spring 的调度程序 (@EnableScheduling) 并具有以下 @Scheduled 方法,该方法每分钟调用一次: @Component public class Schedul
错误 SQL 查询:文档 CREATE TRIGGER `triggers_div` AFTER INSERT ON `produits` FOR EACH ROW BEGIN INSERT INTO
我想在插入另一个表时填充表中的一些列值,并为特定列设置条件。我使用触发器: CREATE TRIGGER inserttrigger AFTER INSERT ON table1 FOR EACH R
我可以在 5.6 MySQL 环境中使用一些关于触发器的指导。我想创建一个触发器,如果发现具有相同速度的电脑的价格较低,则该触发器会停止更新。 架构是产品(制造商、型号、类型)PC(型号、速度、内
背景:我们有一个 completed_flag,默认为 0,当有人完成调查时更新为 1。我想记录这次更新发生的时间戳 在编写了这个触发器/函数以在标志从 0 触发到 1 时更新时间戳后,我怀疑我这样做
数据库中有两个表 KistStatus和 LastKistStatus .后者将保存 KistStatus 的所有“最新”值。 . KistStatus有大约 174.000 条记录,LastKist
我正在开发一个使用 APNS 的 iPhone 应用程序。我很清楚实现 APNS、创 build 备 token 的过程,等等等等……我不知道如何通过 Web 服务从提供商端触发和启动 APNS。任何
我有这个 javascript,当数量更改时会触发 update_cart... jQuery('div.woocommerce').on('change', '.qty', function
当我单击任何按钮时,click 事件不会被触发。艰难的是,我使用 $("div").on("click", "button", function () { 让它工作,但我想看到它使用 .class 工
如何在我的代码中触发 Android onCreateOptionsMenu 函数,即无需用户单击手机上的选项菜单按钮? 最佳答案 Activity.openOptionsMenu(); 就可以了 关
我将表单包装在 中然后我设置 list android:windowSoftInputMode="adjustResize" (默认 react native )。现在,当我用手指触摸事件手动聚焦一
我有一个 Android 编程问题。使用下面的代码我想验证一个字符串匹配。它验证正常,但 LogCat 显示 TextWatcher 方法在每次击键时触发两次,我不明白为什么。我希望每次击键只触发一次
我是一名优秀的程序员,十分优秀!