d3事件(二):事件的觸發與自定義事件
阿新 • • 發佈:2019-02-01
在第4版中,d3新增了事件的觸發函式dispatch,類似於jquery的trigger函式,用於觸發dom元素的事件處理函式。並且,d3的選擇集合還可以註冊任意名稱的事件與相關的事件處理函式,即自定義事件。
假定頁面中還存在文章”d3事件(一):事件的註冊與名稱空間”的相關元素,基於此我們進行如下操作。
d3.selectAll('button')
// d代表繫結的資料,i代表元素在集合中的位置,group代表相關的元素集合
.on('hello', function(d, i, group) {
// 獲取事件物件
var event = d3.event,
output = 'Hello,' + d.username;
// 從event裡取出攜帶的資料
if(event.detail && event.detail.suffix) {
output += event.detail.suffix
}
// 進行名稱的處理
alert(output);
})
因為hello不是html標準的事件型別,現在點選將無法觸發繫結的事件函式,這時則需要使用dispatch進行觸發。
// 觸發hello事件函式
d3.selectAll('button').dispatch('hello', {
// 攜帶的資料會自動裝入到d3.event物件中
detail : {
suffix : '!'
}
});
// 將會輸出"Hello,yiifaa!"字樣
dispatch能非常快捷地激發函式,並且能保留當前元素的上下文,如果需要更個性化、更強大的觸發函式,則需要使用customEvent。看customEvent這個名稱感覺像是定義個性化事件,然而它卻是用於事件的觸發,可以控制上下文、傳遞的資料以及對d3事件的包裝。
d3.customEvent(
// 替換d3.event,如果在html的標準事件裡出發,如點選事件,還會將d3.event作為此物件的sourceEvent插入
{
detail : {
prefix : '你好,'
}
},
// 替換處理函式
function(params) {
var ev = d3.event;
// 還可以獲取ev.sourceEvent,它指向之前發生的UI事件
alert(ev.detail.prefix + this.datum().username +params.suffix);
},
// 替換處理函式的下上文,即處理函式的this
d3.selectAll('button'),
// 處理函式的引數列表
[{
suffix : '!'
}]
);
// 現在輸出的結果為"你好,yiifaa!"