gpt4 book ai didi

javascript - 无法读取事件监听器中 null 的属性 'sourceEvent'

转载 作者:数据小太阳 更新时间:2023-10-29 05:38:27 24 4
gpt4 key购买 nike

我刚开始学习 d3.js 库。我需要制作一个 svg 编辑器,我教过使用这个编辑器是个好主意。我有一个问题,我写了一些函数,我希望这些函数在单击鼠标时运行。

这些函数创建了一条从 A 点到 B 点的线,所以我只需要在单击 Line 按钮时调用这些函数。

这是代码块:

var line;
var container = d3.select("body").append("svg")
.on('mousedown',mousedown)
.on('mouseup',mouseup);


function mousedown() {
var coordinates = d3.mouse(this);
line = container.append("line")
.attr("x1", coordinates[0])
.attr("y1", coordinates[1])
.attr("x2", coordinates[0])
.attr("y2", coordinates[1]);

container.on("mousemove", mousemove);
};

function mousemove(){
var coordinates = d3.mouse(this);
line.attr("x2", coordinates[0])
.attr("y2", coordinates[1]);
};
function mouseup(){
container.on("mousemove", null);
};

html

<button id="lineBtn">Line</button>

CSS

line {
stroke: black;
stroke-width: 3px;
}

svg{
border:1px solid black;
width:500px;
height:500px;
margin-left: 40%;
margin-right:40%;
}

最佳答案

根据您的comment ,问题在于您处理按钮的方式:

document.getElementById("lineBtn").onclick = function drawLine(){ 
mousedown();
mousemove();
mouseup();
};

您不能像这样调用这些函数有几个原因,但主要是因为没有 this 传递给 d3.mouse,因此没有源事件。

更好的方法是使用按钮设置正确的监听器,如下所示:

d3.select("#lineBtn").on("click", function() {
container.on('mousedown', mousedownLine)
.on('mouseup', mouseupLine);
});

d3.select("#circleBtn").on("click", function() {
container.on('mousedown', mousedownCircle)
.on('mouseup', mouseupCircle);
});

这是一个演示(使用 D3 v5,在这个问题上与您的 v3 没有什么不同):

var line;
var circle;
var container = d3.select("body").append("svg");

d3.select("#lineBtn").on("click", function() {
container.on('mousedown', mousedownLine)
.on('mouseup', mouseupLine);
});

d3.select("#circleBtn").on("click", function() {
container.on('mousedown', mousedownCircle)
.on('mouseup', mouseupCircle);
});

function mousedownLine() {
container.on("mousemove", mousemoveLine);
var coordinates = d3.mouse(this);
line = container.append("line")
.attr("x1", coordinates[0])
.attr("y1", coordinates[1])
.attr("x2", coordinates[0])
.attr("y2", coordinates[1]);
};

function mousemoveLine() {
var coordinates = d3.mouse(this);
line.attr("x2", coordinates[0])
.attr("y2", coordinates[1]);
};

function mouseupLine() {
container.on("mousemove", null);
};

function mousedownCircle() {
container.on("mousemove", mousemoveCircle);
var coordinates = d3.mouse(this);
circle = container.append("circle")
.attr("cx", coordinates[0])
.attr("cy", coordinates[1]);
};

function mousemoveCircle() {
var coordinates = d3.mouse(this);
circle.attr("r", Math.hypot(coordinates[0] - circle.attr("cx"), coordinates[1] - circle.attr("cy")));
};

function mouseupCircle() {
container.on("mousemove", null);
};
line {
stroke: teal;
stroke-width: 2px;
}

circle {
stroke: tomato;
fill: none;
stroke-width: 2px;
}

svg {
border: 1px solid black;
width: 500px;
height: 300px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<button id="lineBtn">Line</button>
<button id="circleBtn">Circle</button>

关于javascript - 无法读取事件监听器中 null 的属性 'sourceEvent',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com