我为可折叠树编写了代码,该树在桌面屏幕上运行良好。我单击该节点,然后将该节点扩展到另一个子节点,依此类推。当我将鼠标悬停在节点上时,它正在正确拖动。
但是,当我在Android或iphone等设备上打开树时,它无法正常工作。点击事件正常运行。通过单击该节点,它正在扩展,但是当我要拖动该节点时,它并没有拖动。
当我点击以将节点保留在移动设备上时,该节点的文本被选中,这不是我想要的。
我使用了d3.js提供的touchstart,touchend事件。
我的手机代码如下:-
if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
var dragMobile = function(d) {
// d3.event.stopPropagation();
svg.on("touchstart", function() {
d3.event.stopPropagation();
var m = d3.touches(svg.node());
moveMobile(d, parseInt(m[0]) - parseInt(d.y), parseInt(m[0][1]) - parseInt(d.x));
link.attr("d", diagonal);
node.attr("transform", function(d) { return "translate(" + [d.y, d.x] + ")"; });
})
.on("touchend", function() {
svg.on("touchstart", null);
});
};
...
var node = svg.selectAll("g.node")
.data(nodes, function(d) { return d.id || (d.id = ++i); })
.on("touchstart", dragMobile);
...
var nodeEnter = node.enter().append("g")
.on("click", click)
.on("touchstart", dragMobile);
我的移动功能:-
function moveMobile(root, xOffset, yOffset) {
root.x += yOffset;
root.y += xOffset;
if (root.children) {
root.children.forEach(function(d) { move(d, xOffset, yOffset); });
}
};