javascript - addEventListener (经典 dom svg-elment) 和 .on (at d3js) 之间的区别在哪里

标签 javascript d3.js event-handling

我遇到了 context-event 及其参数的问题。

我的网站使用以下版本来附加事件:

此方法用于简单的图形元素,这些元素在从数据库加载后获取事件:

        const graph = editor.append("g")
        .attr("id", "a" + graphic.Id.toString())
        .html(graphic.SvgString)
        .on("mouseover", graphicMouseOver)
        .on("mouseout", graphicMouseOut)
        .on("mousedown", graphicMouseDown)
        .on("contextmenu", onGraphicContext)
        .call(d3.drag()
            .on("start", graphicDragStart)
            .on("drag", graphicDragging)
            .on("end", graphicDragEnd));

然后我对某种符号有不同的方法,加载到我的编辑器:

        const g = editor.append("g")
        .attr("transform", "translate(" + symbol.SymbolPosition + ")")
        .attr("id", subFunctionId.toString())
        .attr("class", "draggable preview")
        .attr("pointer-events", "fill")
        .call(d3.drag()
            .on("start", symbolDragStart)
            .on("drag", symbolDragging)
            .on("end", symbolDragEnd)
        );

根据某些情况,我稍后会在这些“符号”上附加一些事件:

function addSymbolEvents(svgSymbols) {
log.debug("addSymbolEvents");
for (var i = 0; i < svgSymbols.length; i++) {
    svgSymbols[i].addEventListener('mouseenter', symbolMouseEnter);
    svgSymbols[i].addEventListener('mouseover', symbolMouseOver);
    svgSymbols[i].addEventListener('mouseout', symbolMouseOut);

    svgSymbols[i].addEventListener('pointerdown', symbolMouseDown);
    svgSymbols[i].addEventListener('dblclick', symbolDblClick);
    svgSymbols[i].addEventListener('contextmenu', symbolRightClick);
}
return svgSymbols;
}

如果我按以下方式记录事件参数,我会得到 undefinedonGraphicContext以及 symbolRightClick 上的完整 MouseEvent 对象

function onGraphicContext(evt) {
    console.log("onGraphicContext", evt);
}

function symbolRightClick(evt) {
    console.log("symbolRightClick", evt);
}

这里有什么区别? 不是 d3.js- .on -属性与 addEventListener 相同?

谢谢卡斯滕

最佳答案

selection.on() 是 D3 方法,而不是 native JavaScript。在内部,selection.on() 使用 addEventListener,如 source code 中所示。 。

但是,selection.on() 不仅仅是addEventListener 的包装器。作为API说,当您使用 selection.on() 附加监听器时,该监听器...

...will be evaluated for the element, being passed the current datum (d), the current index (i), and the current group (nodes), with this as the current DOM element (nodes[i])

因此,对于 D3 程序员来说,selection.on() 比仅使用普通 addEventListener 更方便。

关于javascript - addEventListener (经典 dom svg-elment) 和 .on (at d3js) 之间的区别在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60414831/

相关文章:

javascript - 动画在 Chrome 中很流畅,但在 Firefox 中则不然

javascript - D3.js - 来自平面 JSON 层次结构的 TreeMap

Javascript promise then 在一个类中

javascript - iPhone 悬停时的灰色区域

javascript - D3 world-50m.json 投影填充错误

javascript - 添加新元素后事件监听器不起作用

event-handling - Angular 2 基类输出 EventEmitter 不会被引发或处理

javascript - AngularJS 处理表单上的表单单击

javascript - react 脚本和 jest 版本 24.7.1 之间的冲突

JavaFX - TextArea,如何仅在双击时激活文本区域?