16

我正在 d3 中编写一个项目,其中我有一个包含两个外部 javascript 文件的 html 页面,比如script_1.jsscript_2.js
我需要从 script_1.js 注册一个事件侦听器,从 script_2.js 注册另一个事件侦听器,用于选择元素上的更改事件。目前我的 html 中有这一行:

<select id="timebasis" class="selector" onchange="selectIndexSp(this),selectIndexBt(this)">

其中selectIndexSp(object)selectIndexBt(object)分别在 script_1.js 和 script_2.js 中定义。我根本不喜欢这种方法,我想知道如何在 d3 而不是在 html 文件中执行相同的任务,我知道这不是一个好习惯。

提前致谢!

4

1 回答 1

38

您可以将命名空间添加到事件名称,例如:

d3.select("#timebasis")
    .on("change.sp", listenersp)
    .on("change.bt", listenerbt);

见:https ://github.com/mbostock/d3/wiki/Selections#wiki-on

如果已在选定元素上为相同类型注册了事件侦听器,则在添加新侦听器之前删除现有侦听器。要为同一事件类型注册多个侦听器,该类型后面可以跟一个可选的命名空间,例如“click.foo”和“click.bar”。要删除侦听器,请将 null 作为侦听器传递。

这些函数被传递当前的 datumd和 index ithis上下文作为当前的 DOM 元素。看起来您的两个函数期望 DOM 元素作为参数?在这种情况下,它看起来像:

d3.select("#timebasis")
    .on("change.sp", function() { selectIndexSp(this); })
    .on("change.bt", function() { selectIndexBt(this); });
于 2013-02-07T14:37:54.703 回答